diff --git a/BUILD b/BUILD
index e89fae1a802..ea9e79d5832 100644
--- a/BUILD
+++ b/BUILD
@@ -2270,28 +2270,94 @@ grpc_cc_library(
],
)
+grpc_cc_library(
+ name = "iomgr_ee_time_averaged_stats",
+ srcs = ["src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc"],
+ hdrs = [
+ "src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h",
+ ],
+ tags = ["grpc-autodeps"],
+ deps = ["gpr_base"],
+)
+
+grpc_cc_library(
+ name = "iomgr_ee_timer",
+ srcs = [
+ "src/core/lib/event_engine/iomgr_engine/timer.cc",
+ "src/core/lib/event_engine/iomgr_engine/timer_heap.cc",
+ ],
+ hdrs = [
+ "src/core/lib/event_engine/iomgr_engine/timer.h",
+ "src/core/lib/event_engine/iomgr_engine/timer_heap.h",
+ ],
+ external_deps = [
+ "absl/base:core_headers",
+ "absl/types:optional",
+ ],
+ tags = ["grpc-autodeps"],
+ deps = [
+ "event_engine_base_hdrs",
+ "gpr_base",
+ "iomgr_ee_time_averaged_stats",
+ "time",
+ "useful",
+ ],
+)
+
+grpc_cc_library(
+ name = "iomgr_ee_thread_pool",
+ srcs = ["src/core/lib/event_engine/iomgr_engine/thread_pool.cc"],
+ hdrs = [
+ "src/core/lib/event_engine/iomgr_engine/thread_pool.h",
+ ],
+ tags = ["grpc-autodeps"],
+ deps = ["gpr_base"],
+)
+
+grpc_cc_library(
+ name = "iomgr_ee_timer_manager",
+ srcs = ["src/core/lib/event_engine/iomgr_engine/timer_manager.cc"],
+ hdrs = [
+ "src/core/lib/event_engine/iomgr_engine/timer_manager.h",
+ ],
+ external_deps = [
+ "absl/base:core_headers",
+ "absl/memory",
+ "absl/time",
+ "absl/types:optional",
+ ],
+ tags = ["grpc-autodeps"],
+ deps = [
+ "event_engine_base_hdrs",
+ "gpr_base",
+ "gpr_codegen",
+ "iomgr_ee_timer",
+ "time",
+ ],
+)
+
grpc_cc_library(
name = "iomgr_event_engine",
- srcs = ["src/core/lib/event_engine/iomgr_engine.cc"],
- hdrs = ["src/core/lib/event_engine/iomgr_engine.h"],
+ srcs = ["src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc"],
+ hdrs = ["src/core/lib/event_engine/iomgr_engine/iomgr_engine.h"],
external_deps = [
- "absl/cleanup",
+ "absl/base:core_headers",
"absl/container:flat_hash_set",
- "absl/time",
+ "absl/status",
+ "absl/status:statusor",
"absl/strings",
],
+ tags = ["grpc-autodeps"],
deps = [
- "closure",
- "error",
"event_engine_base_hdrs",
"event_engine_common",
"event_engine_trace",
- "exec_ctx",
"gpr_base",
"gpr_platform",
"grpc_trace",
- "iomgr_timer",
- "match",
+ "iomgr_ee_thread_pool",
+ "iomgr_ee_timer",
+ "iomgr_ee_timer_manager",
"time",
],
)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index dedbe0981e5..4cae41aca9c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -110,8 +110,6 @@ set(gRPC_ABSL_USED_TARGETS
absl_bits
absl_city
absl_civil_time
- absl_cleanup
- absl_cleanup_internal
absl_compressed_tuple
absl_config
absl_container_common
@@ -919,11 +917,11 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_c tcp_server_posix_test)
endif()
add_dependencies(buildtests_c test_core_gpr_time_test)
+ add_dependencies(buildtests_c test_core_iomgr_time_averaged_stats_test)
+ add_dependencies(buildtests_c test_core_iomgr_timer_heap_test)
+ add_dependencies(buildtests_c test_core_iomgr_timer_list_test)
add_dependencies(buildtests_c thd_test)
add_dependencies(buildtests_c threadpool_test)
- add_dependencies(buildtests_c time_averaged_stats_test)
- add_dependencies(buildtests_c timer_heap_test)
- add_dependencies(buildtests_c timer_list_test)
add_dependencies(buildtests_c transport_security_common_api_test)
add_dependencies(buildtests_c transport_security_test)
add_dependencies(buildtests_c varint_test)
@@ -1169,6 +1167,9 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx string_ref_test)
add_dependencies(buildtests_cxx system_roots_test)
add_dependencies(buildtests_cxx table_test)
+ add_dependencies(buildtests_cxx test_core_event_engine_iomgr_event_engine_time_averaged_stats_test)
+ add_dependencies(buildtests_cxx test_core_event_engine_iomgr_event_engine_timer_heap_test)
+ add_dependencies(buildtests_cxx test_core_event_engine_iomgr_event_engine_timer_list_test)
add_dependencies(buildtests_cxx test_core_event_engine_slice_buffer_test)
add_dependencies(buildtests_cxx test_core_gprpp_time_test)
add_dependencies(buildtests_cxx test_core_security_credentials_test)
@@ -2059,7 +2060,12 @@ add_library(grpc
src/core/lib/event_engine/channel_args_endpoint_config.cc
src/core/lib/event_engine/default_event_engine_factory.cc
src/core/lib/event_engine/event_engine.cc
- src/core/lib/event_engine/iomgr_engine.cc
+ src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc
+ src/core/lib/event_engine/iomgr_engine/thread_pool.cc
+ src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc
+ src/core/lib/event_engine/iomgr_engine/timer.cc
+ src/core/lib/event_engine/iomgr_engine/timer_heap.cc
+ src/core/lib/event_engine/iomgr_engine/timer_manager.cc
src/core/lib/event_engine/memory_allocator.cc
src/core/lib/event_engine/resolved_address.cc
src/core/lib/event_engine/slice.cc
@@ -2338,7 +2344,6 @@ target_link_libraries(grpc
${_gRPC_RE2_LIBRARIES}
${_gRPC_UPB_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
- absl::cleanup
absl::flat_hash_map
absl::flat_hash_set
absl::inlined_vector
@@ -2687,7 +2692,12 @@ add_library(grpc_unsecure
src/core/lib/event_engine/channel_args_endpoint_config.cc
src/core/lib/event_engine/default_event_engine_factory.cc
src/core/lib/event_engine/event_engine.cc
- src/core/lib/event_engine/iomgr_engine.cc
+ src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc
+ src/core/lib/event_engine/iomgr_engine/thread_pool.cc
+ src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc
+ src/core/lib/event_engine/iomgr_engine/timer.cc
+ src/core/lib/event_engine/iomgr_engine/timer_heap.cc
+ src/core/lib/event_engine/iomgr_engine/timer_manager.cc
src/core/lib/event_engine/memory_allocator.cc
src/core/lib/event_engine/resolved_address.cc
src/core/lib/event_engine/slice.cc
@@ -2902,7 +2912,6 @@ target_link_libraries(grpc_unsecure
${_gRPC_RE2_LIBRARIES}
${_gRPC_UPB_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
- absl::cleanup
absl::flat_hash_map
absl::flat_hash_set
absl::inlined_vector
@@ -7106,11 +7115,11 @@ target_link_libraries(test_core_gpr_time_test
endif()
if(gRPC_BUILD_TESTS)
-add_executable(thd_test
- test/core/gprpp/thd_test.cc
+add_executable(test_core_iomgr_time_averaged_stats_test
+ test/core/iomgr/time_averaged_stats_test.cc
)
-target_include_directories(thd_test
+target_include_directories(test_core_iomgr_time_averaged_stats_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -7124,7 +7133,7 @@ target_include_directories(thd_test
${_gRPC_ZLIB_INCLUDE_DIR}
)
-target_link_libraries(thd_test
+target_link_libraries(test_core_iomgr_time_averaged_stats_test
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
)
@@ -7133,11 +7142,11 @@ target_link_libraries(thd_test
endif()
if(gRPC_BUILD_TESTS)
-add_executable(threadpool_test
- test/core/iomgr/threadpool_test.cc
+add_executable(test_core_iomgr_timer_heap_test
+ test/core/iomgr/timer_heap_test.cc
)
-target_include_directories(threadpool_test
+target_include_directories(test_core_iomgr_timer_heap_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -7151,7 +7160,7 @@ target_include_directories(threadpool_test
${_gRPC_ZLIB_INCLUDE_DIR}
)
-target_link_libraries(threadpool_test
+target_link_libraries(test_core_iomgr_timer_heap_test
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
)
@@ -7160,11 +7169,11 @@ target_link_libraries(threadpool_test
endif()
if(gRPC_BUILD_TESTS)
-add_executable(time_averaged_stats_test
- test/core/iomgr/time_averaged_stats_test.cc
+add_executable(test_core_iomgr_timer_list_test
+ test/core/iomgr/timer_list_test.cc
)
-target_include_directories(time_averaged_stats_test
+target_include_directories(test_core_iomgr_timer_list_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -7178,7 +7187,7 @@ target_include_directories(time_averaged_stats_test
${_gRPC_ZLIB_INCLUDE_DIR}
)
-target_link_libraries(time_averaged_stats_test
+target_link_libraries(test_core_iomgr_timer_list_test
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
)
@@ -7187,11 +7196,11 @@ target_link_libraries(time_averaged_stats_test
endif()
if(gRPC_BUILD_TESTS)
-add_executable(timer_heap_test
- test/core/iomgr/timer_heap_test.cc
+add_executable(thd_test
+ test/core/gprpp/thd_test.cc
)
-target_include_directories(timer_heap_test
+target_include_directories(thd_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -7205,7 +7214,7 @@ target_include_directories(timer_heap_test
${_gRPC_ZLIB_INCLUDE_DIR}
)
-target_link_libraries(timer_heap_test
+target_link_libraries(thd_test
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
)
@@ -7214,11 +7223,11 @@ target_link_libraries(timer_heap_test
endif()
if(gRPC_BUILD_TESTS)
-add_executable(timer_list_test
- test/core/iomgr/timer_list_test.cc
+add_executable(threadpool_test
+ test/core/iomgr/threadpool_test.cc
)
-target_include_directories(timer_list_test
+target_include_directories(threadpool_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -7232,7 +7241,7 @@ target_include_directories(timer_list_test
${_gRPC_ZLIB_INCLUDE_DIR}
)
-target_link_libraries(timer_list_test
+target_link_libraries(threadpool_test
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
)
@@ -16269,6 +16278,281 @@ target_link_libraries(table_test
)
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(test_core_event_engine_iomgr_event_engine_time_averaged_stats_test
+ src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc
+ src/core/lib/gpr/alloc.cc
+ src/core/lib/gpr/atm.cc
+ src/core/lib/gpr/cpu_iphone.cc
+ src/core/lib/gpr/cpu_linux.cc
+ src/core/lib/gpr/cpu_posix.cc
+ src/core/lib/gpr/cpu_windows.cc
+ src/core/lib/gpr/env_linux.cc
+ src/core/lib/gpr/env_posix.cc
+ src/core/lib/gpr/env_windows.cc
+ src/core/lib/gpr/log.cc
+ src/core/lib/gpr/log_android.cc
+ src/core/lib/gpr/log_linux.cc
+ src/core/lib/gpr/log_posix.cc
+ src/core/lib/gpr/log_windows.cc
+ src/core/lib/gpr/murmur_hash.cc
+ src/core/lib/gpr/string.cc
+ src/core/lib/gpr/string_posix.cc
+ src/core/lib/gpr/string_util_windows.cc
+ src/core/lib/gpr/string_windows.cc
+ src/core/lib/gpr/sync.cc
+ src/core/lib/gpr/sync_abseil.cc
+ src/core/lib/gpr/sync_posix.cc
+ src/core/lib/gpr/sync_windows.cc
+ src/core/lib/gpr/time.cc
+ src/core/lib/gpr/time_posix.cc
+ src/core/lib/gpr/time_precise.cc
+ src/core/lib/gpr/time_windows.cc
+ src/core/lib/gpr/tmpfile_msys.cc
+ src/core/lib/gpr/tmpfile_posix.cc
+ src/core/lib/gpr/tmpfile_windows.cc
+ src/core/lib/gpr/wrap_memcpy.cc
+ src/core/lib/gprpp/examine_stack.cc
+ src/core/lib/gprpp/fork.cc
+ src/core/lib/gprpp/global_config_env.cc
+ src/core/lib/gprpp/host_port.cc
+ src/core/lib/gprpp/mpscq.cc
+ src/core/lib/gprpp/stat_posix.cc
+ src/core/lib/gprpp/stat_windows.cc
+ src/core/lib/gprpp/thd_posix.cc
+ src/core/lib/gprpp/thd_windows.cc
+ src/core/lib/gprpp/time_util.cc
+ src/core/lib/profiling/basic_timers.cc
+ src/core/lib/profiling/stap_timers.cc
+ test/core/event_engine/iomgr_event_engine/time_averaged_stats_test.cc
+ third_party/googletest/googletest/src/gtest-all.cc
+ third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(test_core_event_engine_iomgr_event_engine_time_averaged_stats_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_XXHASH_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(test_core_event_engine_iomgr_event_engine_time_averaged_stats_test
+ ${_gRPC_PROTOBUF_LIBRARIES}
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+ absl::base
+ absl::core_headers
+ absl::memory
+ absl::random_random
+ absl::status
+ absl::cord
+ absl::str_format
+ absl::strings
+ absl::synchronization
+ absl::time
+ absl::optional
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(test_core_event_engine_iomgr_event_engine_timer_heap_test
+ src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc
+ src/core/lib/event_engine/iomgr_engine/timer.cc
+ src/core/lib/event_engine/iomgr_engine/timer_heap.cc
+ src/core/lib/gpr/alloc.cc
+ src/core/lib/gpr/atm.cc
+ src/core/lib/gpr/cpu_iphone.cc
+ src/core/lib/gpr/cpu_linux.cc
+ src/core/lib/gpr/cpu_posix.cc
+ src/core/lib/gpr/cpu_windows.cc
+ src/core/lib/gpr/env_linux.cc
+ src/core/lib/gpr/env_posix.cc
+ src/core/lib/gpr/env_windows.cc
+ src/core/lib/gpr/log.cc
+ src/core/lib/gpr/log_android.cc
+ src/core/lib/gpr/log_linux.cc
+ src/core/lib/gpr/log_posix.cc
+ src/core/lib/gpr/log_windows.cc
+ src/core/lib/gpr/murmur_hash.cc
+ src/core/lib/gpr/string.cc
+ src/core/lib/gpr/string_posix.cc
+ src/core/lib/gpr/string_util_windows.cc
+ src/core/lib/gpr/string_windows.cc
+ src/core/lib/gpr/sync.cc
+ src/core/lib/gpr/sync_abseil.cc
+ src/core/lib/gpr/sync_posix.cc
+ src/core/lib/gpr/sync_windows.cc
+ src/core/lib/gpr/time.cc
+ src/core/lib/gpr/time_posix.cc
+ src/core/lib/gpr/time_precise.cc
+ src/core/lib/gpr/time_windows.cc
+ src/core/lib/gpr/tmpfile_msys.cc
+ src/core/lib/gpr/tmpfile_posix.cc
+ src/core/lib/gpr/tmpfile_windows.cc
+ src/core/lib/gpr/wrap_memcpy.cc
+ src/core/lib/gprpp/examine_stack.cc
+ src/core/lib/gprpp/fork.cc
+ src/core/lib/gprpp/global_config_env.cc
+ src/core/lib/gprpp/host_port.cc
+ src/core/lib/gprpp/mpscq.cc
+ src/core/lib/gprpp/stat_posix.cc
+ src/core/lib/gprpp/stat_windows.cc
+ src/core/lib/gprpp/thd_posix.cc
+ src/core/lib/gprpp/thd_windows.cc
+ src/core/lib/gprpp/time.cc
+ src/core/lib/gprpp/time_util.cc
+ src/core/lib/profiling/basic_timers.cc
+ src/core/lib/profiling/stap_timers.cc
+ test/core/event_engine/iomgr_event_engine/timer_heap_test.cc
+ third_party/googletest/googletest/src/gtest-all.cc
+ third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(test_core_event_engine_iomgr_event_engine_timer_heap_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_XXHASH_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(test_core_event_engine_iomgr_event_engine_timer_heap_test
+ ${_gRPC_PROTOBUF_LIBRARIES}
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+ absl::base
+ absl::core_headers
+ absl::memory
+ absl::random_random
+ absl::status
+ absl::statusor
+ absl::cord
+ absl::str_format
+ absl::strings
+ absl::synchronization
+ absl::time
+ absl::optional
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(test_core_event_engine_iomgr_event_engine_timer_list_test
+ src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc
+ src/core/lib/event_engine/iomgr_engine/timer.cc
+ src/core/lib/event_engine/iomgr_engine/timer_heap.cc
+ src/core/lib/gpr/alloc.cc
+ src/core/lib/gpr/atm.cc
+ src/core/lib/gpr/cpu_iphone.cc
+ src/core/lib/gpr/cpu_linux.cc
+ src/core/lib/gpr/cpu_posix.cc
+ src/core/lib/gpr/cpu_windows.cc
+ src/core/lib/gpr/env_linux.cc
+ src/core/lib/gpr/env_posix.cc
+ src/core/lib/gpr/env_windows.cc
+ src/core/lib/gpr/log.cc
+ src/core/lib/gpr/log_android.cc
+ src/core/lib/gpr/log_linux.cc
+ src/core/lib/gpr/log_posix.cc
+ src/core/lib/gpr/log_windows.cc
+ src/core/lib/gpr/murmur_hash.cc
+ src/core/lib/gpr/string.cc
+ src/core/lib/gpr/string_posix.cc
+ src/core/lib/gpr/string_util_windows.cc
+ src/core/lib/gpr/string_windows.cc
+ src/core/lib/gpr/sync.cc
+ src/core/lib/gpr/sync_abseil.cc
+ src/core/lib/gpr/sync_posix.cc
+ src/core/lib/gpr/sync_windows.cc
+ src/core/lib/gpr/time.cc
+ src/core/lib/gpr/time_posix.cc
+ src/core/lib/gpr/time_precise.cc
+ src/core/lib/gpr/time_windows.cc
+ src/core/lib/gpr/tmpfile_msys.cc
+ src/core/lib/gpr/tmpfile_posix.cc
+ src/core/lib/gpr/tmpfile_windows.cc
+ src/core/lib/gpr/wrap_memcpy.cc
+ src/core/lib/gprpp/examine_stack.cc
+ src/core/lib/gprpp/fork.cc
+ src/core/lib/gprpp/global_config_env.cc
+ src/core/lib/gprpp/host_port.cc
+ src/core/lib/gprpp/mpscq.cc
+ src/core/lib/gprpp/stat_posix.cc
+ src/core/lib/gprpp/stat_windows.cc
+ src/core/lib/gprpp/thd_posix.cc
+ src/core/lib/gprpp/thd_windows.cc
+ src/core/lib/gprpp/time.cc
+ src/core/lib/gprpp/time_util.cc
+ src/core/lib/profiling/basic_timers.cc
+ src/core/lib/profiling/stap_timers.cc
+ test/core/event_engine/iomgr_event_engine/timer_list_test.cc
+ third_party/googletest/googletest/src/gtest-all.cc
+ third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(test_core_event_engine_iomgr_event_engine_timer_list_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_XXHASH_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(test_core_event_engine_iomgr_event_engine_timer_list_test
+ ${_gRPC_PROTOBUF_LIBRARIES}
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+ absl::base
+ absl::core_headers
+ absl::memory
+ absl::random_random
+ absl::status
+ absl::statusor
+ absl::cord
+ absl::str_format
+ absl::strings
+ absl::synchronization
+ absl::time
+ absl::optional
+)
+
+
endif()
if(gRPC_BUILD_TESTS)
@@ -20120,7 +20404,7 @@ generate_pkgconfig(
"gRPC"
"high performance general RPC framework"
"${gRPC_CORE_VERSION}"
- "gpr openssl absl_base absl_bind_front absl_cleanup absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant"
+ "gpr openssl absl_base absl_bind_front absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant"
"-lgrpc -laddress_sorting -lre2 -lupb -lcares -lz"
""
"grpc.pc")
@@ -20130,7 +20414,7 @@ generate_pkgconfig(
"gRPC unsecure"
"high performance general RPC framework without SSL"
"${gRPC_CORE_VERSION}"
- "gpr absl_base absl_bind_front absl_cleanup absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant"
+ "gpr absl_base absl_bind_front absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant"
"-lgrpc_unsecure"
""
"grpc_unsecure.pc")
@@ -20140,7 +20424,7 @@ generate_pkgconfig(
"gRPC++"
"C++ wrapper for gRPC"
"${gRPC_CPP_VERSION}"
- "grpc absl_base absl_bind_front absl_cleanup absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant"
+ "grpc absl_base absl_bind_front absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant"
"-lgrpc++"
""
"grpc++.pc")
@@ -20150,7 +20434,7 @@ generate_pkgconfig(
"gRPC++ unsecure"
"C++ wrapper for gRPC without SSL"
"${gRPC_CPP_VERSION}"
- "grpc_unsecure absl_base absl_bind_front absl_cleanup absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant"
+ "grpc_unsecure absl_base absl_bind_front absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant"
"-lgrpc++_unsecure"
""
"grpc++_unsecure.pc")
diff --git a/Makefile b/Makefile
index bee072568cf..bcd125b3b81 100644
--- a/Makefile
+++ b/Makefile
@@ -1440,7 +1440,12 @@ LIBGRPC_SRC = \
src/core/lib/event_engine/channel_args_endpoint_config.cc \
src/core/lib/event_engine/default_event_engine_factory.cc \
src/core/lib/event_engine/event_engine.cc \
- src/core/lib/event_engine/iomgr_engine.cc \
+ src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc \
+ src/core/lib/event_engine/iomgr_engine/thread_pool.cc \
+ src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc \
+ src/core/lib/event_engine/iomgr_engine/timer.cc \
+ src/core/lib/event_engine/iomgr_engine/timer_heap.cc \
+ src/core/lib/event_engine/iomgr_engine/timer_manager.cc \
src/core/lib/event_engine/memory_allocator.cc \
src/core/lib/event_engine/resolved_address.cc \
src/core/lib/event_engine/slice.cc \
@@ -1908,7 +1913,12 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/event_engine/channel_args_endpoint_config.cc \
src/core/lib/event_engine/default_event_engine_factory.cc \
src/core/lib/event_engine/event_engine.cc \
- src/core/lib/event_engine/iomgr_engine.cc \
+ src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc \
+ src/core/lib/event_engine/iomgr_engine/thread_pool.cc \
+ src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc \
+ src/core/lib/event_engine/iomgr_engine/timer.cc \
+ src/core/lib/event_engine/iomgr_engine/timer_heap.cc \
+ src/core/lib/event_engine/iomgr_engine/timer_manager.cc \
src/core/lib/event_engine/memory_allocator.cc \
src/core/lib/event_engine/resolved_address.cc \
src/core/lib/event_engine/slice.cc \
diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml
index 1c6fb7a829c..bff9710aa60 100644
--- a/build_autogenerated.yaml
+++ b/build_autogenerated.yaml
@@ -744,7 +744,12 @@ libs:
- src/core/lib/event_engine/channel_args_endpoint_config.h
- src/core/lib/event_engine/event_engine_factory.h
- src/core/lib/event_engine/handle_containers.h
- - src/core/lib/event_engine/iomgr_engine.h
+ - src/core/lib/event_engine/iomgr_engine/iomgr_engine.h
+ - src/core/lib/event_engine/iomgr_engine/thread_pool.h
+ - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h
+ - src/core/lib/event_engine/iomgr_engine/timer.h
+ - src/core/lib/event_engine/iomgr_engine/timer_heap.h
+ - src/core/lib/event_engine/iomgr_engine/timer_manager.h
- src/core/lib/event_engine/trace.h
- src/core/lib/gprpp/atomic_utils.h
- src/core/lib/gprpp/bitset.h
@@ -1419,7 +1424,12 @@ libs:
- src/core/lib/event_engine/channel_args_endpoint_config.cc
- src/core/lib/event_engine/default_event_engine_factory.cc
- src/core/lib/event_engine/event_engine.cc
- - src/core/lib/event_engine/iomgr_engine.cc
+ - src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc
+ - src/core/lib/event_engine/iomgr_engine/thread_pool.cc
+ - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc
+ - src/core/lib/event_engine/iomgr_engine/timer.cc
+ - src/core/lib/event_engine/iomgr_engine/timer_heap.cc
+ - src/core/lib/event_engine/iomgr_engine/timer_manager.cc
- src/core/lib/event_engine/memory_allocator.cc
- src/core/lib/event_engine/resolved_address.cc
- src/core/lib/event_engine/slice.cc
@@ -1660,7 +1670,6 @@ libs:
- src/core/tsi/transport_security.cc
- src/core/tsi/transport_security_grpc.cc
deps:
- - absl/cleanup:cleanup
- absl/container:flat_hash_map
- absl/container:flat_hash_set
- absl/container:inlined_vector
@@ -1954,7 +1963,12 @@ libs:
- src/core/lib/event_engine/channel_args_endpoint_config.h
- src/core/lib/event_engine/event_engine_factory.h
- src/core/lib/event_engine/handle_containers.h
- - src/core/lib/event_engine/iomgr_engine.h
+ - src/core/lib/event_engine/iomgr_engine/iomgr_engine.h
+ - src/core/lib/event_engine/iomgr_engine/thread_pool.h
+ - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h
+ - src/core/lib/event_engine/iomgr_engine/timer.h
+ - src/core/lib/event_engine/iomgr_engine/timer_heap.h
+ - src/core/lib/event_engine/iomgr_engine/timer_manager.h
- src/core/lib/event_engine/trace.h
- src/core/lib/gprpp/atomic_utils.h
- src/core/lib/gprpp/bitset.h
@@ -2279,7 +2293,12 @@ libs:
- src/core/lib/event_engine/channel_args_endpoint_config.cc
- src/core/lib/event_engine/default_event_engine_factory.cc
- src/core/lib/event_engine/event_engine.cc
- - src/core/lib/event_engine/iomgr_engine.cc
+ - src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc
+ - src/core/lib/event_engine/iomgr_engine/thread_pool.cc
+ - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc
+ - src/core/lib/event_engine/iomgr_engine/timer.cc
+ - src/core/lib/event_engine/iomgr_engine/timer_heap.cc
+ - src/core/lib/event_engine/iomgr_engine/timer_manager.cc
- src/core/lib/event_engine/memory_allocator.cc
- src/core/lib/event_engine/resolved_address.cc
- src/core/lib/event_engine/slice.cc
@@ -2456,7 +2475,6 @@ libs:
- src/core/tsi/transport_security.cc
- src/core/tsi/transport_security_grpc.cc
deps:
- - absl/cleanup:cleanup
- absl/container:flat_hash_map
- absl/container:flat_hash_set
- absl/container:inlined_vector
@@ -4269,48 +4287,48 @@ targets:
deps:
- grpc_test_util
uses_polling: false
-- name: thd_test
+- name: test_core_iomgr_time_averaged_stats_test
build: test
language: c
headers: []
src:
- - test/core/gprpp/thd_test.cc
+ - test/core/iomgr/time_averaged_stats_test.cc
deps:
- grpc_test_util
uses_polling: false
-- name: threadpool_test
+- name: test_core_iomgr_timer_heap_test
build: test
language: c
headers: []
src:
- - test/core/iomgr/threadpool_test.cc
+ - test/core/iomgr/timer_heap_test.cc
deps:
- grpc_test_util
uses_polling: false
-- name: time_averaged_stats_test
+- name: test_core_iomgr_timer_list_test
build: test
language: c
headers: []
src:
- - test/core/iomgr/time_averaged_stats_test.cc
+ - test/core/iomgr/timer_list_test.cc
deps:
- grpc_test_util
uses_polling: false
-- name: timer_heap_test
+- name: thd_test
build: test
language: c
headers: []
src:
- - test/core/iomgr/timer_heap_test.cc
+ - test/core/gprpp/thd_test.cc
deps:
- grpc_test_util
uses_polling: false
-- name: timer_list_test
+- name: threadpool_test
build: test
language: c
headers: []
src:
- - test/core/iomgr/timer_list_test.cc
+ - test/core/iomgr/threadpool_test.cc
deps:
- grpc_test_util
uses_polling: false
@@ -8159,6 +8177,297 @@ targets:
- absl/types:optional
- absl/utility:utility
uses_polling: false
+- name: test_core_event_engine_iomgr_event_engine_time_averaged_stats_test
+ gtest: true
+ build: test
+ language: c++
+ headers:
+ - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h
+ - src/core/lib/gpr/alloc.h
+ - src/core/lib/gpr/env.h
+ - src/core/lib/gpr/murmur_hash.h
+ - src/core/lib/gpr/spinlock.h
+ - src/core/lib/gpr/string.h
+ - src/core/lib/gpr/string_windows.h
+ - src/core/lib/gpr/time_precise.h
+ - src/core/lib/gpr/tls.h
+ - src/core/lib/gpr/tmpfile.h
+ - src/core/lib/gpr/useful.h
+ - src/core/lib/gprpp/construct_destruct.h
+ - src/core/lib/gprpp/debug_location.h
+ - src/core/lib/gprpp/examine_stack.h
+ - src/core/lib/gprpp/fork.h
+ - src/core/lib/gprpp/global_config.h
+ - src/core/lib/gprpp/global_config_custom.h
+ - src/core/lib/gprpp/global_config_env.h
+ - src/core/lib/gprpp/global_config_generic.h
+ - src/core/lib/gprpp/host_port.h
+ - src/core/lib/gprpp/manual_constructor.h
+ - src/core/lib/gprpp/memory.h
+ - src/core/lib/gprpp/mpscq.h
+ - src/core/lib/gprpp/stat.h
+ - src/core/lib/gprpp/sync.h
+ - src/core/lib/gprpp/thd.h
+ - src/core/lib/gprpp/time_util.h
+ - src/core/lib/profiling/timers.h
+ src:
+ - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc
+ - src/core/lib/gpr/alloc.cc
+ - src/core/lib/gpr/atm.cc
+ - src/core/lib/gpr/cpu_iphone.cc
+ - src/core/lib/gpr/cpu_linux.cc
+ - src/core/lib/gpr/cpu_posix.cc
+ - src/core/lib/gpr/cpu_windows.cc
+ - src/core/lib/gpr/env_linux.cc
+ - src/core/lib/gpr/env_posix.cc
+ - src/core/lib/gpr/env_windows.cc
+ - src/core/lib/gpr/log.cc
+ - src/core/lib/gpr/log_android.cc
+ - src/core/lib/gpr/log_linux.cc
+ - src/core/lib/gpr/log_posix.cc
+ - src/core/lib/gpr/log_windows.cc
+ - src/core/lib/gpr/murmur_hash.cc
+ - src/core/lib/gpr/string.cc
+ - src/core/lib/gpr/string_posix.cc
+ - src/core/lib/gpr/string_util_windows.cc
+ - src/core/lib/gpr/string_windows.cc
+ - src/core/lib/gpr/sync.cc
+ - src/core/lib/gpr/sync_abseil.cc
+ - src/core/lib/gpr/sync_posix.cc
+ - src/core/lib/gpr/sync_windows.cc
+ - src/core/lib/gpr/time.cc
+ - src/core/lib/gpr/time_posix.cc
+ - src/core/lib/gpr/time_precise.cc
+ - src/core/lib/gpr/time_windows.cc
+ - src/core/lib/gpr/tmpfile_msys.cc
+ - src/core/lib/gpr/tmpfile_posix.cc
+ - src/core/lib/gpr/tmpfile_windows.cc
+ - src/core/lib/gpr/wrap_memcpy.cc
+ - src/core/lib/gprpp/examine_stack.cc
+ - src/core/lib/gprpp/fork.cc
+ - src/core/lib/gprpp/global_config_env.cc
+ - src/core/lib/gprpp/host_port.cc
+ - src/core/lib/gprpp/mpscq.cc
+ - src/core/lib/gprpp/stat_posix.cc
+ - src/core/lib/gprpp/stat_windows.cc
+ - src/core/lib/gprpp/thd_posix.cc
+ - src/core/lib/gprpp/thd_windows.cc
+ - src/core/lib/gprpp/time_util.cc
+ - src/core/lib/profiling/basic_timers.cc
+ - src/core/lib/profiling/stap_timers.cc
+ - test/core/event_engine/iomgr_event_engine/time_averaged_stats_test.cc
+ deps:
+ - absl/base:base
+ - absl/base:core_headers
+ - absl/memory:memory
+ - absl/random:random
+ - absl/status:status
+ - absl/strings:cord
+ - absl/strings:str_format
+ - absl/strings:strings
+ - absl/synchronization:synchronization
+ - absl/time:time
+ - absl/types:optional
+ uses_polling: false
+- name: test_core_event_engine_iomgr_event_engine_timer_heap_test
+ gtest: true
+ build: test
+ language: c++
+ headers:
+ - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h
+ - src/core/lib/event_engine/iomgr_engine/timer.h
+ - src/core/lib/event_engine/iomgr_engine/timer_heap.h
+ - src/core/lib/gpr/alloc.h
+ - src/core/lib/gpr/env.h
+ - src/core/lib/gpr/murmur_hash.h
+ - src/core/lib/gpr/spinlock.h
+ - src/core/lib/gpr/string.h
+ - src/core/lib/gpr/string_windows.h
+ - src/core/lib/gpr/time_precise.h
+ - src/core/lib/gpr/tls.h
+ - src/core/lib/gpr/tmpfile.h
+ - src/core/lib/gpr/useful.h
+ - src/core/lib/gprpp/bitset.h
+ - src/core/lib/gprpp/construct_destruct.h
+ - src/core/lib/gprpp/debug_location.h
+ - src/core/lib/gprpp/examine_stack.h
+ - src/core/lib/gprpp/fork.h
+ - src/core/lib/gprpp/global_config.h
+ - src/core/lib/gprpp/global_config_custom.h
+ - src/core/lib/gprpp/global_config_env.h
+ - src/core/lib/gprpp/global_config_generic.h
+ - src/core/lib/gprpp/host_port.h
+ - src/core/lib/gprpp/manual_constructor.h
+ - src/core/lib/gprpp/memory.h
+ - src/core/lib/gprpp/mpscq.h
+ - src/core/lib/gprpp/stat.h
+ - src/core/lib/gprpp/sync.h
+ - src/core/lib/gprpp/thd.h
+ - src/core/lib/gprpp/time.h
+ - src/core/lib/gprpp/time_util.h
+ - src/core/lib/profiling/timers.h
+ src:
+ - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc
+ - src/core/lib/event_engine/iomgr_engine/timer.cc
+ - src/core/lib/event_engine/iomgr_engine/timer_heap.cc
+ - src/core/lib/gpr/alloc.cc
+ - src/core/lib/gpr/atm.cc
+ - src/core/lib/gpr/cpu_iphone.cc
+ - src/core/lib/gpr/cpu_linux.cc
+ - src/core/lib/gpr/cpu_posix.cc
+ - src/core/lib/gpr/cpu_windows.cc
+ - src/core/lib/gpr/env_linux.cc
+ - src/core/lib/gpr/env_posix.cc
+ - src/core/lib/gpr/env_windows.cc
+ - src/core/lib/gpr/log.cc
+ - src/core/lib/gpr/log_android.cc
+ - src/core/lib/gpr/log_linux.cc
+ - src/core/lib/gpr/log_posix.cc
+ - src/core/lib/gpr/log_windows.cc
+ - src/core/lib/gpr/murmur_hash.cc
+ - src/core/lib/gpr/string.cc
+ - src/core/lib/gpr/string_posix.cc
+ - src/core/lib/gpr/string_util_windows.cc
+ - src/core/lib/gpr/string_windows.cc
+ - src/core/lib/gpr/sync.cc
+ - src/core/lib/gpr/sync_abseil.cc
+ - src/core/lib/gpr/sync_posix.cc
+ - src/core/lib/gpr/sync_windows.cc
+ - src/core/lib/gpr/time.cc
+ - src/core/lib/gpr/time_posix.cc
+ - src/core/lib/gpr/time_precise.cc
+ - src/core/lib/gpr/time_windows.cc
+ - src/core/lib/gpr/tmpfile_msys.cc
+ - src/core/lib/gpr/tmpfile_posix.cc
+ - src/core/lib/gpr/tmpfile_windows.cc
+ - src/core/lib/gpr/wrap_memcpy.cc
+ - src/core/lib/gprpp/examine_stack.cc
+ - src/core/lib/gprpp/fork.cc
+ - src/core/lib/gprpp/global_config_env.cc
+ - src/core/lib/gprpp/host_port.cc
+ - src/core/lib/gprpp/mpscq.cc
+ - src/core/lib/gprpp/stat_posix.cc
+ - src/core/lib/gprpp/stat_windows.cc
+ - src/core/lib/gprpp/thd_posix.cc
+ - src/core/lib/gprpp/thd_windows.cc
+ - src/core/lib/gprpp/time.cc
+ - src/core/lib/gprpp/time_util.cc
+ - src/core/lib/profiling/basic_timers.cc
+ - src/core/lib/profiling/stap_timers.cc
+ - test/core/event_engine/iomgr_event_engine/timer_heap_test.cc
+ deps:
+ - absl/base:base
+ - absl/base:core_headers
+ - absl/memory:memory
+ - absl/random:random
+ - absl/status:status
+ - absl/status:statusor
+ - absl/strings:cord
+ - absl/strings:str_format
+ - absl/strings:strings
+ - absl/synchronization:synchronization
+ - absl/time:time
+ - absl/types:optional
+ uses_polling: false
+- name: test_core_event_engine_iomgr_event_engine_timer_list_test
+ gtest: true
+ build: test
+ language: c++
+ headers:
+ - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h
+ - src/core/lib/event_engine/iomgr_engine/timer.h
+ - src/core/lib/event_engine/iomgr_engine/timer_heap.h
+ - src/core/lib/gpr/alloc.h
+ - src/core/lib/gpr/env.h
+ - src/core/lib/gpr/murmur_hash.h
+ - src/core/lib/gpr/spinlock.h
+ - src/core/lib/gpr/string.h
+ - src/core/lib/gpr/string_windows.h
+ - src/core/lib/gpr/time_precise.h
+ - src/core/lib/gpr/tls.h
+ - src/core/lib/gpr/tmpfile.h
+ - src/core/lib/gpr/useful.h
+ - src/core/lib/gprpp/construct_destruct.h
+ - src/core/lib/gprpp/debug_location.h
+ - src/core/lib/gprpp/examine_stack.h
+ - src/core/lib/gprpp/fork.h
+ - src/core/lib/gprpp/global_config.h
+ - src/core/lib/gprpp/global_config_custom.h
+ - src/core/lib/gprpp/global_config_env.h
+ - src/core/lib/gprpp/global_config_generic.h
+ - src/core/lib/gprpp/host_port.h
+ - src/core/lib/gprpp/manual_constructor.h
+ - src/core/lib/gprpp/memory.h
+ - src/core/lib/gprpp/mpscq.h
+ - src/core/lib/gprpp/stat.h
+ - src/core/lib/gprpp/sync.h
+ - src/core/lib/gprpp/thd.h
+ - src/core/lib/gprpp/time.h
+ - src/core/lib/gprpp/time_util.h
+ - src/core/lib/profiling/timers.h
+ src:
+ - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc
+ - src/core/lib/event_engine/iomgr_engine/timer.cc
+ - src/core/lib/event_engine/iomgr_engine/timer_heap.cc
+ - src/core/lib/gpr/alloc.cc
+ - src/core/lib/gpr/atm.cc
+ - src/core/lib/gpr/cpu_iphone.cc
+ - src/core/lib/gpr/cpu_linux.cc
+ - src/core/lib/gpr/cpu_posix.cc
+ - src/core/lib/gpr/cpu_windows.cc
+ - src/core/lib/gpr/env_linux.cc
+ - src/core/lib/gpr/env_posix.cc
+ - src/core/lib/gpr/env_windows.cc
+ - src/core/lib/gpr/log.cc
+ - src/core/lib/gpr/log_android.cc
+ - src/core/lib/gpr/log_linux.cc
+ - src/core/lib/gpr/log_posix.cc
+ - src/core/lib/gpr/log_windows.cc
+ - src/core/lib/gpr/murmur_hash.cc
+ - src/core/lib/gpr/string.cc
+ - src/core/lib/gpr/string_posix.cc
+ - src/core/lib/gpr/string_util_windows.cc
+ - src/core/lib/gpr/string_windows.cc
+ - src/core/lib/gpr/sync.cc
+ - src/core/lib/gpr/sync_abseil.cc
+ - src/core/lib/gpr/sync_posix.cc
+ - src/core/lib/gpr/sync_windows.cc
+ - src/core/lib/gpr/time.cc
+ - src/core/lib/gpr/time_posix.cc
+ - src/core/lib/gpr/time_precise.cc
+ - src/core/lib/gpr/time_windows.cc
+ - src/core/lib/gpr/tmpfile_msys.cc
+ - src/core/lib/gpr/tmpfile_posix.cc
+ - src/core/lib/gpr/tmpfile_windows.cc
+ - src/core/lib/gpr/wrap_memcpy.cc
+ - src/core/lib/gprpp/examine_stack.cc
+ - src/core/lib/gprpp/fork.cc
+ - src/core/lib/gprpp/global_config_env.cc
+ - src/core/lib/gprpp/host_port.cc
+ - src/core/lib/gprpp/mpscq.cc
+ - src/core/lib/gprpp/stat_posix.cc
+ - src/core/lib/gprpp/stat_windows.cc
+ - src/core/lib/gprpp/thd_posix.cc
+ - src/core/lib/gprpp/thd_windows.cc
+ - src/core/lib/gprpp/time.cc
+ - src/core/lib/gprpp/time_util.cc
+ - src/core/lib/profiling/basic_timers.cc
+ - src/core/lib/profiling/stap_timers.cc
+ - test/core/event_engine/iomgr_event_engine/timer_list_test.cc
+ deps:
+ - absl/base:base
+ - absl/base:core_headers
+ - absl/memory:memory
+ - absl/random:random
+ - absl/status:status
+ - absl/status:statusor
+ - absl/strings:cord
+ - absl/strings:str_format
+ - absl/strings:strings
+ - absl/synchronization:synchronization
+ - absl/time:time
+ - absl/types:optional
+ uses_polling: false
- name: test_core_event_engine_slice_buffer_test
gtest: true
build: test
diff --git a/config.m4 b/config.m4
index 76345e70e78..9ed9418f2e0 100644
--- a/config.m4
+++ b/config.m4
@@ -465,7 +465,12 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/event_engine/channel_args_endpoint_config.cc \
src/core/lib/event_engine/default_event_engine_factory.cc \
src/core/lib/event_engine/event_engine.cc \
- src/core/lib/event_engine/iomgr_engine.cc \
+ src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc \
+ src/core/lib/event_engine/iomgr_engine/thread_pool.cc \
+ src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc \
+ src/core/lib/event_engine/iomgr_engine/timer.cc \
+ src/core/lib/event_engine/iomgr_engine/timer_heap.cc \
+ src/core/lib/event_engine/iomgr_engine/timer_manager.cc \
src/core/lib/event_engine/memory_allocator.cc \
src/core/lib/event_engine/resolved_address.cc \
src/core/lib/event_engine/slice.cc \
@@ -1302,6 +1307,7 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/config)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/debug)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/event_engine)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/event_engine/iomgr_engine)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/gpr)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/gprpp)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/http)
diff --git a/config.w32 b/config.w32
index b8f1dc4d887..7a6341f07b2 100644
--- a/config.w32
+++ b/config.w32
@@ -431,7 +431,12 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\event_engine\\channel_args_endpoint_config.cc " +
"src\\core\\lib\\event_engine\\default_event_engine_factory.cc " +
"src\\core\\lib\\event_engine\\event_engine.cc " +
- "src\\core\\lib\\event_engine\\iomgr_engine.cc " +
+ "src\\core\\lib\\event_engine\\iomgr_engine\\iomgr_engine.cc " +
+ "src\\core\\lib\\event_engine\\iomgr_engine\\thread_pool.cc " +
+ "src\\core\\lib\\event_engine\\iomgr_engine\\time_averaged_stats.cc " +
+ "src\\core\\lib\\event_engine\\iomgr_engine\\timer.cc " +
+ "src\\core\\lib\\event_engine\\iomgr_engine\\timer_heap.cc " +
+ "src\\core\\lib\\event_engine\\iomgr_engine\\timer_manager.cc " +
"src\\core\\lib\\event_engine\\memory_allocator.cc " +
"src\\core\\lib\\event_engine\\resolved_address.cc " +
"src\\core\\lib\\event_engine\\slice.cc " +
@@ -1424,6 +1429,7 @@ if (PHP_GRPC != "no") {
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\config");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\debug");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\event_engine");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\event_engine\\iomgr_engine");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\gpr");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\gprpp");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\http");
diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec
index 73ca24739b2..750ee7e77ed 100644
--- a/gRPC-C++.podspec
+++ b/gRPC-C++.podspec
@@ -198,7 +198,6 @@ Pod::Spec.new do |s|
abseil_version = '1.20211102.0'
ss.dependency 'abseil/base/base', abseil_version
ss.dependency 'abseil/base/core_headers', abseil_version
- ss.dependency 'abseil/cleanup/cleanup', abseil_version
ss.dependency 'abseil/container/flat_hash_map', abseil_version
ss.dependency 'abseil/container/flat_hash_set', abseil_version
ss.dependency 'abseil/container/inlined_vector', abseil_version
@@ -675,7 +674,12 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/channel_args_endpoint_config.h',
'src/core/lib/event_engine/event_engine_factory.h',
'src/core/lib/event_engine/handle_containers.h',
- 'src/core/lib/event_engine/iomgr_engine.h',
+ 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.h',
+ 'src/core/lib/event_engine/iomgr_engine/thread_pool.h',
+ 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h',
+ 'src/core/lib/event_engine/iomgr_engine/timer.h',
+ 'src/core/lib/event_engine/iomgr_engine/timer_heap.h',
+ 'src/core/lib/event_engine/iomgr_engine/timer_manager.h',
'src/core/lib/event_engine/trace.h',
'src/core/lib/gpr/alloc.h',
'src/core/lib/gpr/env.h',
@@ -1496,7 +1500,12 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/channel_args_endpoint_config.h',
'src/core/lib/event_engine/event_engine_factory.h',
'src/core/lib/event_engine/handle_containers.h',
- 'src/core/lib/event_engine/iomgr_engine.h',
+ 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.h',
+ 'src/core/lib/event_engine/iomgr_engine/thread_pool.h',
+ 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h',
+ 'src/core/lib/event_engine/iomgr_engine/timer.h',
+ 'src/core/lib/event_engine/iomgr_engine/timer_heap.h',
+ 'src/core/lib/event_engine/iomgr_engine/timer_manager.h',
'src/core/lib/event_engine/trace.h',
'src/core/lib/gpr/alloc.h',
'src/core/lib/gpr/env.h',
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index 8c3264b8d8f..95849b7938a 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -175,7 +175,6 @@ Pod::Spec.new do |s|
ss.dependency 'Libuv-gRPC', '0.0.10'
ss.dependency 'abseil/base/base', abseil_version
ss.dependency 'abseil/base/core_headers', abseil_version
- ss.dependency 'abseil/cleanup/cleanup', abseil_version
ss.dependency 'abseil/container/flat_hash_map', abseil_version
ss.dependency 'abseil/container/flat_hash_set', abseil_version
ss.dependency 'abseil/container/inlined_vector', abseil_version
@@ -1040,8 +1039,18 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/event_engine.cc',
'src/core/lib/event_engine/event_engine_factory.h',
'src/core/lib/event_engine/handle_containers.h',
- 'src/core/lib/event_engine/iomgr_engine.cc',
- 'src/core/lib/event_engine/iomgr_engine.h',
+ 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc',
+ 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.h',
+ 'src/core/lib/event_engine/iomgr_engine/thread_pool.cc',
+ 'src/core/lib/event_engine/iomgr_engine/thread_pool.h',
+ 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc',
+ 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h',
+ 'src/core/lib/event_engine/iomgr_engine/timer.cc',
+ 'src/core/lib/event_engine/iomgr_engine/timer.h',
+ 'src/core/lib/event_engine/iomgr_engine/timer_heap.cc',
+ 'src/core/lib/event_engine/iomgr_engine/timer_heap.h',
+ 'src/core/lib/event_engine/iomgr_engine/timer_manager.cc',
+ 'src/core/lib/event_engine/iomgr_engine/timer_manager.h',
'src/core/lib/event_engine/memory_allocator.cc',
'src/core/lib/event_engine/resolved_address.cc',
'src/core/lib/event_engine/slice.cc',
@@ -2098,7 +2107,12 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/channel_args_endpoint_config.h',
'src/core/lib/event_engine/event_engine_factory.h',
'src/core/lib/event_engine/handle_containers.h',
- 'src/core/lib/event_engine/iomgr_engine.h',
+ 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.h',
+ 'src/core/lib/event_engine/iomgr_engine/thread_pool.h',
+ 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h',
+ 'src/core/lib/event_engine/iomgr_engine/timer.h',
+ 'src/core/lib/event_engine/iomgr_engine/timer_heap.h',
+ 'src/core/lib/event_engine/iomgr_engine/timer_manager.h',
'src/core/lib/event_engine/trace.h',
'src/core/lib/gpr/alloc.h',
'src/core/lib/gpr/env.h',
diff --git a/grpc.gemspec b/grpc.gemspec
index 07028ed1399..5a57be48d7b 100644
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -953,8 +953,18 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/event_engine/event_engine.cc )
s.files += %w( src/core/lib/event_engine/event_engine_factory.h )
s.files += %w( src/core/lib/event_engine/handle_containers.h )
- s.files += %w( src/core/lib/event_engine/iomgr_engine.cc )
- s.files += %w( src/core/lib/event_engine/iomgr_engine.h )
+ s.files += %w( src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc )
+ s.files += %w( src/core/lib/event_engine/iomgr_engine/iomgr_engine.h )
+ s.files += %w( src/core/lib/event_engine/iomgr_engine/thread_pool.cc )
+ s.files += %w( src/core/lib/event_engine/iomgr_engine/thread_pool.h )
+ s.files += %w( src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc )
+ s.files += %w( src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h )
+ s.files += %w( src/core/lib/event_engine/iomgr_engine/timer.cc )
+ s.files += %w( src/core/lib/event_engine/iomgr_engine/timer.h )
+ s.files += %w( src/core/lib/event_engine/iomgr_engine/timer_heap.cc )
+ s.files += %w( src/core/lib/event_engine/iomgr_engine/timer_heap.h )
+ s.files += %w( src/core/lib/event_engine/iomgr_engine/timer_manager.cc )
+ s.files += %w( src/core/lib/event_engine/iomgr_engine/timer_manager.h )
s.files += %w( src/core/lib/event_engine/memory_allocator.cc )
s.files += %w( src/core/lib/event_engine/resolved_address.cc )
s.files += %w( src/core/lib/event_engine/slice.cc )
@@ -1565,8 +1575,6 @@ Gem::Specification.new do |s|
s.files += %w( third_party/abseil-cpp/absl/base/policy_checks.h )
s.files += %w( third_party/abseil-cpp/absl/base/port.h )
s.files += %w( third_party/abseil-cpp/absl/base/thread_annotations.h )
- s.files += %w( third_party/abseil-cpp/absl/cleanup/cleanup.h )
- s.files += %w( third_party/abseil-cpp/absl/cleanup/internal/cleanup.h )
s.files += %w( third_party/abseil-cpp/absl/container/fixed_array.h )
s.files += %w( third_party/abseil-cpp/absl/container/flat_hash_map.h )
s.files += %w( third_party/abseil-cpp/absl/container/flat_hash_set.h )
diff --git a/grpc.gyp b/grpc.gyp
index 75a1e6d696c..f1d7c81c4e0 100644
--- a/grpc.gyp
+++ b/grpc.gyp
@@ -356,7 +356,6 @@
'target_name': 'grpc',
'type': 'static_library',
'dependencies': [
- 'absl/cleanup:cleanup',
'absl/container:flat_hash_map',
'absl/container:flat_hash_set',
'absl/container:inlined_vector',
@@ -797,7 +796,12 @@
'src/core/lib/event_engine/channel_args_endpoint_config.cc',
'src/core/lib/event_engine/default_event_engine_factory.cc',
'src/core/lib/event_engine/event_engine.cc',
- 'src/core/lib/event_engine/iomgr_engine.cc',
+ 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc',
+ 'src/core/lib/event_engine/iomgr_engine/thread_pool.cc',
+ 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc',
+ 'src/core/lib/event_engine/iomgr_engine/timer.cc',
+ 'src/core/lib/event_engine/iomgr_engine/timer_heap.cc',
+ 'src/core/lib/event_engine/iomgr_engine/timer_manager.cc',
'src/core/lib/event_engine/memory_allocator.cc',
'src/core/lib/event_engine/resolved_address.cc',
'src/core/lib/event_engine/slice.cc',
@@ -1110,7 +1114,6 @@
'target_name': 'grpc_unsecure',
'type': 'static_library',
'dependencies': [
- 'absl/cleanup:cleanup',
'absl/container:flat_hash_map',
'absl/container:flat_hash_set',
'absl/container:inlined_vector',
@@ -1257,7 +1260,12 @@
'src/core/lib/event_engine/channel_args_endpoint_config.cc',
'src/core/lib/event_engine/default_event_engine_factory.cc',
'src/core/lib/event_engine/event_engine.cc',
- 'src/core/lib/event_engine/iomgr_engine.cc',
+ 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc',
+ 'src/core/lib/event_engine/iomgr_engine/thread_pool.cc',
+ 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc',
+ 'src/core/lib/event_engine/iomgr_engine/timer.cc',
+ 'src/core/lib/event_engine/iomgr_engine/timer_heap.cc',
+ 'src/core/lib/event_engine/iomgr_engine/timer_manager.cc',
'src/core/lib/event_engine/memory_allocator.cc',
'src/core/lib/event_engine/resolved_address.cc',
'src/core/lib/event_engine/slice.cc',
diff --git a/package.xml b/package.xml
index 1f1c46b56fa..065b067c665 100644
--- a/package.xml
+++ b/package.xml
@@ -935,8 +935,18 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1569,8 +1579,6 @@
-
-
diff --git a/src/core/lib/event_engine/default_event_engine_factory.cc b/src/core/lib/event_engine/default_event_engine_factory.cc
index 214651781b4..3f2ce66353e 100644
--- a/src/core/lib/event_engine/default_event_engine_factory.cc
+++ b/src/core/lib/event_engine/default_event_engine_factory.cc
@@ -20,7 +20,7 @@
#include
#include "src/core/lib/event_engine/event_engine_factory.h"
-#include "src/core/lib/event_engine/iomgr_engine.h"
+#include "src/core/lib/event_engine/iomgr_engine/iomgr_engine.h"
namespace grpc_event_engine {
namespace experimental {
diff --git a/src/core/lib/event_engine/iomgr_engine.cc b/src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc
similarity index 63%
rename from src/core/lib/event_engine/iomgr_engine.cc
rename to src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc
index 20f93f141bd..61064cf2b52 100644
--- a/src/core/lib/event_engine/iomgr_engine.cc
+++ b/src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc
@@ -13,14 +13,12 @@
// limitations under the License.
#include
-#include "src/core/lib/event_engine/iomgr_engine.h"
+#include "src/core/lib/event_engine/iomgr_engine/iomgr_engine.h"
#include
#include
-#include
#include
-#include "absl/cleanup/cleanup.h"
#include "absl/container/flat_hash_set.h"
#include "absl/strings/str_cat.h"
@@ -28,46 +26,49 @@
#include
#include "src/core/lib/debug/trace.h"
+#include "src/core/lib/event_engine/iomgr_engine/timer.h"
#include "src/core/lib/event_engine/trace.h"
-#include "src/core/lib/gprpp/match.h"
#include "src/core/lib/gprpp/time.h"
-#include "src/core/lib/iomgr/closure.h"
-#include "src/core/lib/iomgr/error.h"
-#include "src/core/lib/iomgr/exec_ctx.h"
-#include "src/core/lib/iomgr/executor.h"
-#include "src/core/lib/iomgr/timer.h"
namespace grpc_event_engine {
namespace experimental {
namespace {
-struct ClosureData {
- grpc_timer timer;
- grpc_closure closure;
- absl::variant, EventEngine::Closure*> cb;
- IomgrEventEngine* engine;
- EventEngine::TaskHandle handle;
-};
+std::string HandleToString(EventEngine::TaskHandle handle) {
+ return absl::StrCat("{", handle.keys[0], ",", handle.keys[1], "}");
+}
-grpc_core::Timestamp ToTimestamp(EventEngine::Duration when) {
- grpc_core::ExecCtx::Get()->InvalidateNow();
- return grpc_core::ExecCtx::Get()->Now() +
+} // namespace
+
+grpc_core::Timestamp IomgrEventEngine::ToTimestamp(EventEngine::Duration when) {
+ return timer_manager_.Now() +
std::max(grpc_core::Duration::Milliseconds(1),
grpc_core::Duration::NanosecondsRoundUp(when.count())) +
grpc_core::Duration::Milliseconds(1);
}
-std::string HandleToString(EventEngine::TaskHandle handle) {
- return absl::StrCat("{", handle.keys[0], ",", handle.keys[1], "}");
-}
+struct IomgrEventEngine::ClosureData final : public EventEngine::Closure {
+ std::function cb;
+ iomgr_engine::Timer timer;
+ IomgrEventEngine* engine;
+ EventEngine::TaskHandle handle;
-} // namespace
+ void Run() override {
+ GRPC_EVENT_ENGINE_TRACE("IomgrEventEngine:%p executing callback:%s", engine,
+ HandleToString(handle).c_str());
+ {
+ grpc_core::MutexLock lock(&engine->mu_);
+ engine->known_handles_.erase(handle);
+ }
+ cb();
+ delete this;
+ }
+};
IomgrEventEngine::IomgrEventEngine() {}
IomgrEventEngine::~IomgrEventEngine() {
- grpc_core::ExecCtx::Get()->Flush();
grpc_core::MutexLock lock(&mu_);
if (GRPC_TRACE_FLAG_ENABLED(grpc_event_engine_trace)) {
for (auto handle : known_handles_) {
@@ -84,9 +85,10 @@ bool IomgrEventEngine::Cancel(EventEngine::TaskHandle handle) {
grpc_core::MutexLock lock(&mu_);
if (!known_handles_.contains(handle)) return false;
auto* cd = reinterpret_cast(handle.keys[0]);
- grpc_timer_cancel(&cd->timer);
+ bool r = timer_manager_.TimerCancel(&cd->timer);
known_handles_.erase(handle);
- return true;
+ if (r) delete cd;
+ return r;
}
EventEngine::TaskHandle IomgrEventEngine::RunAfter(
@@ -96,41 +98,23 @@ EventEngine::TaskHandle IomgrEventEngine::RunAfter(
EventEngine::TaskHandle IomgrEventEngine::RunAfter(
Duration when, EventEngine::Closure* closure) {
- return RunAfterInternal(when, closure);
+ return RunAfterInternal(when, [closure]() { closure->Run(); });
}
void IomgrEventEngine::Run(std::function closure) {
- RunInternal(closure);
+ thread_pool_.Add(closure);
}
void IomgrEventEngine::Run(EventEngine::Closure* closure) {
- RunInternal(closure);
+ thread_pool_.Add([closure]() { closure->Run(); });
}
EventEngine::TaskHandle IomgrEventEngine::RunAfterInternal(
- Duration when,
- absl::variant, EventEngine::Closure*> cb) {
+ Duration when, std::function cb) {
auto when_ts = ToTimestamp(when);
auto* cd = new ClosureData;
cd->cb = std::move(cb);
cd->engine = this;
- GRPC_CLOSURE_INIT(
- &cd->closure,
- [](void* arg, grpc_error_handle error) {
- auto* cd = static_cast(arg);
- GRPC_EVENT_ENGINE_TRACE("IomgrEventEngine:%p executing callback:%s",
- cd->engine, HandleToString(cd->handle).c_str());
- {
- grpc_core::MutexLock lock(&cd->engine->mu_);
- cd->engine->known_handles_.erase(cd->handle);
- }
- auto cleaner = absl::MakeCleanup([cd] { delete cd; });
- if (error == GRPC_ERROR_CANCELLED) return;
- grpc_core::Match(
- cd->cb, [](EventEngine::Closure* cb) { cb->Run(); },
- [](std::function fn) { fn(); });
- },
- cd, nullptr);
EventEngine::TaskHandle handle{reinterpret_cast(cd),
aba_token_.fetch_add(1)};
grpc_core::MutexLock lock(&mu_);
@@ -138,29 +122,10 @@ EventEngine::TaskHandle IomgrEventEngine::RunAfterInternal(
cd->handle = handle;
GRPC_EVENT_ENGINE_TRACE("IomgrEventEngine:%p scheduling callback:%s", this,
HandleToString(handle).c_str());
- grpc_timer_init(&cd->timer, when_ts, &cd->closure);
+ timer_manager_.TimerInit(&cd->timer, when_ts, cd);
return handle;
}
-void IomgrEventEngine::RunInternal(
- absl::variant, EventEngine::Closure*> cb) {
- auto* cd = new ClosureData;
- cd->cb = std::move(cb);
- cd->engine = this;
- GRPC_CLOSURE_INIT(
- &cd->closure,
- [](void* arg, grpc_error_handle /*error*/) {
- auto* cd = static_cast(arg);
- auto cleaner = absl::MakeCleanup([cd] { delete cd; });
- grpc_core::Match(
- cd->cb, [](EventEngine::Closure* cb) { cb->Run(); },
- [](std::function fn) { fn(); });
- },
- cd, nullptr);
- // TODO(hork): have the EE spawn dedicated closure thread(s)
- grpc_core::Executor::Run(&cd->closure, GRPC_ERROR_NONE);
-}
-
std::unique_ptr IomgrEventEngine::GetDNSResolver(
EventEngine::DNSResolver::ResolverOptions const& /*options*/) {
GPR_ASSERT(false && "unimplemented");
diff --git a/src/core/lib/event_engine/iomgr_engine.h b/src/core/lib/event_engine/iomgr_engine/iomgr_engine.h
similarity index 86%
rename from src/core/lib/event_engine/iomgr_engine.h
rename to src/core/lib/event_engine/iomgr_engine/iomgr_engine.h
index ebc239eb638..eab19473509 100644
--- a/src/core/lib/event_engine/iomgr_engine.h
+++ b/src/core/lib/event_engine/iomgr_engine/iomgr_engine.h
@@ -11,8 +11,8 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_H
-#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_H
+#ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_IOMGR_ENGINE_H
+#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_IOMGR_ENGINE_H
#include
#include
@@ -25,7 +25,6 @@
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
-#include "absl/types/variant.h"
#include
#include
@@ -33,7 +32,10 @@
#include
#include "src/core/lib/event_engine/handle_containers.h"
+#include "src/core/lib/event_engine/iomgr_engine/thread_pool.h"
+#include "src/core/lib/event_engine/iomgr_engine/timer_manager.h"
#include "src/core/lib/gprpp/sync.h"
+#include "src/core/lib/gprpp/time.h"
namespace grpc_event_engine {
namespace experimental {
@@ -101,12 +103,13 @@ class IomgrEventEngine final : public EventEngine {
bool Cancel(TaskHandle handle) override;
private:
- EventEngine::TaskHandle RunAfterInternal(
- Duration when,
- absl::variant, EventEngine::Closure*> cb);
+ struct ClosureData;
+ EventEngine::TaskHandle RunAfterInternal(Duration when,
+ std::function cb);
+ grpc_core::Timestamp ToTimestamp(EventEngine::Duration when);
- void RunInternal(
- absl::variant, EventEngine::Closure*> cb);
+ iomgr_engine::TimerManager timer_manager_;
+ iomgr_engine::ThreadPool thread_pool_{2};
grpc_core::Mutex mu_;
TaskHandleSet known_handles_ ABSL_GUARDED_BY(mu_);
@@ -116,4 +119,4 @@ class IomgrEventEngine final : public EventEngine {
} // namespace experimental
} // namespace grpc_event_engine
-#endif // GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_H
+#endif // GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_IOMGR_ENGINE_H
diff --git a/src/core/lib/event_engine/iomgr_engine/thread_pool.cc b/src/core/lib/event_engine/iomgr_engine/thread_pool.cc
new file mode 100644
index 00000000000..2d52d244bc3
--- /dev/null
+++ b/src/core/lib/event_engine/iomgr_engine/thread_pool.cc
@@ -0,0 +1,123 @@
+/*
+ *
+ * Copyright 2015 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include
+
+#include "src/core/lib/event_engine/iomgr_engine/thread_pool.h"
+
+#include "src/core/lib/gprpp/thd.h"
+
+namespace grpc_event_engine {
+namespace iomgr_engine {
+
+ThreadPool::Thread::Thread(ThreadPool* pool)
+ : pool_(pool),
+ thd_(
+ "iomgr_eventengine_pool",
+ [](void* th) { static_cast(th)->ThreadFunc(); },
+ this) {
+ thd_.Start();
+}
+ThreadPool::Thread::~Thread() { thd_.Join(); }
+
+void ThreadPool::Thread::ThreadFunc() {
+ pool_->ThreadFunc();
+ // Now that we have killed ourselves, we should reduce the thread count
+ grpc_core::MutexLock lock(&pool_->mu_);
+ pool_->nthreads_--;
+ // Move ourselves to dead list
+ pool_->dead_threads_.push_back(this);
+
+ if ((pool_->shutdown_) && (pool_->nthreads_ == 0)) {
+ pool_->shutdown_cv_.Signal();
+ }
+}
+
+void ThreadPool::ThreadFunc() {
+ for (;;) {
+ // Wait until work is available or we are shutting down.
+ grpc_core::ReleasableMutexLock lock(&mu_);
+ if (!shutdown_ && callbacks_.empty()) {
+ // If there are too many threads waiting, then quit this thread
+ if (threads_waiting_ >= reserve_threads_) {
+ break;
+ }
+ threads_waiting_++;
+ cv_.Wait(&mu_);
+ threads_waiting_--;
+ }
+ // Drain callbacks before considering shutdown to ensure all work
+ // gets completed.
+ if (!callbacks_.empty()) {
+ auto cb = callbacks_.front();
+ callbacks_.pop();
+ lock.Release();
+ cb();
+ } else if (shutdown_) {
+ break;
+ }
+ }
+}
+
+ThreadPool::ThreadPool(int reserve_threads)
+ : shutdown_(false),
+ reserve_threads_(reserve_threads),
+ nthreads_(0),
+ threads_waiting_(0) {
+ for (int i = 0; i < reserve_threads_; i++) {
+ grpc_core::MutexLock lock(&mu_);
+ nthreads_++;
+ new Thread(this);
+ }
+}
+
+void ThreadPool::ReapThreads(std::vector* tlist) {
+ for (auto* t : *tlist) delete t;
+ tlist->clear();
+}
+
+ThreadPool::~ThreadPool() {
+ grpc_core::MutexLock lock(&mu_);
+ shutdown_ = true;
+ cv_.SignalAll();
+ while (nthreads_ != 0) {
+ shutdown_cv_.Wait(&mu_);
+ }
+ ReapThreads(&dead_threads_);
+}
+
+void ThreadPool::Add(const std::function& callback) {
+ grpc_core::MutexLock lock(&mu_);
+ // Add works to the callbacks list
+ callbacks_.push(callback);
+ // Increase pool size or notify as needed
+ if (threads_waiting_ == 0) {
+ // Kick off a new thread
+ nthreads_++;
+ new Thread(this);
+ } else {
+ cv_.Signal();
+ }
+ // Also use this chance to harvest dead threads
+ if (!dead_threads_.empty()) {
+ ReapThreads(&dead_threads_);
+ }
+}
+
+} // namespace iomgr_engine
+} // namespace grpc_event_engine
diff --git a/src/core/lib/event_engine/iomgr_engine/thread_pool.h b/src/core/lib/event_engine/iomgr_engine/thread_pool.h
new file mode 100644
index 00000000000..245be30a964
--- /dev/null
+++ b/src/core/lib/event_engine/iomgr_engine/thread_pool.h
@@ -0,0 +1,70 @@
+/*
+ *
+ * Copyright 2015 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_THREAD_POOL_H
+#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_THREAD_POOL_H
+
+#include
+
+#include
+#include
+#include
+
+#include "src/core/lib/gprpp/sync.h"
+#include "src/core/lib/gprpp/thd.h"
+
+namespace grpc_event_engine {
+namespace iomgr_engine {
+
+class ThreadPool final {
+ public:
+ explicit ThreadPool(int reserve_threads);
+ ~ThreadPool();
+
+ void Add(const std::function& callback);
+
+ private:
+ class Thread {
+ public:
+ explicit Thread(ThreadPool* pool);
+ ~Thread();
+
+ private:
+ ThreadPool* pool_;
+ grpc_core::Thread thd_;
+ void ThreadFunc();
+ };
+
+ void ThreadFunc();
+ static void ReapThreads(std::vector* tlist);
+
+ grpc_core::Mutex mu_;
+ grpc_core::CondVar cv_;
+ grpc_core::CondVar shutdown_cv_;
+ bool shutdown_;
+ std::queue> callbacks_;
+ int reserve_threads_;
+ int nthreads_;
+ int threads_waiting_;
+ std::vector dead_threads_;
+};
+
+} // namespace iomgr_engine
+} // namespace grpc_event_engine
+
+#endif // GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_THREAD_POOL_H
diff --git a/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc b/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc
new file mode 100644
index 00000000000..89ecdb6e8e0
--- /dev/null
+++ b/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc
@@ -0,0 +1,62 @@
+/*
+ *
+ * Copyright 2015 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include
+
+#include "src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h"
+
+namespace grpc_event_engine {
+namespace iomgr_engine {
+
+TimeAveragedStats::TimeAveragedStats(double init_avg, double regress_weight,
+ double persistence_factor)
+ : init_avg_(init_avg),
+ regress_weight_(regress_weight),
+ persistence_factor_(persistence_factor) {}
+
+void TimeAveragedStats::AddSample(double value) {
+ batch_total_value_ += value;
+ ++batch_num_samples_;
+}
+
+double TimeAveragedStats::UpdateAverage() {
+ /* Start with the current batch: */
+ double weighted_sum = batch_total_value_;
+ double total_weight = batch_num_samples_;
+ if (regress_weight_ > 0) {
+ /* Add in the regression towards init_avg_: */
+ weighted_sum += regress_weight_ * init_avg_;
+ total_weight += regress_weight_;
+ }
+ if (persistence_factor_ > 0) {
+ /* Add in the persistence: */
+ const double prev_sample_weight =
+ persistence_factor_ * aggregate_total_weight_;
+ weighted_sum += prev_sample_weight * aggregate_weighted_avg_;
+ total_weight += prev_sample_weight;
+ }
+ aggregate_weighted_avg_ =
+ (total_weight > 0) ? (weighted_sum / total_weight) : init_avg_;
+ aggregate_total_weight_ = total_weight;
+ batch_num_samples_ = 0;
+ batch_total_value_ = 0;
+ return aggregate_weighted_avg_;
+}
+
+} // namespace iomgr_engine
+} // namespace grpc_event_engine
diff --git a/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h b/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h
new file mode 100644
index 00000000000..c023a1e133b
--- /dev/null
+++ b/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h
@@ -0,0 +1,81 @@
+/*
+ *
+ * Copyright 2015 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIME_AVERAGED_STATS_H
+#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIME_AVERAGED_STATS_H
+
+namespace grpc_event_engine {
+namespace iomgr_engine {
+
+/* This tracks a time-decaying weighted average. It works by collecting
+ batches of samples and then mixing their average into a time-decaying
+ weighted mean. It is designed for batch operations where we do many adds
+ before updating the average. */
+
+class TimeAveragedStats {
+ public:
+ TimeAveragedStats(double init_avg, double regress_weight,
+ double persistence_factor);
+
+ /* Add a sample to the current batch. */
+ void AddSample(double value);
+ /* Complete a batch and compute the new estimate of the average sample
+ value. */
+ double UpdateAverage();
+
+ double aggregate_weighted_avg() const { return aggregate_weighted_avg_; }
+ double aggregate_total_weight() const { return aggregate_total_weight_; }
+
+ private:
+ /* The initial average value. This is the reported average until the first
+ grpc_time_averaged_stats_update_average call. If a positive regress_weight
+ is used, we also regress towards this value on each update. */
+ const double init_avg_;
+ /* The sample weight of "init_avg" that is mixed in with each call to
+ grpc_time_averaged_stats_update_average. If the calls to
+ grpc_time_averaged_stats_add_sample stop, this will cause the average to
+ regress back to the mean. This should be non-negative. Set it to 0 to
+ disable the bias. A value of 1 has the effect of adding in 1 bonus sample
+ with value init_avg to each sample period. */
+ const double regress_weight_;
+ /* This determines the rate of decay of the time-averaging from one period
+ to the next by scaling the aggregate_total_weight of samples from prior
+ periods when combining with the latest period. It should be in the range
+ [0,1]. A higher value adapts more slowly. With a value of 0.5, if the
+ batches each have k samples, the samples_in_avg_ will grow to 2 k, so the
+ weighting of the time average will eventually be 1/3 new batch and 2/3
+ old average. */
+ const double persistence_factor_;
+
+ /* The total value of samples since the last UpdateAverage(). */
+ double batch_total_value_ = 0;
+ /* The number of samples since the last UpdateAverage(). */
+ double batch_num_samples_ = 0;
+ /* The time-decayed sum of batch_num_samples_ over previous batches. This is
+ the "weight" of the old aggregate_weighted_avg_ when updating the
+ average. */
+ double aggregate_total_weight_ = 0;
+ /* A time-decayed average of the (batch_total_value_ / batch_num_samples_),
+ computed by decaying the samples_in_avg_ weight in the weighted average. */
+ double aggregate_weighted_avg_ = init_avg_;
+};
+
+} // namespace iomgr_engine
+} // namespace grpc_event_engine
+
+#endif /* GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIME_AVERAGED_STATS_H */
diff --git a/src/core/lib/event_engine/iomgr_engine/timer.cc b/src/core/lib/event_engine/iomgr_engine/timer.cc
new file mode 100644
index 00000000000..4ea69235321
--- /dev/null
+++ b/src/core/lib/event_engine/iomgr_engine/timer.cc
@@ -0,0 +1,312 @@
+/*
+ *
+ * Copyright 2015 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include
+
+#include "src/core/lib/event_engine/iomgr_engine/timer.h"
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#include "src/core/lib/event_engine/iomgr_engine/timer_heap.h"
+#include "src/core/lib/gpr/useful.h"
+#include "src/core/lib/gprpp/time.h"
+
+namespace grpc_event_engine {
+namespace iomgr_engine {
+
+static const size_t kInvalidHeapIndex = std::numeric_limits::max();
+static const double kAddDeadlineScale = 0.33;
+static const double kMinQueueWindowDuration = 0.01;
+static const double kMaxQueueWindowDuration = 1.0;
+
+grpc_core::Timestamp TimerList::Shard::ComputeMinDeadline() {
+ return heap.is_empty()
+ ? queue_deadline_cap + grpc_core::Duration::Epsilon()
+ : grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(
+ heap.Top()->deadline);
+}
+
+TimerList::Shard::Shard() : stats(1.0 / kAddDeadlineScale, 0.1, 0.5) {}
+
+TimerList::TimerList(TimerListHost* host)
+ : host_(host),
+ num_shards_(grpc_core::Clamp(2 * gpr_cpu_num_cores(), 1u, 32u)),
+ min_timer_(host_->Now().milliseconds_after_process_epoch()),
+ shards_(new Shard[num_shards_]),
+ shard_queue_(new Shard*[num_shards_]) {
+ for (size_t i = 0; i < num_shards_; i++) {
+ Shard& shard = shards_[i];
+ shard.queue_deadline_cap =
+ grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(
+ min_timer_.load(std::memory_order_relaxed));
+ shard.shard_queue_index = i;
+ shard.list.next = shard.list.prev = &shard.list;
+ shard.min_deadline = shard.ComputeMinDeadline();
+ shard_queue_[i] = &shard;
+ }
+}
+
+namespace {
+/* returns true if the first element in the list */
+void ListJoin(Timer* head, Timer* timer) {
+ timer->next = head;
+ timer->prev = head->prev;
+ timer->next->prev = timer->prev->next = timer;
+}
+
+void ListRemove(Timer* timer) {
+ timer->next->prev = timer->prev;
+ timer->prev->next = timer->next;
+}
+} // namespace
+
+void TimerList::SwapAdjacentShardsInQueue(uint32_t first_shard_queue_index) {
+ Shard* temp;
+ temp = shard_queue_[first_shard_queue_index];
+ shard_queue_[first_shard_queue_index] =
+ shard_queue_[first_shard_queue_index + 1];
+ shard_queue_[first_shard_queue_index + 1] = temp;
+ shard_queue_[first_shard_queue_index]->shard_queue_index =
+ first_shard_queue_index;
+ shard_queue_[first_shard_queue_index + 1]->shard_queue_index =
+ first_shard_queue_index + 1;
+}
+
+void TimerList::NoteDeadlineChange(Shard* shard) {
+ while (shard->shard_queue_index > 0 &&
+ shard->min_deadline <
+ shard_queue_[shard->shard_queue_index - 1]->min_deadline) {
+ SwapAdjacentShardsInQueue(shard->shard_queue_index - 1);
+ }
+ while (shard->shard_queue_index < num_shards_ - 1 &&
+ shard->min_deadline >
+ shard_queue_[shard->shard_queue_index + 1]->min_deadline) {
+ SwapAdjacentShardsInQueue(shard->shard_queue_index);
+ }
+}
+
+void TimerList::TimerInit(Timer* timer, grpc_core::Timestamp deadline,
+ experimental::EventEngine::Closure* closure) {
+ bool is_first_timer = false;
+ Shard* shard = &shards_[grpc_core::HashPointer(timer, num_shards_)];
+ timer->closure = closure;
+ timer->deadline = deadline.milliseconds_after_process_epoch();
+
+#ifndef NDEBUG
+ timer->hash_table_next = nullptr;
+#endif
+
+ {
+ grpc_core::MutexLock lock(&shard->mu);
+ timer->pending = true;
+ grpc_core::Timestamp now = host_->Now();
+ if (deadline <= now) {
+ deadline = now;
+ }
+
+ shard->stats.AddSample((deadline - now).millis() / 1000.0);
+
+ if (deadline < shard->queue_deadline_cap) {
+ is_first_timer = shard->heap.Add(timer);
+ } else {
+ timer->heap_index = kInvalidHeapIndex;
+ ListJoin(&shard->list, timer);
+ }
+ }
+
+ /* Deadline may have decreased, we need to adjust the main queue. Note
+ that there is a potential racy unlocked region here. There could be a
+ reordering of multiple TimerInit calls, at this point, but the < test
+ below should ensure that we err on the side of caution. There could
+ also be a race with TimerCheck, which might beat us to the lock. In
+ that case, it is possible that the timer that we added will have already
+ run by the time we hold the lock, but that too is a safe error.
+ Finally, it's possible that the TimerCheck that intervened failed to
+ trigger the new timer because the min_deadline hadn't yet been reduced.
+ In that case, the timer will simply have to wait for the next
+ TimerCheck. */
+ if (is_first_timer) {
+ grpc_core::MutexLock lock(&mu_);
+ if (deadline < shard->min_deadline) {
+ grpc_core::Timestamp old_min_deadline = shard_queue_[0]->min_deadline;
+ shard->min_deadline = deadline;
+ NoteDeadlineChange(shard);
+ if (shard->shard_queue_index == 0 && deadline < old_min_deadline) {
+ min_timer_.store(deadline.milliseconds_after_process_epoch(),
+ std::memory_order_relaxed);
+ host_->Kick();
+ }
+ }
+ }
+}
+
+bool TimerList::TimerCancel(Timer* timer) {
+ Shard* shard = &shards_[grpc_core::HashPointer(timer, num_shards_)];
+ grpc_core::MutexLock lock(&shard->mu);
+
+ if (timer->pending) {
+ timer->pending = false;
+ if (timer->heap_index == kInvalidHeapIndex) {
+ ListRemove(timer);
+ } else {
+ shard->heap.Remove(timer);
+ }
+ return true;
+ }
+
+ return false;
+}
+
+/* Rebalances the timer shard by computing a new 'queue_deadline_cap' and moving
+ all relevant timers in shard->list (i.e timers with deadlines earlier than
+ 'queue_deadline_cap') into into shard->heap.
+ Returns 'true' if shard->heap has at least ONE element */
+bool TimerList::Shard::RefillHeap(grpc_core::Timestamp now) {
+ /* Compute the new queue window width and bound by the limits: */
+ double computed_deadline_delta = stats.UpdateAverage() * kAddDeadlineScale;
+ double deadline_delta =
+ grpc_core::Clamp(computed_deadline_delta, kMinQueueWindowDuration,
+ kMaxQueueWindowDuration);
+ Timer *timer, *next;
+
+ /* Compute the new cap and put all timers under it into the queue: */
+ queue_deadline_cap = std::max(now, queue_deadline_cap) +
+ grpc_core::Duration::FromSecondsAsDouble(deadline_delta);
+
+ for (timer = list.next; timer != &list; timer = next) {
+ next = timer->next;
+ auto timer_deadline =
+ grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(
+ timer->deadline);
+
+ if (timer_deadline < queue_deadline_cap) {
+ ListRemove(timer);
+ heap.Add(timer);
+ }
+ }
+ return !heap.is_empty();
+}
+
+/* This pops the next non-cancelled timer with deadline <= now from the
+ queue, or returns NULL if there isn't one. */
+Timer* TimerList::Shard::PopOne(grpc_core::Timestamp now) {
+ Timer* timer;
+ for (;;) {
+ if (heap.is_empty()) {
+ if (now < queue_deadline_cap) return nullptr;
+ if (!RefillHeap(now)) return nullptr;
+ }
+ timer = heap.Top();
+ auto timer_deadline =
+ grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(
+ timer->deadline);
+ if (timer_deadline > now) return nullptr;
+ timer->pending = false;
+ heap.Pop();
+ return timer;
+ }
+}
+
+void TimerList::Shard::PopTimers(
+ grpc_core::Timestamp now, grpc_core::Timestamp* new_min_deadline,
+ std::vector* out) {
+ grpc_core::MutexLock lock(&mu);
+ while (Timer* timer = PopOne(now)) {
+ out->push_back(timer->closure);
+ }
+ *new_min_deadline = ComputeMinDeadline();
+}
+
+std::vector TimerList::FindExpiredTimers(
+ grpc_core::Timestamp now, grpc_core::Timestamp* next) {
+ grpc_core::Timestamp min_timer =
+ grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(
+ min_timer_.load(std::memory_order_relaxed));
+
+ std::vector done;
+ if (now < min_timer) {
+ if (next != nullptr) *next = std::min(*next, min_timer);
+ return done;
+ }
+
+ grpc_core::MutexLock lock(&mu_);
+
+ while (shard_queue_[0]->min_deadline < now ||
+ (now != grpc_core::Timestamp::InfFuture() &&
+ shard_queue_[0]->min_deadline == now)) {
+ grpc_core::Timestamp new_min_deadline;
+
+ /* For efficiency, we pop as many available timers as we can from the
+ shard. This may violate perfect timer deadline ordering, but that
+ shouldn't be a big deal because we don't make ordering guarantees. */
+ shard_queue_[0]->PopTimers(now, &new_min_deadline, &done);
+
+ /* An TimerInit() on the shard could intervene here, adding a new
+ timer that is earlier than new_min_deadline. However,
+ TimerInit() will block on the mutex before it can call
+ set_min_deadline, so this one will complete first and then the Addtimer
+ will reduce the min_deadline (perhaps unnecessarily). */
+ shard_queue_[0]->min_deadline = new_min_deadline;
+ NoteDeadlineChange(shard_queue_[0]);
+ }
+
+ if (next) {
+ *next = std::min(*next, shard_queue_[0]->min_deadline);
+ }
+
+ min_timer_.store(
+ shard_queue_[0]->min_deadline.milliseconds_after_process_epoch(),
+ std::memory_order_relaxed);
+
+ return done;
+}
+
+absl::optional>
+TimerList::TimerCheck(grpc_core::Timestamp* next) {
+ // prelude
+ grpc_core::Timestamp now = host_->Now();
+
+ /* fetch from a thread-local first: this avoids contention on a globally
+ mutable cacheline in the common case */
+ grpc_core::Timestamp min_timer =
+ grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(
+ min_timer_.load(std::memory_order_relaxed));
+
+ if (now < min_timer) {
+ if (next != nullptr) {
+ *next = std::min(*next, min_timer);
+ }
+ return std::vector();
+ }
+
+ if (!checker_mu_.TryLock()) return absl::nullopt;
+ std::vector run =
+ FindExpiredTimers(now, next);
+ checker_mu_.Unlock();
+
+ return std::move(run);
+}
+
+} // namespace iomgr_engine
+} // namespace grpc_event_engine
diff --git a/src/core/lib/event_engine/iomgr_engine/timer.h b/src/core/lib/event_engine/iomgr_engine/timer.h
new file mode 100644
index 00000000000..629e4a00fe3
--- /dev/null
+++ b/src/core/lib/event_engine/iomgr_engine/timer.h
@@ -0,0 +1,193 @@
+/*
+ *
+ * Copyright 2015 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_H
+#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_H
+
+#include
+
+#include
+
+#include
+#include
+#include
+#include
+
+#include "absl/base/thread_annotations.h"
+#include "absl/types/optional.h"
+
+#include
+
+#include "src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h"
+#include "src/core/lib/event_engine/iomgr_engine/timer_heap.h"
+#include "src/core/lib/gprpp/sync.h"
+#include "src/core/lib/gprpp/time.h"
+
+namespace grpc_event_engine {
+namespace iomgr_engine {
+
+struct Timer {
+ int64_t deadline;
+ // kInvalidHeapIndex if not in heap.
+ size_t heap_index;
+ bool pending;
+ struct Timer* next;
+ struct Timer* prev;
+ experimental::EventEngine::Closure* closure;
+#ifndef NDEBUG
+ struct Timer* hash_table_next;
+#endif
+
+ grpc_event_engine::experimental::EventEngine::TaskHandle task_handle;
+};
+
+// Dependency injection: allow tests and/or TimerManager to inject
+// their own implementations of Now, Kick.
+class TimerListHost {
+ public:
+ // Return the current timestamp.
+ // Abstracted so that tests can be run deterministically.
+ virtual grpc_core::Timestamp Now() = 0;
+ // Wake up a thread to check for timers.
+ virtual void Kick() = 0;
+
+ protected:
+ ~TimerListHost() = default;
+};
+
+class TimerList {
+ public:
+ explicit TimerList(TimerListHost* host);
+
+ TimerList(const TimerList&) = delete;
+ TimerList& operator=(const TimerList&) = delete;
+
+ /* Initialize *timer. When expired or canceled, closure will be called with
+ error set to indicate if it expired (GRPC_ERROR_NONE) or was canceled
+ (GRPC_ERROR_CANCELLED). *closure is guaranteed to be called exactly once, and
+ application code should check the error to determine how it was invoked. The
+ application callback is also responsible for maintaining information about
+ when to free up any user-level state. Behavior is undefined for a deadline of
+ grpc_core::Timestamp::InfFuture(). */
+ void TimerInit(Timer* timer, grpc_core::Timestamp deadline,
+ experimental::EventEngine::Closure* closure);
+
+ /* Note that there is no timer destroy function. This is because the
+ timer is a one-time occurrence with a guarantee that the callback will
+ be called exactly once, either at expiration or cancellation. Thus, all
+ the internal timer event management state is destroyed just before
+ that callback is invoked. If the user has additional state associated with
+ the timer, the user is responsible for determining when it is safe to
+ destroy that state. */
+
+ /* Cancel an *timer.
+ There are three cases:
+ 1. We normally cancel the timer
+ 2. The timer has already run
+ 3. We can't cancel the timer because it is "in flight".
+
+ In all of these cases, the cancellation is still considered successful.
+ They are essentially distinguished in that the timer_cb will be run
+ exactly once from either the cancellation (with error GRPC_ERROR_CANCELLED)
+ or from the activation (with error GRPC_ERROR_NONE).
+
+ Note carefully that the callback function MAY occur in the same callstack
+ as grpc_timer_cancel. It's expected that most timers will be cancelled
+ (their primary use is to implement deadlines), and so this code is
+ optimized such that cancellation costs as little as possible. Making
+ callbacks run inline matches this aim.
+
+ Requires: cancel() must happen after init() on a given timer */
+ bool TimerCancel(Timer* timer) GRPC_MUST_USE_RESULT;
+
+ /* iomgr internal api for dealing with timers */
+
+ /* Check for timers to be run, and return them.
+ Return nullopt if timers could not be checked due to contention with
+ another thread checking.
+ Return a vector of closures that *must* be run otherwise.
+ If next is non-null, TRY to update *next with the next running timer
+ IF that timer occurs before *next current value.
+ *next is never guaranteed to be updated on any given execution; however,
+ with high probability at least one thread in the system will see an update
+ at any time slice. */
+ absl::optional> TimerCheck(
+ grpc_core::Timestamp* next);
+
+ private:
+ /* A "timer shard". Contains a 'heap' and a 'list' of timers. All timers with
+ * deadlines earlier than 'queue_deadline_cap' are maintained in the heap and
+ * others are maintained in the list (unordered). This helps to keep the
+ * number of elements in the heap low.
+ *
+ * The 'queue_deadline_cap' gets recomputed periodically based on the timer
+ * stats maintained in 'stats' and the relevant timers are then moved from the
+ * 'list' to 'heap'.
+ */
+ struct Shard {
+ Shard();
+
+ grpc_core::Timestamp ComputeMinDeadline() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu);
+ bool RefillHeap(grpc_core::Timestamp now) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu);
+ Timer* PopOne(grpc_core::Timestamp now) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu);
+ void PopTimers(grpc_core::Timestamp now,
+ grpc_core::Timestamp* new_min_deadline,
+ std::vector* out)
+ ABSL_LOCKS_EXCLUDED(mu);
+
+ grpc_core::Mutex mu;
+ TimeAveragedStats stats ABSL_GUARDED_BY(mu);
+ /* All and only timers with deadlines < this will be in the heap. */
+ grpc_core::Timestamp queue_deadline_cap ABSL_GUARDED_BY(mu);
+ /* The deadline of the next timer due in this shard. */
+ grpc_core::Timestamp min_deadline ABSL_GUARDED_BY(&TimerList::mu_);
+ /* Index of this timer_shard in the g_shard_queue. */
+ uint32_t shard_queue_index ABSL_GUARDED_BY(&TimerList::mu_);
+ /* This holds all timers with deadlines < queue_deadline_cap. Timers in this
+ list have the top bit of their deadline set to 0. */
+ TimerHeap heap ABSL_GUARDED_BY(mu);
+ /* This holds timers whose deadline is >= queue_deadline_cap. */
+ Timer list ABSL_GUARDED_BY(mu);
+ };
+
+ void SwapAdjacentShardsInQueue(uint32_t first_shard_queue_index)
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
+ void NoteDeadlineChange(Shard* shard) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
+ std::vector FindExpiredTimers(
+ grpc_core::Timestamp now, grpc_core::Timestamp* next);
+
+ TimerListHost* const host_;
+ const size_t num_shards_;
+ grpc_core::Mutex mu_;
+ /* The deadline of the next timer due across all timer shards */
+ std::atomic min_timer_;
+ /* Allow only one FindExpiredTimers at once (used as a TryLock, protects no
+ * fields but ensures limits on concurrency) */
+ grpc_core::Mutex checker_mu_;
+ /* Array of timer shards. Whenever a timer (Timer *) is added, its address
+ * is hashed to select the timer shard to add the timer to */
+ const std::unique_ptr shards_;
+ /* Maintains a sorted list of timer shards (sorted by their min_deadline, i.e
+ * the deadline of the next timer in each shard). */
+ const std::unique_ptr shard_queue_ ABSL_GUARDED_BY(mu_);
+};
+
+} // namespace iomgr_engine
+} // namespace grpc_event_engine
+
+#endif /* GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_H */
diff --git a/src/core/lib/event_engine/iomgr_engine/timer_heap.cc b/src/core/lib/event_engine/iomgr_engine/timer_heap.cc
new file mode 100644
index 00000000000..da14d666b09
--- /dev/null
+++ b/src/core/lib/event_engine/iomgr_engine/timer_heap.cc
@@ -0,0 +1,107 @@
+/*
+ *
+ * Copyright 2015 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include
+
+#include "src/core/lib/event_engine/iomgr_engine/timer_heap.h"
+
+#include
+
+#include
+
+#include "src/core/lib/event_engine/iomgr_engine/timer.h"
+
+namespace grpc_event_engine {
+namespace iomgr_engine {
+
+/* Adjusts a heap so as to move a hole at position i closer to the root,
+ until a suitable position is found for element t. Then, copies t into that
+ position. This functor is called each time immediately after modifying a
+ value in the underlying container, with the offset of the modified element as
+ its argument. */
+void TimerHeap::AdjustUpwards(size_t i, Timer* t) {
+ while (i > 0) {
+ size_t parent = (i - 1) / 2;
+ if (timers_[parent]->deadline <= t->deadline) break;
+ timers_[i] = timers_[parent];
+ timers_[i]->heap_index = i;
+ i = parent;
+ }
+ timers_[i] = t;
+ t->heap_index = i;
+}
+
+/* Adjusts a heap so as to move a hole at position i farther away from the root,
+ until a suitable position is found for element t. Then, copies t into that
+ position. */
+void TimerHeap::AdjustDownwards(size_t i, Timer* t) {
+ for (;;) {
+ size_t left_child = 1 + 2 * i;
+ if (left_child >= timers_.size()) break;
+ size_t right_child = left_child + 1;
+ size_t next_i =
+ right_child < timers_.size() &&
+ timers_[left_child]->deadline > timers_[right_child]->deadline
+ ? right_child
+ : left_child;
+ if (t->deadline <= timers_[next_i]->deadline) break;
+ timers_[i] = timers_[next_i];
+ timers_[i]->heap_index = i;
+ i = next_i;
+ }
+ timers_[i] = t;
+ t->heap_index = i;
+}
+
+void TimerHeap::NoteChangedPriority(Timer* timer) {
+ uint32_t i = timer->heap_index;
+ uint32_t parent = static_cast((static_cast(i) - 1) / 2);
+ if (timers_[parent]->deadline > timer->deadline) {
+ AdjustUpwards(i, timer);
+ } else {
+ AdjustDownwards(i, timer);
+ }
+}
+
+bool TimerHeap::Add(Timer* timer) {
+ timer->heap_index = timers_.size();
+ timers_.push_back(timer);
+ AdjustUpwards(timer->heap_index, timer);
+ return timer->heap_index == 0;
+}
+
+void TimerHeap::Remove(Timer* timer) {
+ uint32_t i = timer->heap_index;
+ if (i == timers_.size() - 1) {
+ timers_.pop_back();
+ return;
+ }
+ timers_[i] = timers_[timers_.size() - 1];
+ timers_[i]->heap_index = i;
+ timers_.pop_back();
+ NoteChangedPriority(timers_[i]);
+}
+
+bool TimerHeap::is_empty() { return timers_.empty(); }
+
+Timer* TimerHeap::Top() { return timers_[0]; }
+
+void TimerHeap::Pop() { Remove(Top()); }
+
+} // namespace iomgr_engine
+} // namespace grpc_event_engine
diff --git a/src/core/lib/event_engine/iomgr_engine/timer_heap.h b/src/core/lib/event_engine/iomgr_engine/timer_heap.h
new file mode 100644
index 00000000000..ff8083df553
--- /dev/null
+++ b/src/core/lib/event_engine/iomgr_engine/timer_heap.h
@@ -0,0 +1,56 @@
+/*
+ *
+ * Copyright 2015 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_HEAP_H
+#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_HEAP_H
+
+#include
+
+#include
+#include
+
+namespace grpc_event_engine {
+namespace iomgr_engine {
+
+struct Timer;
+
+class TimerHeap {
+ public:
+ /* return true if the new timer is the first timer in the heap */
+ bool Add(Timer* timer);
+
+ void Remove(Timer* timer);
+ Timer* Top();
+ void Pop();
+
+ bool is_empty();
+
+ const std::vector& TestOnlyGetTimers() const { return timers_; }
+
+ private:
+ void AdjustUpwards(size_t i, Timer* t);
+ void AdjustDownwards(size_t i, Timer* t);
+ void NoteChangedPriority(Timer* timer);
+
+ std::vector timers_;
+};
+
+} // namespace iomgr_engine
+} // namespace grpc_event_engine
+
+#endif /* GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_HEAP_H */
diff --git a/src/core/lib/event_engine/iomgr_engine/timer_manager.cc b/src/core/lib/event_engine/iomgr_engine/timer_manager.cc
new file mode 100644
index 00000000000..3d1de28fab8
--- /dev/null
+++ b/src/core/lib/event_engine/iomgr_engine/timer_manager.cc
@@ -0,0 +1,254 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include
+
+#include "src/core/lib/event_engine/iomgr_engine/timer_manager.h"
+
+#include
+#include
+#include
+
+#include "absl/memory/memory.h"
+#include "absl/time/time.h"
+#include "absl/types/optional.h"
+
+#include
+#include
+#include
+
+#include "src/core/lib/gprpp/thd.h"
+
+namespace grpc_event_engine {
+namespace iomgr_engine {
+
+namespace {
+class ThreadCollector {
+ public:
+ ThreadCollector() = default;
+ ~ThreadCollector();
+
+ void Collect(std::vector threads) {
+ GPR_ASSERT(threads_.empty());
+ threads_ = std::move(threads);
+ }
+
+ private:
+ std::vector threads_;
+};
+
+ThreadCollector::~ThreadCollector() {
+ for (auto& t : threads_) t.Join();
+}
+} // namespace
+
+void TimerManager::StartThread() {
+ ++waiter_count_;
+ ++thread_count_;
+ auto* thread = new RunThreadArgs();
+ thread->self = this;
+ thread->thread =
+ grpc_core::Thread("timer_manager", &TimerManager::RunThread, thread);
+ thread->thread.Start();
+}
+
+void TimerManager::RunSomeTimers(
+ std::vector timers) {
+ // if there's something to execute...
+ ThreadCollector collector;
+ {
+ grpc_core::MutexLock lock(&mu_);
+ // remove a waiter from the pool, and start another thread if necessary
+ --waiter_count_;
+ if (waiter_count_ == 0) {
+ // The number of timer threads is always increasing until all the threads
+ // are stopped. In rare cases, if a large number of timers fire
+ // simultaneously, we may end up using a large number of threads.
+ // TODO(ctiller): We could avoid this by exiting threads in WaitUntil().
+ StartThread();
+ } else {
+ // if there's no thread waiting with a timeout, kick an existing untimed
+ // waiter so that the next deadline is not missed
+ if (!has_timed_waiter_) {
+ cv_.Signal();
+ }
+ }
+ }
+ for (auto* timer : timers) {
+ timer->Run();
+ }
+ {
+ grpc_core::MutexLock lock(&mu_);
+ collector.Collect(std::move(completed_threads_));
+ // get ready to wait again
+ ++waiter_count_;
+ }
+}
+
+// wait until 'next' (or forever if there is already a timed waiter in the pool)
+// returns true if the thread should continue executing (false if it should
+// shutdown)
+bool TimerManager::WaitUntil(grpc_core::Timestamp next) {
+ grpc_core::MutexLock lock(&mu_);
+
+ if (shutdown_) {
+ return false;
+ }
+
+ // TODO(ctiller): if there are too many waiting threads, this would be a good
+ // place to exit the current thread.
+
+ // If kicked_ is true at this point, it means there was a kick from the timer
+ // system that the timer-manager threads here missed. We cannot trust 'next'
+ // here any longer (since there might be an earlier deadline). So if kicked_
+ // is true at this point, we should quickly exit this and get the next
+ // deadline from the timer system
+
+ if (!kicked_) {
+ // if there's no timed waiter, we should become one: that waiter waits
+ // only until the next timer should expire. All other timers wait forever
+ //
+ // 'timed_waiter_generation_' is a global generation counter. The idea here
+ // is that the thread becoming a timed-waiter increments and stores this
+ // global counter locally in 'my_timed_waiter_generation' before going to
+ // sleep. After waking up, if my_timed_waiter_generation ==
+ // timed_waiter_generation_, it can be sure that it was the timed_waiter
+ // thread (and that no other thread took over while this was asleep)
+ //
+ // Initialize my_timed_waiter_generation to some value that is NOT equal to
+ // timed_waiter_generation_
+ uint64_t my_timed_waiter_generation = timed_waiter_generation_ - 1;
+
+ /* If there's no timed waiter, we should become one: that waiter waits only
+ until the next timer should expire. All other timer threads wait forever
+ unless their 'next' is earlier than the current timed-waiter's deadline
+ (in which case the thread with earlier 'next' takes over as the new timed
+ waiter) */
+ if (next != grpc_core::Timestamp::InfFuture()) {
+ if (!has_timed_waiter_ || (next < timed_waiter_deadline_)) {
+ my_timed_waiter_generation = ++timed_waiter_generation_;
+ has_timed_waiter_ = true;
+ timed_waiter_deadline_ = next;
+ } else { // timed_waiter_ == true && next >= timed_waiter_deadline_
+ next = grpc_core::Timestamp::InfFuture();
+ }
+ }
+
+ cv_.WaitWithTimeout(&mu_,
+ absl::Milliseconds((next - host_.Now()).millis()));
+
+ // if this was the timed waiter, then we need to check timers, and flag
+ // that there's now no timed waiter... we'll look for a replacement if
+ // there's work to do after checking timers (code above)
+ if (my_timed_waiter_generation == timed_waiter_generation_) {
+ ++wakeups_;
+ has_timed_waiter_ = false;
+ timed_waiter_deadline_ = grpc_core::Timestamp::InfFuture();
+ }
+ }
+
+ kicked_ = false;
+
+ return true;
+}
+
+void TimerManager::MainLoop() {
+ for (;;) {
+ grpc_core::Timestamp next = grpc_core::Timestamp::InfFuture();
+ absl::optional>
+ check_result = timer_list_->TimerCheck(&next);
+ if (check_result.has_value()) {
+ if (!check_result->empty()) {
+ RunSomeTimers(std::move(*check_result));
+ continue;
+ }
+ } else {
+ /* This case only happens under contention, meaning more than one timer
+ manager thread checked timers concurrently.
+
+ If that happens, we're guaranteed that some other thread has just
+ checked timers, and this will avalanche into some other thread seeing
+ empty timers and doing a timed sleep.
+
+ Consequently, we can just sleep forever here and be happy at some
+ saved wakeup cycles. */
+ next = grpc_core::Timestamp::InfFuture();
+ }
+ if (!WaitUntil(next)) return;
+ }
+}
+
+void TimerManager::RunThread(void* arg) {
+ std::unique_ptr thread(static_cast(arg));
+ thread->self->MainLoop();
+ {
+ grpc_core::MutexLock lock(&thread->self->mu_);
+ thread->self->thread_count_--;
+ thread->self->completed_threads_.push_back(std::move(thread->thread));
+ }
+ thread->self->cv_.Signal();
+}
+
+TimerManager::TimerManager() : host_(this) {
+ timer_list_ = absl::make_unique(&host_);
+ grpc_core::MutexLock lock(&mu_);
+ StartThread();
+}
+
+grpc_core::Timestamp TimerManager::Host::Now() {
+ return grpc_core::Timestamp::FromTimespecRoundDown(
+ gpr_now(GPR_CLOCK_MONOTONIC));
+}
+
+void TimerManager::TimerInit(Timer* timer, grpc_core::Timestamp deadline,
+ experimental::EventEngine::Closure* closure) {
+ timer_list_->TimerInit(timer, deadline, closure);
+}
+
+bool TimerManager::TimerCancel(Timer* timer) {
+ return timer_list_->TimerCancel(timer);
+}
+
+TimerManager::~TimerManager() {
+ {
+ grpc_core::MutexLock lock(&mu_);
+ shutdown_ = true;
+ cv_.SignalAll();
+ }
+ while (true) {
+ ThreadCollector collector;
+ grpc_core::MutexLock lock(&mu_);
+ collector.Collect(std::move(completed_threads_));
+ if (thread_count_ == 0) break;
+ cv_.Wait(&mu_);
+ }
+}
+
+void TimerManager::Host::Kick() { timer_manager_->Kick(); }
+
+void TimerManager::Kick() {
+ grpc_core::MutexLock lock(&mu_);
+ has_timed_waiter_ = false;
+ timed_waiter_deadline_ = grpc_core::Timestamp::InfFuture();
+ ++timed_waiter_generation_;
+ kicked_ = true;
+ cv_.Signal();
+}
+
+} // namespace iomgr_engine
+} // namespace grpc_event_engine
diff --git a/src/core/lib/event_engine/iomgr_engine/timer_manager.h b/src/core/lib/event_engine/iomgr_engine/timer_manager.h
new file mode 100644
index 00000000000..6e93621e0ea
--- /dev/null
+++ b/src/core/lib/event_engine/iomgr_engine/timer_manager.h
@@ -0,0 +1,111 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_MANAGER_H
+#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_MANAGER_H
+
+#include
+
+#include
+#include
+
+#include
+#include
+
+#include "absl/base/thread_annotations.h"
+
+#include
+
+#include "src/core/lib/event_engine/iomgr_engine/timer.h"
+#include "src/core/lib/gprpp/sync.h"
+#include "src/core/lib/gprpp/thd.h"
+#include "src/core/lib/gprpp/time.h"
+
+namespace grpc_event_engine {
+namespace iomgr_engine {
+
+// Timer Manager tries to keep only one thread waiting for the next timeout at
+// all times, and thus effectively preventing the thundering herd problem.
+// TODO(ctiller): consider unifying this thread pool and the one in
+// thread_pool.{h,cc}.
+class TimerManager final {
+ public:
+ TimerManager();
+ ~TimerManager();
+
+ grpc_core::Timestamp Now() { return host_.Now(); }
+
+ void TimerInit(Timer* timer, grpc_core::Timestamp deadline,
+ experimental::EventEngine::Closure* closure);
+ bool TimerCancel(Timer* timer);
+
+ private:
+ struct RunThreadArgs {
+ TimerManager* self;
+ grpc_core::Thread thread;
+ };
+
+ class Host final : public TimerListHost {
+ public:
+ explicit Host(TimerManager* timer_manager)
+ : timer_manager_(timer_manager) {}
+
+ void Kick() override;
+ grpc_core::Timestamp Now() override;
+
+ private:
+ TimerManager* const timer_manager_;
+ };
+
+ void StartThread() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
+ static void RunThread(void* arg);
+ void MainLoop();
+ void RunSomeTimers(std::vector timers);
+ bool WaitUntil(grpc_core::Timestamp next);
+ void Kick();
+
+ grpc_core::Mutex mu_;
+ grpc_core::CondVar cv_;
+ Host host_;
+ // number of threads in the system
+ size_t thread_count_ ABSL_GUARDED_BY(mu_) = 0;
+ // number of threads sitting around waiting
+ size_t waiter_count_ ABSL_GUARDED_BY(mu_) = 0;
+ // Threads waiting to be joined
+ std::vector completed_threads_ ABSL_GUARDED_BY(mu_);
+ // is there a thread waiting until the next timer should fire?
+ bool has_timed_waiter_ ABSL_GUARDED_BY(mu_) = false;
+ // are we shutting down?
+ bool shutdown_ ABSL_GUARDED_BY(mu_) = false;
+ // are we shutting down?
+ bool kicked_ ABSL_GUARDED_BY(mu_) = false;
+ // the deadline of the current timed waiter thread (only relevant if
+ // has_timed_waiter_ is true)
+ grpc_core::Timestamp timed_waiter_deadline_ ABSL_GUARDED_BY(mu_);
+ // generation counter to track which thread is waiting for the next timer
+ uint64_t timed_waiter_generation_ ABSL_GUARDED_BY(mu_) = 0;
+ // number of timer wakeups
+ uint64_t wakeups_ ABSL_GUARDED_BY(mu_) = 0;
+ // actual timer implementation
+ std::unique_ptr timer_list_;
+};
+
+} // namespace iomgr_engine
+} // namespace grpc_event_engine
+
+#endif /* GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_MANAGER_H */
diff --git a/src/core/lib/gpr/time_posix.cc b/src/core/lib/gpr/time_posix.cc
index 0a9e1158b32..5af7a769dff 100644
--- a/src/core/lib/gpr/time_posix.cc
+++ b/src/core/lib/gpr/time_posix.cc
@@ -88,17 +88,14 @@ static gpr_timespec now_impl(gpr_clock_type clock_type) {
#include
#include
-static double g_time_scale;
-static uint64_t g_time_start;
-
-void gpr_time_init(void) {
+static double g_time_scale = []() {
mach_timebase_info_data_t tb = {0, 1};
- gpr_precise_clock_init();
mach_timebase_info(&tb);
- g_time_scale = tb.numer;
- g_time_scale /= tb.denom;
- g_time_start = mach_absolute_time();
-}
+ return static_cast(tb.numer) / static_cast(tb.denom);
+}();
+static uint64_t g_time_start = mach_absolute_time();
+
+void gpr_time_init(void) { gpr_precise_clock_init(); }
static gpr_timespec now_impl(gpr_clock_type clock) {
gpr_timespec now;
diff --git a/src/core/lib/gpr/time_windows.cc b/src/core/lib/gpr/time_windows.cc
index 39bca1b0940..57323fb8a07 100644
--- a/src/core/lib/gpr/time_windows.cc
+++ b/src/core/lib/gpr/time_windows.cc
@@ -31,15 +31,18 @@
#include "src/core/lib/gpr/time_precise.h"
-static LARGE_INTEGER g_start_time;
-static double g_time_scale;
-
-void gpr_time_init(void) {
+static LARGE_INTEGER g_start_time = []() {
+ LARGE_INTEGER x;
+ QueryPerformanceCounter(&x);
+ return x;
+}();
+static double g_time_scale = []() {
LARGE_INTEGER frequency;
QueryPerformanceFrequency(&frequency);
- QueryPerformanceCounter(&g_start_time);
- g_time_scale = 1.0 / (double)frequency.QuadPart;
-}
+ return 1.0 / (double)frequency.QuadPart;
+}();
+
+void gpr_time_init(void) {}
static gpr_timespec now_impl(gpr_clock_type clock) {
gpr_timespec now_tv;
diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py
index fd5cf31ff44..3d63c967592 100644
--- a/src/python/grpcio/grpc_core_dependencies.py
+++ b/src/python/grpcio/grpc_core_dependencies.py
@@ -440,7 +440,12 @@ CORE_SOURCE_FILES = [
'src/core/lib/event_engine/channel_args_endpoint_config.cc',
'src/core/lib/event_engine/default_event_engine_factory.cc',
'src/core/lib/event_engine/event_engine.cc',
- 'src/core/lib/event_engine/iomgr_engine.cc',
+ 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc',
+ 'src/core/lib/event_engine/iomgr_engine/thread_pool.cc',
+ 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc',
+ 'src/core/lib/event_engine/iomgr_engine/timer.cc',
+ 'src/core/lib/event_engine/iomgr_engine/timer_heap.cc',
+ 'src/core/lib/event_engine/iomgr_engine/timer_manager.cc',
'src/core/lib/event_engine/memory_allocator.cc',
'src/core/lib/event_engine/resolved_address.cc',
'src/core/lib/event_engine/slice.cc',
diff --git a/test/core/end2end/fuzzers/BUILD b/test/core/end2end/fuzzers/BUILD
index 839bd3d0c1d..d403cb1b063 100644
--- a/test/core/end2end/fuzzers/BUILD
+++ b/test/core/end2end/fuzzers/BUILD
@@ -26,6 +26,9 @@ grpc_proto_fuzzer(
corpus = "api_fuzzer_corpus",
language = "C++",
proto = "api_fuzzer.proto",
+ proto_deps = [
+ "//test/core/event_engine/fuzzing_event_engine:fuzzing_event_engine_proto",
+ ],
tags = ["no_windows"],
uses_event_engine = False,
uses_polling = False,
@@ -33,6 +36,7 @@ grpc_proto_fuzzer(
"//:gpr",
"//:grpc",
"//test/core/end2end:ssl_test_data",
+ "//test/core/event_engine/fuzzing_event_engine",
"//test/core/util:grpc_test_util",
],
)
diff --git a/test/core/end2end/fuzzers/api_fuzzer.cc b/test/core/end2end/fuzzers/api_fuzzer.cc
index 3dad73e0184..48056e110a1 100644
--- a/test/core/end2end/fuzzers/api_fuzzer.cc
+++ b/test/core/end2end/fuzzers/api_fuzzer.cc
@@ -18,6 +18,8 @@
#include
+#include
+
#include
#include
#include
@@ -28,6 +30,7 @@
#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
#include "src/core/lib/address_utils/parse_address.h"
#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/event_engine/event_engine_factory.h"
#include "src/core/lib/gpr/env.h"
#include "src/core/lib/iomgr/executor.h"
#include "src/core/lib/iomgr/resolve_address.h"
@@ -41,10 +44,28 @@
#include "src/libfuzzer/libfuzzer_macro.h"
#include "test/core/end2end/data/ssl_test_data.h"
#include "test/core/end2end/fuzzers/api_fuzzer.pb.h"
+#include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h"
#include "test/core/util/passthru_endpoint.h"
-static constexpr uint64_t kMaxAdvanceTimeMicros =
- 31536000000000; // 1 year (24 * 365 * 3600 * 1000000)
+static grpc_event_engine::experimental::FuzzingEventEngine* g_event_engine =
+ new grpc_event_engine::experimental::FuzzingEventEngine(
+ grpc_event_engine::experimental::FuzzingEventEngine::Options());
+static int g_unused_initialize_event_engine = []() {
+ grpc_event_engine::experimental::SetDefaultEventEngineFactory(
+ new std::function()>([]() {
+ // HACK HACK HACK
+ // We know that this event engine will never be deleted by the
+ // caller, instead release() will be called and the value stashed in
+ // a global elsewhere. Therefore it's safe to wrap our global in a
+ // unique_ptr and return it, knowing it will never be deleted
+ // elsewhere.
+ return std::unique_ptr(
+ g_event_engine);
+ }));
+ return 42;
+}();
+
// Applicable when simulating channel actions. Prevents overflows.
static constexpr uint64_t kMaxWaitMs =
31536000000; // 1 year (24 * 365 * 3600 * 1000)
@@ -64,22 +85,12 @@ static void dont_log(gpr_log_func_args* /*args*/) {}
////////////////////////////////////////////////////////////////////////////////
// global state
-static gpr_timespec g_now;
static grpc_server* g_server;
static grpc_channel* g_channel;
static grpc_resource_quota* g_resource_quota;
static std::vector g_channel_actions;
static std::atomic g_channel_force_delete{false};
-extern gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type);
-
-static gpr_timespec now_impl(gpr_clock_type clock_type) {
- GPR_ASSERT(clock_type != GPR_TIMESPAN);
- gpr_timespec ts = g_now;
- ts.clock_type = clock_type;
- return ts;
-}
-
////////////////////////////////////////////////////////////////////////////////
// dns resolution
@@ -762,9 +773,7 @@ DEFINE_PROTO_FUZZER(const api_fuzzer::Msg& msg) {
if (squelch && grpc_trace_fuzzer == nullptr) gpr_set_log_function(dont_log);
gpr_free(grpc_trace_fuzzer);
grpc_set_tcp_client_impl(&fuzz_tcp_client_vtable);
- g_now = {1, 0, GPR_CLOCK_MONOTONIC};
- grpc_core::TestOnlySetProcessEpoch(g_now);
- gpr_now_impl = now_impl;
+ g_event_engine->Restart(msg.event_engine_actions());
grpc_init();
grpc_timer_manager_set_threading(false);
{
@@ -808,7 +817,10 @@ DEFINE_PROTO_FUZZER(const api_fuzzer::Msg& msg) {
while (action_index < msg.actions_size() || g_channel != nullptr ||
g_server != nullptr || pending_channel_watches > 0 ||
pending_pings > 0 || ActiveCall() != nullptr) {
+ g_event_engine->Tick();
+
if (action_index == msg.actions_size()) {
+ g_event_engine->FuzzingDone();
if (g_channel != nullptr) {
grpc_channel_destroy(g_channel);
g_channel = nullptr;
@@ -831,11 +843,6 @@ DEFINE_PROTO_FUZZER(const api_fuzzer::Msg& msg) {
call->Shutdown();
}
- g_now = gpr_time_add(
- g_now,
- gpr_time_from_seconds(
- std::max(1, static_cast(kMaxWaitMs / 1000)),
- GPR_TIMESPAN));
grpc_timer_manager_tick();
GPR_ASSERT(!poll_cq());
continue;
@@ -860,15 +867,6 @@ DEFINE_PROTO_FUZZER(const api_fuzzer::Msg& msg) {
GPR_ASSERT(!poll_cq());
break;
}
- // increment global time
- case api_fuzzer::Action::kAdvanceTime: {
- g_now = gpr_time_add(
- g_now, gpr_time_from_micros(
- std::min(static_cast(action.advance_time()),
- kMaxAdvanceTimeMicros),
- GPR_TIMESPAN));
- break;
- }
// create an insecure channel
case api_fuzzer::Action::kCreateChannel: {
if (!action.create_channel().channel_actions_size() ||
diff --git a/test/core/end2end/fuzzers/api_fuzzer.proto b/test/core/end2end/fuzzers/api_fuzzer.proto
index eab3551cb01..fa6ab6e1566 100644
--- a/test/core/end2end/fuzzers/api_fuzzer.proto
+++ b/test/core/end2end/fuzzers/api_fuzzer.proto
@@ -16,6 +16,8 @@ syntax = "proto3";
package api_fuzzer;
+import "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.proto";
+
message Empty {}
message ByteSlice {
@@ -162,9 +164,9 @@ message Batch {
}
message Action {
+ reserved 2;
oneof type {
Empty poll_cq = 1;
- uint32 advance_time = 2;
CreateChannel create_channel = 3;
Empty close_channel = 4;
CreateServer create_server = 5;
@@ -190,4 +192,5 @@ message Action {
message Msg {
repeated Action actions = 1;
+ fuzzing_event_engine.Actions event_engine_actions = 2;
}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/alloc-idx b/test/core/end2end/fuzzers/api_fuzzer_corpus/alloc-idx
deleted file mode 100644
index 5669fb9cc1f..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/alloc-idx
+++ /dev/null
@@ -1,350 +0,0 @@
-actions {
- create_server {
- }
-}
-actions {
- create_channel {
- target: "dns:server"
- channel_args {
- key: "grpc.secondary_user_agent"
- str: "grpc.secondary\235\262\362\245\277\255\364\207\275\252\363\203\262\201\361\265\240\262\360\237\255\264\361\275\224\223\363\220\252\242\362\261\223\273\362\275\233\250\360\242\272\277\363\266\265\262\364\212\211\235\362\243\206\273\362\242\201\226\362\251\230\213\363\216\207\260\360\231\252\245\362\225\271\226\361\234\240\225\363\222\245\203\362\242\275\251\361\214\233\272\363\235\271\275\361\236\21ã211\361\220\253\241\360\226\204\216\363\254\255\210\363\264\271\217\360\243\226\265\363\276\220\215\363\216\237\256\362\266\245\273\362\225\206\253\360\225\246\245\362\226\207\224\362\206\234\201\362\223\247\233\361\265\260\234\360\277\217\271\360\265\216\250\363\236\213\224\362\203\204\251\364\215\213\215\361\265\252\214\363\222\234\275\363\212\211\211\363\262\256\200\363\241\243\241\362\201\245\254\361\205\232\252\361\202\220\234\361\277\235\234\363\236\205\274\362\254\214\262\363\252\234\220\360\241\222\242\360\274\240\232\360\260\224\250\363\206\213\221\363\274\250\262\360\236\243\260\361\211\232\273\361\211\251\250\362\226\230\217\361\241\220\200\362\210\212\265\364\217\020\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\30719\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\3077\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\3073\201\361\264\227\230\363\230\234\261\362\227\204\204\362\201\251\230\360\254\242\223\363\222\255\266\362\222\241\213\361\265\247\234\362\277\200\230\363\275\257\215\362\224\210\274\360\267\202\245\362\202\240\217\363\205\232\276\362\257\223\267\361\263\260\201\363\243\242\210\362\213\241\246\363\225\257\210\363\276\256\250\361\254\221\205\363\227\270\267\363\223\215\266\363\232\250\274\362\225\250\255\361\224\240\216\364\207\274\273\362\227\212\234\361\205\213\231\361\211\224\201\363\256\220\232\361\265\261\230\364\200\220\221\360\240\271\221\363\210\275\265\364\215\200\271\360\224\242\203\362\256\233\257\360\235\236\221\362\225\225\203\361\254\217\202\363\213\263\221\362\241\226\271\362\220\230\252\361\213\225\205\360\254\274\211\363\273\217\270\360\250\264\273\361\270\256\203\363\247\224\236\362\204\275\223\362\203\226\272\363\233\271\226\361\264\260\266\363\240\256\277\362\273\225\254\362\220\226\206\362\275\221\244\362\203\252\212\362\221\205\226\363\257\215\244\362\250\200\214\362\232\212\252\362\231\245\226\362\263\211\271\361\216\266\275\362\260\262\275\362\232\245\221\363\276\271\264\361\252\257\227\363\265\230\202\363\225\252\213\361\261\223\263\362\246\232\233\363\201\211\203\362\250\271\272\362\236\276\243\362\270\204\242\361\230\261\202\363\221\241\271\363\205\265\260\362\236\205\202\361\201\207\235\361\262\245\222\362\267\222\247\361\203\236\242\362\224\222\242\361\271\204\275\361\237\236\246\361\243\227\211\362\253\217\207\360\270\207\274\363\236\214\220\361\210\225\243\363\245\230\270\361\240\253\271\360\24759975837\216\277\360\233\201\262\362\212\224\255\361\201\246\210\363\223\236\276\361\213\270\206\361\237\240\210\363\243\212\211\363\231\225\206\362\216\267\230\362\254\216\246\361\203\242\243\361\243\275\233\361\264\210\210\363\251\201\236\362\252\250\273\362\274\234\267\360\272\215\203\364\210\266\205\363\271\231\230\364\213\217\264\363\261\241\217\362\276\261\247\361\271\277\236\363\212\237\204\362\207\267\216\361\211\246\222\363\200\217\226\362\253\240\226\364\206\204\234\362\235\220\204\360\273\223\207\361\266\245\225\360\224\227\267\362\245\264\206\363\233\262\212\361\220\214\217\363\256\226\213\361\266\271\266\362\211\270\201\363\204\213\206\361\235\264\210\362\273\223\216\361\201\210\273\363\215\234\223\360\222\247\263\362\205\210\227\360\241\247\215\360\245\241\231\360\277\253\221\363\225\244\236\362\234\212\264\360\257\237\272\361\265\204\256\361\262\224\231\363\266\211\270\362\271\207\201\360\267\217\241\362\242\243\252\363\200\274\276\364\217\262\243\361\277\210\207\364\310\246\235\362\227\237\205\360\225\256\235\363\211\264\263\364\212\207\267\363\263\256\250\361\221\263\201\362\274\275\207\361\204\221\222\360\227\270\241\362\213\270\203\363\263\221\277\363\257\212\225\360\232\260\223\363\277\244\220\361\254\266\217\361\213\247\204\360\256\205\213\360\233\264\222\361\212\261\247\362\265\244\225\361\225\236\265\362\205\225\256\361\276\254\245\363\250\212\206\362\213\262\231\361\217\235\241\361\210\232\200\364\200\211\202\363\211\202\274\360\235\214\236\360\241\231\216\363\250\211\252\361\201\223\203\362\244\222\225\363\214\235\213\360\227\203\262\360\257\237\223\362\251\224\200\362\206\210\212\360\227\224\221\363\203\272\213\361\275\256\233\363\215\215\232\360\267\207\265\363\274\262\267\363\221\267\223\363\232\214\215\363\247\233\261\364\214\271\225\363\214\267\255\361\210\236\201\363\223\213\227\362\202\243\241\361\261\223\245\364\200\230\207\360\272\232\227\360\273\224\226\360\221\256\202\361\223\220\207\364\211\257\254\362\264\257\265\362\243\241\261\362\271\205\245\363\262\214\251\362\242\270\214\360\271\246\215\362\233\251\221\361\227\264\233\360\277\244\225\361\253\220\223\363\276\225\267\361\277\265\222\360\233\206\234\361\203\237\274\362\261\215\261\362\240\207\255\361\205\235\235\362\207\212\257\360\274\216\266\361\266\262\205\362\241\205\270\361\265\247\220\360\264\202\264\362\212\271\207\362\203\257\223\362\261\256\274\361\230\275\277\363\263\273\274\362\210\246\275\363\262\245\215\363\267\260\251\361\266\236\276\361\230\241\270\360\243\237\255\360\250\235\216\362\236\220\253\362\224\202\274\362\201\274\273\363\200\247\245\364\210\242\224\362\276\234\202\363\244\241\246\362\213\266\272\362\225\257\255\363\266\200\242\360\261\247\210\363\231\236\234\360\220\260\215\360\241\271\225\362\203\256\275\362\260\265\270\360\276\234\212\363\204\257\232\361\224\265\233\362\200\223\225\362\245\255\265\361\245\252\217\364\216\253\241\360\267\277\226\362\210\206\256\363\257\271\265\360\227\216\246\364\207\200\257\361\204\254\204\364\200\260\274\361\234\220\271\361\223\223\212\363\274\250\241\361\220\240\263\362\207\251\261\362\247\252\265\362\251\245\204\363\212\220\231\361\217\233\212\361\221\261\257\363\267\266\273\363\266\271\230\362\243\261\240\360\221\261\261\361\212\254\274\363\254\252\216\361\253\223\272\362\237\246\277\363\232\264\204\361\234\233\212\362\226\205\227\363\200\227\250\364\216\241\204\361\255\253\235\360\225\214\276\360\243\232\271\363\266\250\222\361\216\243\207\360\270\201\273\360\236\236\231\361\270\230\267\361\265\257\271\362\241\236\206\363\207\245\201\361\247\275\225\361\253\237\253\361\202\261\200\361\257\272\264\361\264\246\261\360\263\224\214\360\247\243\201\360\241\245\274\361\245\203\223\361\220\201\227\363\236\220\244\363\275\204\240\363\203\233\262\363\265\221\272\363\215\220\246\362\225\270\203\362\207\236\227\360\220\260\266\364\211\250\277\363\263\214\272\363\260\230\203\360\233\237\201\362\251\232\237\362\240\222\246\361\235\275\210\360\274\237\267\362\226\212\266\363\252\243\263\361\240\244\223\362\276\203\203\361\216\272\203\363\205\204\271\362\247\265\224\362\211\215\263\361\236\240\220\362\270\261\237\363\202\205\271\363\256\257\236\364\201\204\240\364\206\212\253\363\272\242\240\361\274\263\200\362\274\266\241\363\221\234\203\362\215\231\260\363\225\220\245\364\204\221\202\362\227\205\220\364\203\223\256\363\273\207\253\364\206\241\240\361\201\256\215\362\245\210\276\363\210\203\224\362\254\260\200\362\261\235\234\363\211\260\207\360\270\260\201\363\264\230\216\363\225\206\272\362\211\252\236\363\233\251\247\360\231\244\205\361\265\217\267\361\200\277\202\362\240\243\200\362\261\275\267\361\214\220\203\363\254\253\267\360\274\221\266\361\205\234\216\363\237\246\213\360\274\202\252\362\214\275\277\364\202\240\221\361\241\254\240\361\275\270\260\360\262\256\272\361\222\210\213\360\230\232\231\361\240\211\266\363\224\212\212\362\211\240\231\360\241\277\207\362\222\264\211\361\230\265\255\362\217\236\203\362\235\247\241\361\226\216\226\361\273\260\246\360\221\270\237\360\240\241\253\361\207\224\265\360\263\243\257\363\262\212\202\363\260\265\206\362\257\243\244\362\273\245\211\360\226\271\240\363\236\257\252\362\233\252\236\363\246\236\255\360\244\260\235\360\223\253\235\363\223\272\236\361\214\200\254\362\246\240\202\361\207\205\262\363\250\230\215\360\232\241\216\362\223\273\251\363\277\275\225\361\215\261\205\363\216\235\217\361\250\265\273\360\250\251\265\363\210\276\214\360\236\202\246\362\235\231\213\364\216\275\244\361\245\216\207\360\255\234\222\362\242\211\244\363\232\250\230\363\257\213\242\362\254\217\261\362\272\260\265\363\262\265\234\363\215\231\276\360\266\215\262\363\273\201\235\362\254\246\241\362\276\253\257\360\251\234\201\362\242\254\217\364\206\215\222\362\257\273\214\361\230\235\215\361\245\260\204\360\264\263\222\361\230\222\234\362\251\277\215\363\213\257\220\363\212\234\226\362\207\202\231\362\247\233\263\361\233\261\276\361\202\202\236\361\224\276\231\363\263\223\205\360\236\244\210\361\237\230\277\363\235\237\214\362\206\260\202\362\215\270\244\362\231\247\216\360\266\240\205\363\240\234\205\364\211\272\211\362\211\202\254\362\236\234\224\363\236\226\200\364\204\267\206\363\202\242\272\361\242\267\226\363\271\246\214\363\207\206\233\361\201\241\227\363\204\272\207\363\244\264\203\363\246\224\224\362\202\232\250\361\203\233\276\364\206\214\264\361\215\213\273\361\231\237\260\362\256\232\237\361\251\207\202\362\216\214\222\362\263\267\251\360\237\273\265\363\211\235\261\360\254\203\242\360\250\246\273\360\265\241\277\363\261\213\256\361\233\277\271\361\210\230\227\360\251\202\211\361\250\233\243\361\263\257\254\363\250\227\270\360\242\216\257\362\231\201\233\363\226\233\247\364\217\235\237\361\264\213\261\362\254\267\244\363\273\230\211\362\204\271\210\360\275\276\271\362\212\210\211\361\200\224\275\362\260\265\240\360\241\234\263\361\263\244\233\362\276\201\206\362\217\250\246\362\254\226\220\363\222\222\276\361\235\226\266\361\264\243\220\363\227\221\236\362\275\223\211\360\245\267\205\360\247\270\247\363\202\253\257\361\247\252\213\363\275\246\221\360\277\267\264\363\220\274\271\363\201\265\254\360\252\271\217\361\202\255\246\361\237\236\242\360\262\227\277\363\211\250\270\363\247\243\233\362\224\261\222\360\223\227\266\360\221\212\205\361\243\234\277\363\250\232\215\363\274\220\252\364\204\264\234\363\257\250\244\360\272\201\233\363\206\231\255\362\210\216\240\363\241\276\230\362\243\265\236\363\206\203\251\362\204\247\204\364\205\276\225\362\240\260\205\360\270\256\224\363\260\241\246\360\276\210\263\363\202\202\254\361\267\222\247\362\200\264\223\363\205\270\274\363\277\232\246\363\271\261\201\362\263\226\261\360\274\206\267\363\253\274\236\362\243\236\210\364\201\204\252\361\265\206\226\360\273\275\240\361\234\273\247\360\270\222\270\360\221\234\232\361\244\222\265\362\211\235\272\363\222\241\257\363\245\213\224\361\262\212\252\361\210\232\205\360\270\275\262\361\273\204\274\361\270\245\214\363\212\254\275\361\270\212\246\361\261\202\250\364\207\212\270\360\241\252\224\361\211\266\207\361\236\275\267\363\262\204\260\361\237\267\234\362\233\276\275\360\274\232\210\362\260\232\250\363\266\242\260\363\271\250\207\361\262\242\203\360\251\210\212\360\243\255\266\363\212\206\215\361\215\230\265\361\227\201\277\362\245\217\277\361\271\266\246\362\246\220\224\363\273\246\234\362\240\227\253\361\221\236\224\362\275\233\203\361\271\242\200\363\260\257\262\364\214\227\215\361\206\200\260\362\201\274\275\363\230\230\244\360\267\251\215\361\224\241\224\360\277\222\275\360\264\204\200\364\200\274\250\363\217\251\235\363\267\272\271\362\246\271\277\363\205\246\221\363\266\275\243\363\254\263\200\361\214\251\262\363\201\204\243\361\244\250\247\362\264\222\205\363\277\262\264\361\230\255\220\362\246\263\225\360\251\242\253\361\200\225\207\360\237\207\273\363\234\264\245\363\271\256\214\361\235\213\250\361\246\232\240\361\204\235\205\363\231\207\242\362\227\272\277\361\220\246\231\364\200\211\207\364\203\204\252\362\224\263\227\360\253\243\215\363\252\216\253\360\236\264\207\361\271\214\217\363\220\246\261\362\233\223\242\361\224\263\251\360\275\253\242\362\206\203\232\360\220\212\210\363\270\214\227\360\251\221\267\362\265\273\204\361\223\207\274\363\266\256\203\361\200\246\255\363\270\253\275\360\266\242\213\364\207\256\212\360\230\262\224\363\221\226\251\362\252\200\211\362\224\272\275\362\212\267\271\363\267\236\215\360\254\212\215\363\232\214\217\364\207\231\244\361\247\265\265\361\220\230\243\360\257\202\212\363\221\247\264\360\274\245\237\360\242\210\204\363\260\211\224\362\254\200\257\361\261\240\224\362\201\263\274\361\212\243\272\361\222\274\255\363\231\222\262\362\277\231\220\361\211\221\243\362\245\257\213\361\224\255\244\361\224\261\272\360\242\225\217\362\277\205\235\363\265\273\233\360\240\273\241\361\246\261\225\362\205\255\235\361\254\206\254\360\276\235\267\363\217\266\233\360\245\250\276\362\226\212\252\361\234\235\242\362\225\277\251\363\260\273\247\363\233\277\252\360\222\227\212\361\264\265\215\362\271\205\245\363\263\215\206\362\204\225\216\361\266\214\232\362\243\265\207\362\274\217\201\361\261\252\266\362\212\212\277\362\245\207\241\362\202\201\266\360\270\235\226\363\257\217\223\363\202\253\261\362\204\200\254\363\262\202\276\360\235\210\222\363\210\275\205\363\237\276\263\363\204\270\223\362\213\271\242\361\234\216\273\362\211\204\270\360\222\264\216\360\233\216\256\362\237\223\273\362\270\253\203\363\215\222\254\363\205\256\210\360\235\245\274\360\251\207\255\363\214\271\251\363\273\215\226\362\270\242\212\362\231\207\264\362\257\217\270\362\265\215\210\363\266\275\262\362\242\204\241\363\275\267\200\362\220\227\267\363\256\236\245\360\276\252\201\362\233\217\203\360\235\232\273\362\266\216\230\360\273\235\275\361\241\232\255\364\216\213\276\361\204\207\270\361\240\204\273\361\225\212\277\364\206\244\216\360\274\236\240\362\221\257\230\362\277\214\260\361\257\265\276\360\261\205\201\361\224\222\251\364\210\264\206\360\245\235\264\362\256\222\276\361\200\270\246\362\260\237\221\362\232\201\274\363\254\237\264\362\277\254\203\362\247\205\250\360\221\261\231\360\262\225\253\363\271\215\220\361\221\222\255\362\211\274\216\360\235\275\232\361\213\261\212\363\257\211\221\363\274\246\275\362\276\205\225\364\203\261\277\360\242\272\246\363\221\277\226\362\221\236\201\362\231\254\212\363\200\235\214\361\265\261\232\360\235\200\214\363\263\226\264\360\244\241\200\362\212\234\205\363\274\251\215\361\237\206\226\363\257\214\225\364\210\240\225\363\246\272\222\361\242\230\236\364\202\263\245\361\205\251\270\360\235\210\247\363\205\220\250\360\265\212\264\362\254\271\252\360\242\234\216\361\230\244\261\362\254\225\242\362\264\205\273\360\256\250\234\364\201\242\276\363\204\254\221\360\235\202\235\362\241\203\270\362\217\202\265\361\253\243\200\360\222\223\207\362\207\251\232\362\234\231\202\360\223\220\232\360\252\203\206\362\277\272\225\362\266\241\257\361\201\275\257\361\236\202\263\363\262\215\224\362\232\245\264\362\240\207\237\362\234\204\234\361\255\240\276\360\267\276\213\360\232\224\261\363\252\264\240\362\217\261\237\363\234\211\246\361\236\247\274\361\230\241\263\363\253\204\227\361\224\234\203\363\201\212\253\361\260\212\213\362\273\272\203\362\247\243\242\360\256\213\270\363\237\251\262\363\225\255\251\362\251\262\214\361\272\260\226\363\206\277\265\363\231\234\263\360\275\212\225\362\265\255\264\361\207\234\277\360\276\205\263\363\244\221\264\364\202\276\260\360\255\234\203\363\262\213\276\362\245\244\246\360\254\222\206\360\227\234\255\362\234\255\213\361\254\263\270\361\233\223\213\362\203\231\242\362\222\252\262\363\216\245\232\361\266\253\260\363\277\243\223\362\242\216\235\361\211\206\246\361\247\205\205\362\257\276\204\363\217\214\263\362\204\203\274\362\204\212\233\362\247\255\271\362\264\216\270\362\225\210\221\363\211\250\234\362\233\210\226\361\227\234\233\362\211\236\240\362\223\217\227\362\216\215\277\362\270\212\277\361\230\265\225\361\270\271\225\360\234\206\274\361\201\237\250\362\260\247\225\361\235\262\243\364\216\215\240\363\210\254\272\360\267\250\243\361\245\220\254\363\202\232\265\362\226\255\203\362\262\211\271\363\204\242\230\363\260\226\203\360\272\222\274\361\242\222\212\361\253\235\216\364\211\274\204\360\261\202\205\362\254\246\236\362\241\222\214\362\273\212\205\361\223\215\252\363\210\220\210\361\246\262\246\360\270\234\237\361\242\263\270\363\210\202\235\360\250\220\264\364\217\205\200\361\213\266\242\363\202\215\255\363\252\237\235\362\223\276\206\360\276\265\224\363\253\211\216\362\233\277\217\360\220\217\215\363\247\225\223\363\264\241\233\363\270\213\217\363\225\212\264\364\205\220\234\361\255\275\266\361\206\214\274\361\247\234\206\362\205\215\206\360\223\276\202\362\214\263\254\362\260\227\240\363\200\207\234\361\227\217\240\361\273\204\245\361\243\206\263\362\206\274\211\360\277\213\203\363\262\207\260\360\264\217\223\361\212\232\254\360\247\236\254\361\250\203\266\362\234\217\217\360\264\217\232\362\235\252\215\360\273\263\257\362\222\260\240\362\250\255\254\362\246\256\205\362\253\202\206\363\237\255\275\360\251\250\224\363\234\204\211\361\215\232\206\360\220\273\241\361\271\237\270\362\262\241\260\364\215\200\267\363\277\270\223\361\277\276\255\363\234\224\242\362\227\211\264\361\256\201\237\363\277\267\273\361\241\263\266\360\234\251\230\362\271\226\236\362\265\246\207\362\230\214\212\363\253\241\257\363\231\231\207\361\236\233\251\360\237\234\253\363\272\203\224\362\236\254\226\360\231\200\207\362\201\200\262\362\220\222\215\361\203\237\217\362\244\245\264\360\267\244\253\363\264\223\223\361\223\273\263\362\266\261\205\361\262\243\262\361\210\242\265\364\210\270\211\364\214\225\246\362\203\212\215\361\261\261\261\363\261\262\263\361\267\230\210\363\202\265\270\361\214\221\210\360\235\216\215\361\201\221\226\362\232\261\254\362\237\217\225\360\256\220\234\361\226\273\266\362\220\234\261\361\237\255\274\362\235\207\210\363\237\207\217\364\217\223\235\363\235\251\220\360\257\267\227\362\206\276\267\360\270\243\254\362\241\267\223\364\214\213\214\363\231\232\261\361\207\237\243\363\215\213\246\363\233\266\254\362\253\236\221\363\244\240\203\363\276\223\227\360\227\250\223\363\211\257\243\362\213\270\216\361\274\235\230\364\205\265\215\362\277\264\201\360\236\246\243\362\205\232\260\361\217\224\212\362\260\223\220\360\273\202\244\362\266\224\213\361\215\235\237\360\220\213\230\362\250\201\262\361\204\260\242\360\252\244\270\361\214\222\210\364\206\251\200\361\233\260\236\363\222\214\255\363\262\231\231\360\251\243\241\363\200\253\211\362\210\224\262\361\241\232\213\361\272\235\272\361\271\236\224\360\223\273\257\363\206\274\216\360\270\255\273\363\212\250\241\361\241\231\222\363\240\226\227\360\264\201\252\360\232\201\202\362\277\223\247\362\243\213\276\361\276\221\216\361\213\221\216\363\222\261\270\361\262\262\272\363\227\277\277\363\211\236\243\361\265\254\225\360\252\240\273\362\252\275\226\363\245\242\222\360\235\234\245\362\224\234\265\363\213\236\252\363\252\231\244\360\263\242\214\361\246\240\260\362\255\262\254\360\251\234\267\360\231\253\205\360\226\227\270\363\215\273\272\360\262\231\276\362\244\270\212\361\202\220\221\363\275\212\241\361\272\224\225\360\276\270\210\360\251\230\224\362\265\241\242\360\227\220\237\362\227\225\261\362\253\244\233\364\200\251\274\363\204\225\230\362\250\206\244\361\240\272\212\360\251\204\266\361\234\255\242\362\266\277\277\361\231\276\206\363\225\221\251\360\245\231\240\363\272\224\220\362\206\237\213\363\242\266\260\363\201\205\213\360\277\200\260\362\233\276\223\361\216\211\245\363\277\216\230\363\273\265\233\363\216\261\204\363\224\202\243\360\243\205\276\361\222\214\207\362\247\252\262\362\200\261\246\363\223\214\217\360\236\234\240\363\247\231\207\360\261\257\250\363\237\264\200\363\262\216\204\363\212\257\241\364\206\214\221\362\255\236\260\361\257\246\246\363\246\200\270\361\203\245\202\362\271\224\222\361\212\221\270\360\262\247\250\363\230\240\203\361\210\253\237\362\203\274\246\363\245\253\237\360\265\276\245\360\256\213\270\363\241\002\3076\212\362\264\237\271\362\260\263\240\360\272\242\251\362\246\257\236\363\212\246\200\363\270\251\225\361\273\200\212\361\233\240\251\360\261\221\241\360\260\225\232\360\230\222\214\360\251\237\235\363\204\271\202\362\261\233\261\363\237\262\201\360\233\247\277\364\217\204\214\363\250\233\266\363\216\222\256\361\245\262\234\360\264\236\237\364\214\226\230\363\217\252\262\363\242\204\233\361\272\232\210\361\225\256\207\362\206\264\253\361\200\204\226\362\270\257\224\361\236\233\206\362\213\220\203\360\240\250\240\361\251\200\245\362\211\264\211\361\234\202\251\361\237\272\232\361\224\273\275\362\274\266\276\360\251\241\250\360\247\205\243\361\220\217\220\363\215\276\230\361\270\211\225\362\263\266\204\361\271\253\250\361\225\261\252\363\276\232\227\362\267\214\271\361\241\220\205\363\200\217\255\362\263\214\256\362\242\257\212\362\230\273\264\361\221\240\262\364\210\240\272\362\235\201\242\361\252\214\276\362\227\262\231\363\274\277\275\361\243\247\243\363\275\254\261\361\250\214\275\361\261\212\225\363\202\210\262\361\250\275\240\361\273\234\203\362\215\204\255\363\222\236\206\360\254\216\227\360\230\265\230\363\234\217\274\364\207\211\217\361\220\267\263\361\206\265\214\363\276\241\211\362\266\222\213\361\252\253\231\360\273\216\240\363\240\204\276\363\266\263\231\363\277\233\272\363\227\233\261\360\227\231\246\361\266\261\256\362\224\212\231\361\267\262\226\363\275\220\237\360\226\272\246\360\232\266\220\362\212\274\277\363\263\263\276\364\207\271\242\362\235\213\243\363\244\251\243\363\263\272\250\362\243\256\202\363\227\223\274\364\212\241\250\363\225\231\224\362\273\231\275\360\227\261\275\360\273\215\221\360\277\217\223\361\263\242\201\362\252\260\222\361\250\220\230\362\205\244\256\362\260\237\277\363\201\243\275\363\261\251\236\363\275\245\266\364\206\274\265\363\200\232\257\360\263\265\267\361\230\251\272\363\224\226\271\364\213\203\216\363\217\256\274\360\227\233\212\360\221\215\236\361\237\257\273\361\267\263\203\360\220\203\246\362\274\266\263\362\254\226\235\361\261\206\256\360\227\205\275\362\225\250\206\362\207\232\204\361\241\240\267\360\264\262\251\361\265\231\247\363\276\276\210\360\226\266\251\361\262\237\264\362\226\257\253\361\265\206\277\360\241\267\224\362\022&\242\251\364\211\201\237\362\235\254\226\362\212\202\225\360\241\242\230\363\245\227\205\360\237\207\210\362\201\231\262\360\267\257\263\362\271\262\241\361\235\270\211\362\207\224\277\361\250\266\234\362\257\200\200\363\266\204\266\363\237\203\266\360\220\266\202\361\225\227\270\364\200\221\234\362\220\200\251\362\210\222\277\360\230\200\213\360\231\276\207\360\245\224\253\363\207\260\273\361\277\275\277\363\201\247\203\364\205\262\245\364\200\231\262\360\242\243\226\361\216\207\263\362\274\207\251\362\267\250\245\363\265\261\265\363\230\226\202\363\205\235\251\362\220\272\261\363\210\266\224\363\261\237\247\363\267\220\201\361\235\274\272\362\227\241\254\363\212\244\271\362\275\202\202\363\206\201\217\361\253\247\205\360\227\245\276\363\255\243\212\360\247\214\252\361\207\235\235\362\234\225\234\361\272\203\220\363\260\235\262\363\275\223\254\362\211\253\223\361\215\273\244\362\261\201\233\361\205\212\212\362\250\251\260\364\215\263\227\363\205\233\211\360\264\271\264\362\220\260\276\363\244\204\223\360\261\220\260\363\244\277\216\363\225\214\214\360\232\201\235\364\201\243\215\361\264\230\214\360\275\216\200\362\206\242\230\361\227\256\220\360\223\227\224\361\275\232\244\361\201\256\257\360\264\236\261\363\235\201\220\361\227\262\216\362\273\243\205\363\272\225\270\361\217\277\234\360\277\214\227\363\221\243\244\362\263\211\265\360\242\245\263\362\211\215\236\361\245\274\265\363\224\241\230\363\257\202\230\362\254\264\244\360\240\211\253\362\220\231\275\360\234\272\204\363\251\261\227\363\204\263\271\362\212\244\234\362\240\220\216\361\231\256\220\360\257\273\277\360\253\202\270\362\254\220\244\360\221\251\232\362\263\230\245\362\223\210\274\362\247\262\257\363\270\230\232\362\243\210\227\363\232\243\275\363\242\241\252\362\230\217\221\360\225\212\200\361\237\203\275\363\255\231\220\363\263\274\203\363\233\203\252\361\212\270\243\360\245\267\270\361\270\207\236\360\267\204\235\364\203\240\242\362\273\223\216\361\210\222\255\361\277\234\252\362\215\265\217\363\212\276\215\361\214\267\205\363\256\224\262\361\235\206\246\362\217\201\236\361\247\200\271\361\237\206\275\363\203\270\277\364\202\270\210\362\254\223\221\364\203\254\240\363\270\242\221\362\261\245\235\361\250\267\271\363\263\251\265\360\255\240\251\362\202\204\234\363\243\264\240\362\252\240\237\363\235\213\272\362\267\242\253\362\217\211\252\362\201\224\262\361\271\273\231\362\276\255\211\361\215\205\202\364\205\226\223\362\263\236\274\361\226\230\242\362\204\211\270\364\202\246\272\363\261\260\246\363\277\227\236\363\210\230\254\362\243\261\254\362\247\241\236\360\227\226\255\363\254\227\226\363\221\261\265\362\274\205\232\360\246\265\200\362\223\254\200\363\265\230\270\361\233\263\204\361\273\214\240\362\272\271\202\360\234\211\203\362\200\233\255\361\002\337qS200\210\363\217\215\210\362\203\257\252\363\203\226\215\362\216\214\247\362\252\277\200\363\202\207\202\361\205\275\202\362\206\266\251\364\214\227\215\360\277\211\231\360\220\227\214\361\256\237\214\362\206\233\225\362\217\206\260\363\262\241\233\363\226\224\267\360\256\200\206\360\252\200\207\363\265\221\217\363\222\223\220\360\272\201\275\361\235\226\257\360\234\252\242\360\243\272\272\361\207\275\253\362\221\250\213\362\221\240\203\362\240\272\273\360\255\267\222\360\265\230\210\363\242\215\237\360\246\242\241\360\230\205\253\361\225\202\234\363\235\264\226\363\234\242\214\363\222\215\271\361\246\267\250\360\223\213\237\362\247\250\262\362\244\265\201\364\202\277\222\362\276\252\221\363\225\231\203\363\265\202\222\363\204\273\262\363\215\242\276\362\273\220\235\360\235\222\201\361\275\264\265\362\245\222\242\363\272\241\240\362\206\235\204\362\246\257\270\363\266\254\265\362\253\212\216\363\222\252\235\362\217\235\240\363\274\235\272\360\224\226\212\362\241\201\265\361\276\226\220d360\235\221\243\360\231\205\231\364\217\206\223\360\237\255\200\360\225\241\255\360\274\265\206\360\245\234\236\362\276\203\203\361\212\276\241\362\261\224\252\363\256\242\206\362\220\261\206\361\201\230\252\360\251\271\226\364\207\246\226\360\227\261\226\361\260\235\200\360\264\240\206\363\221\222\246\362\275\257\222\360\223\211\270\363\242\224\277\361\205\245\242\361\225\225\273\361\206\245\216\363\262\242\240\364\202\250\271\363\211\203\247\360\232\261\257\361\203\245\244\361\211\261\212\363\210\241\275\363\255\222\210\363\267\224\232\361\212\201\246\360\267\230\225\362\224\232\267\364\203\216\225\360\225\225\276\362\247\267\277\361\254\241\227\363\211\220\214\360\2570\237\360\264\223\221\364\202\276\215\362\217\217\227\361\217\234\266\361\211\221\252\363\276\221\240\362\243\270\241\362\276\202\261\361\267\206\210\362\266\237\235\362\207\202\227\362\213\274\242\360\250\245\201\362\230\256\212\360\232\266\205\364\206\251\271\363\270\252\251\361\225\221\250\362\224\220\215\362\237\251\225\363\213\245\233\363\224\244\242\360\272\273\257\362\220\260\245\362\275\210\243\363\260\235\212\360\253\201\226\360\260\216\233\362\200\201\254\362\245\240\205\363\242\216\254\362\267\246\257\362\210\233\244\361\233\200\210\361\244\273\236\361\203\255\265\362\247\274\211\362\254\277\247\362\250\233\212\364\207\206\225\362\275\205\211\363\252\206\266\364\216\231\251\362\214\223\221\360\242\271\221\363\244\201\221\361\207\263\271\362\275\217\260\360\250\274\230\361\251\241\216\362\274\254\214\361\244\226\250\362\266\265\267\362\214\217\262\363\242\215\225\362\270\223\231\360\240\250\234\360\270\231\256\361\204\273\220\362\273\273\212\363\257\211\275\364\202\243\226\361\255\250\205\360\251\224\257\360\255\200\260\362\213\242\207\361\232\266\266\364\217\213\256\360\226\256\264\361\241\243\265\363\254\274\206\364\216\222\233\361\207\246\244\361\264\203\212\361\205\244\270\361\243\255\215\362\253\231\215\363\271\227\265\361\267\244\233\363\271\273\216\362\273\253\247\360\247\247\216\362\205\264\253\362\250\236\267\363\270\225\262\363\237\277\236\363\204\251\241\363\276\203\207\361\201\233\250\363\240\220\220\360\256\242\262\361\233\207\223\362\203\210\201\363\276\264\235\362\237\272\224\363\213\255\225\360\242\264\271\363\277\264\231\363\273\200\204\362\231\271\226\362\234\211\264\361\204\201\251\363\277\223\224\362\214\205\204\361\224\267\200\360\256\231\267\360\225\230\204\363\222\200\257\362\250\236\252\361\226\272\235\361\265\253\221\364\206\201\231\362\237\202\206\360\261\257\212\362\202\220\243\362\220\251\215\364\206\263\264\360\264\247\256\360\275\245\261\362\212\240\271\360\255\225\216\363\230\253\272\360\271\266\220\363\241\277\227\362\207\231\256\361\246\213\215\360\250\253\235\362\224\226\241\360\262\266\213\362\270\226\236\360\255\232\241\361\271\243\207\360\277\220\211\363\252\254\252\361\263\240\227\363\204\243\202\363\247\246\245\363\251\207\251\363\240\275\201\360\221\215\214\362\212\232\200\363\243\264\220\363\252\215\227\360\277\271\264\362\267\214\224\362\261\242\256\361\234\243\220\361\254\232\231\361\210\232\216\362\250\210\243\360\270\277\277\364\200\240\263\363\224\237\265\361\247\265\232\364\216\272\252\363\230\244\207\361\201\232\261\361\237\231\264\361\211\256\265\363\253\220\225\362\214\212\222\362\264\232\277\361\201\203\271\363\267\266\212\362\274\271\213\362\252\226\267\361\274\226\270\363\230\226\265\360\232\257\207\362\202\225\266\360\255\250\214\362\274\230\200\363\255\242\266\360\267\241\210\362\201\274\201\360\222\233\206\360\225\235\262\362\245\277\255\364\207\275\252\363\203\262\201\361\265\240\262\360\237\255\264\361\275\224\223\363\220\252\242\362\261\223\273\362\275\233\250\360\242\272\277\363\266\265\262\364\212\211\235\362\243\206\273\362\242\201\226\362\251\230\213\363\216\207\260\360\231\252\245\362\225\271\226\361\234\240\225\363\222\245\203\362\242\275\251\361\214\233\272\363\235\271\275\361\236\217\211\361\220\253\241\360\226\204\216\363\254\255\210\363\264\271\217\360\243\226\265\363\276\220\215\363\216\237\256\362\266\245\273\362\225\206\253\360\225\246\245\362\226\207\224\362\206\234\201\362\223\247\233\361\265\260\234\360\277\217\271\360\265\216\250\363\236\213\224\362\203\204\251\364\215\213\215\361\265\252\214\363\222\234\275\363\212\211\211\363\262\256\200\363\241\243\241\362\201\245\254\361\205\232\252\361\202\220\234\361\277\235\234\363\236\205\274\362\254\214\262\363\252\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\7\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\30741267\362\204\260\231\362\204\200\232\360\235\251\264\362\220\272\263\363\234\217\233\362\200\254\204\362\206\212\270\360\230\265\223\362\232\221\220\364\213\257\211\360\264\276\231\364\217\264\216\361\252\201\210\362\272\251\275\362\264\214\270\362\252\263\200\361\244\252\227\363\231\253\231\360\276\216\235\361\251\207\247\360\276\272\206\363\271\201\211\362\243\224\226\360\253\276\243\362\201\221\230\361\263\216\217\361\234\234\262\361\240\237\205\361\240\244\201\363\256\246\277\363\271\215\226\362\234\206\225\363\265\273\250\362\263\233\241\360\276\206\223\361\233\256\211\363\264\212\266\361\255\250\204\360\237\254\246\363\252\250\246\361\273\233\233\362\260\234\244\362\253\227\261\362\274\270\216\363\223\246\201\364\216\256\217\360\266\256\266\361\242\211\204\362\243\264\206\362\275\222\267\361\221\255\261\361\203\255\240\362\261\252\214\361\237\216\223\361\236\211\220\363\264\272\222\360\263\265\267\361\241\261\250\362\233\207\275\360\257\270\242\364\203\273\215\361\215\210\225\362\271\256\267\362\234\225\256\361\217\253\246\363\204\267\213\360\264\236\200\362\233\220\220\362\250\273\201\363\254\247\222\362\277\231\204\362\270\227\273\361\261\277\274\362\253\260\267\362\252\272\200\364\212\251\215\360\253\205\211\361\232\256\277\363\241\210\220\360\251\222\254\360\242\250\213\362\205\205\276\360\220\254\252\362\257\247\215\361\262\276\252\361\272\262\234\363\255\232\223\360\221\224\202\362\267\245\245\360\237\211\247\363\224\257\201\360\237\235\210\361\226\223\213\362\262\267\217\361\233\210\235\363\255\221\215\361\206\225\224\360\231\224\264\361\266\277\270\361\211\231\257\363\205\261\210\363\265\216\246\364\216\213\261\362\257\240\226\360\276\200\264\360\262\273\265\361\241\245\240\363\230\211\230\361\263\246\227\361\267\227\216\360\223\200\234\360\235\216\253\362\242\205\276\361\210\260\203\363\264\251\257\361\257\217\232\362\223\225\201\360\263\274\257\362\232\200\223\360\231\246\270\362\263\217\237\363\210\220\210\361\245\264\256\363\257\227\251\361\233\265\247\363\275\247\256\362\212\233\210\360\260\271\250\363\207\261\231\363\244\252\265\362\277\233\205\362\252\277\211\360\263\244\201\363\205\271\216\363\213\235\201\364\216\231\221\361\266\205\257\363\274\262\237\362\261\271\272\362\250\244\252\364\204\225\274\364\211\274\236\361\234\233\217\363\223\266\205\361\247\246\272\361\237\263\214\360\227\247\260\360\246\260\205\360\224\211\207\360\262\273\204\360\241\240\202\363\275\250\223\360\274\276\232\362\226\210\270\360\240\200\271\362\263\256\231\363\233\261\242\361\270\233\223\362\241\235\271\360\254\211\264\362\255\277\212\363\242\264\260\363\227\206\200\363\264\210\276\363\257\223\201\362\264\205\212\363\262\252\252\364\211\210\263\360\237\246\203\362\240\246\205\362\274\236\236\363\266\272\251\361\236\217\207\360\273\224\236\361\262\207\204\362\264\212\230\361\213\252\233\360\226\211\276\363\235\227\275\360\267\230\272\361\216\227\231\362\254\257\211\360\252\242\236\360\257\230\204\361\233\245\207\361\227\202\244\361\231\216\277\364\213\231\246\362\273\207\241\363\215\241\250\363\202\205\255\361\232\237\270\361\245\274\243\363\272\233\277\361\211\276\210\364\203\217\277\363\263\211\242\364\202\263\213\364\217\233\220\363\230\212\263\362\246\207\230\362\251\205\277\360\277\230\240\362\224\227\235\363\270\212\201\360\276\255\241\363\250\200\257\363\260\226\233\361\216\240\253\364\206\262\230\363\262\215\270\361\205\244\205\364\210\237\253\363\271\204\277\363\274\202\272\362\210\207\262\360\225\236\247\360\237\246\207\363\210\255\226\361\277\226\201\363\276\225\276\363\212\224\251\363\231\265\232\363\205\273\214\362\231\252\211\363\217\270\226\363\216\214\206\363\243\266\236\361\264\214\212\363\210\262\204\361\245\270\201\362\247\260\242\361\263\233\267\362\201\241\223\361\232\267\214\360\225\217\210\361\267\233\246\363\272\243\252\363\247\214\232\363\202\212\273\363\200\237\217\361\263\263\223\362\222\270\264\360\242\270\227\360\271\277\263\363\272\260\263\362\237\266\215\362\267\233\265\361\246\201\226\360\242\270\220\363\251\244\257\362\220\271\267\360\236\264\236\362\216\253\227\360\277\271\273\364\210\214\215\362\234\216\265\364\200\215\205\362\276\232\262\360\272\214\221\362\272\270\224\364\205\256\223\361\236\216\242\361\277\222\277\360\226\217\223\362\210\227\225\363\245\200\271\362\270\240\215\363\225\215\272\360\243\202\203\363\210\273\207\364\213\266\255\362\203\263\247\361\251\205\264\363\275\227\212\363\200\201\263\363\201\261\212\363\220\255\213\361\264\242\224\360\231\267\250\364\214\245\274\362\255\233\264\363\204\200\200\362\254\202\221\363\255\263\261\360\222\242\260\362\233\272\261\363\253\256\234\361\207\273\211\360\231\254\225\363\205\245\270\363\220\215\216\361\216\263\260\360\267\201\223\362\277\273\255\363\214\225\232\360\271\247\212\361\244\237\247\360\251\254\202\363\217\207\247\360\271\225\237\361\230\242\274\361\204\253\237\361\217\246\261\362\212\275\213\362\202\203\234\363\262\253\236\361\262\275\201\362\241\267\272\363\231\243\201\362\224\257\204\362\207\222\221\361\251\205\201\362\234\233\273\362\235\262\211\362\237\263\205\362\202\242\236\361\242\200\232\360\241\210\202\361\216\255\255\361\256\202\241\364\211\200\253\360\257\215\205\363\273\271\206\362\234\215\265\360\220\205\220\362\223\266\254\361\257\227\245\362\255\244\266\361\237\224\221\363\267\232\222\362\225\202\202\361\246\241\253\361\241\267\272\360\231\237\277\361\241\211\231\360\221\216\251\363\215\277\255\361\240\207\223\361\215\212\212\360\240\212\265\363\271\274\237\361\266\257\272\360\276\264\275\363\221\245\256\364\216\237\256\361\273\225\266\361\201\231\245\363\231\260\247\362\243\236\252\362\224\250\231\363\236\217\206\362\261\247\200\363\264\205\273\363\253\265\242\360\263\245\266\360\251\222\256\361\203\231\211\362\261\265\225\360\252\257\236\362\205\221\237\363\275\212\215\362\222\257\225\360\263\210\227\361\223\263\277\362\264\234\212\362\256\237\200\362\267\222\267\363\273\253\240\362\215\244\210\361\237\201\267\362\275\265\245\362\236\217\204\363\224\200\266\360\234\217\266\362\203\254\257\360\253\277\216\361\271\207\266\363\244\213\250\363\213\245\233\363\234\217\234\362\224\205\242\360\253\210\240\361\201\254\255\360\271\231\263\364\206\221\254\362\246\254\240\364\213\245\274\360\231\255\205\363\274\227\236\360\225\246\244\362\210\227\267\361\267\256\210\362\213\273\243\361\212\264\226\363\204\264\263\360\272\243\264\360\233\202\224\360\221\231\251\360\273\221\245\363\263\253\236\363\273\231\213\362\224\205\253\362\225\231\270\362\242\262\254\364\201\203\273\361\215\215\210\363\233\232\202\360\274\232\236\362\254\241\251\361\247\246\274\361\257\236\231\362\270\237\224\360\274\230\237\363\223\272\253\363\251\201\242\363\230\241\245\363\210\273\244\361\251\257\211\362\276\213\220\361\263\275\240\362\241\224\262\361\234\225\200\361\266\263\267\363\243\272\245\362\217\212\255\362\225\252\244\363\226\215\264\361\263\225\222\360\247\242\222\363\273\273\247\364\202\246\233\362\202\251\272\361\204\235\206\363\244\225\253\361\250\207\254\363\263\264\241\362\244\237\236\362\206\243\262\361\271\273\274\361\237\236\264\364\210\201\204\363\211\244\247\361\222\246\266\361\256\266\243\361\235\275\222\362\255\267\254\363\245\226\250\363\203\272\224\363\247\204\211\361\247\265\245\362\223\237\204\363\222\264\241\360\267\241\204\361\220\214\247\364\215\213\230\363\275\273\260\362\217\237\271\364\205\250\261\360\226\207\224\364\202\203\215\362\275\222\203\363\255\256\247\363\244\256\242\362\244\221\250\362\272\256\273\361\227\262\253\360\221\274\201\361\276\230\202\361\244\264\246\364\202\232\261\360\246\246\255\361\256\224\231\362\266\213\231\361\256\267\251\362\223\275\267\362\220\241\233\360\235\245\254\361\257\252\265\361\237\271\264\362\226\272\254\363\237\230\250\361\222\227\270\361\234\264\261\360\221\211\220\363\263\222\273\362\261\235\214\360\222\241\231\362\236\224\234\362\257\226\210\360\245\232\265\363\244\233\216\363\201\247\207\360\275\226\253\360\223\213\215\363\213\255\214\362\264\210\254\361\220\252\246\361\234\247\202\362\221\203\253\364\203\246\270\361\244\253\232\363\254\207\222\361\265\215\205\360\221\242\202\363\271\262\252\362\212\272\200\360\250\270\236\363\243\220\236\362\203\273\256\361\217\225\241\362\270\242\242\362\261\201\220\362\277\235\274\360\231\244\271\363\224\213\252\363\267\231\223\362\261\206\274\362\200\261\236\361\265\210\257\361\203\235\273\363\213\252\212\363\216\266\206\362\243\232\215\361\267\240\270\362\203\206\241\362\223\256\271\361\271\275\205\362\271\245\217\360\275\237\230\362\260\262\263\360\255\275\251\363\254\225\264\361\211\200\224\363\247\233\252\362\263\272\221\363\233\261\227\363\267\231\230\363\262\256\203\364\213\200\246\360\224\236\216\361\252\224\256\361\255\213\204\362\246\246\213\361\244\241\234\362\216\276\225\360\253\204\202\360\233\211\245\362\200\200\270\361\212\235\276\363\222\256\263\361\236\247\216\360\274\263\266\361\270\220\207\362\252\216\212\363\233\252\217\363\270\203\243\360\251\221\263\362\206\272\276\363\207\245\274\360\235\247\206\362\222\222\252\362\265\244\240\363\223\255\202\362\265\211\263\360\252\203\277\361\246\235\227\362\247\241\212\360\247\264\230\361\207\203\216\361\220\241\241\362\241\263\272\364\217\221\245\361\234\226\272\364\217\225\254\361\266\250\241\361\274\237\220\362\211\241\270\362\201\220\246\360\246\233\276\363\227\221\270\363\272\234\264\362\266\206\231\362\264\230\266\363\252\240\202\361\210\243\260\362\276\203\225\360\244\227\225\364\214\233\210\363\224\246\262\363\233\215\276\362\257\246\210\361\203\243\201\363\211\223\271\364\215\260\243\362\202\211\234\362\236\225\211\363\200\264\213\360\246\270\231\362\214\225\265\362\261\234\205\363\207\246\266\363\217\232\207\363\200\224\251\361\200\230\204\363\226\224\246\361\255\274\204\364\211\216\203\362\234\255\270\362\203\202\266\363\204\272\267\360\226\264\255\363\203\243\242\363\220\236\213\361\203\205\200\361\232\244\204\362\273\240\242\361\276\235\202\360\231\220\226\361\215\231\214\361\251\202\253\362\270\237\236\362\257\214\230\361\245\213\227\360\230\274\224\361\206\211\216\361\257\270\252\360\232\235\236\362\212\227\266\362\204\213\247\360\242\223\220\363\253\263\211\360\237\201\263\363\212\221\255\360\264\260\264\364\216\276\230\363\214\271\255\360\243\253\235\363\201\202\226\363\251\215\274\361\242\277\221\361\227\207\216\364\215\242\222\361\265\220\266\360\257\221\201\362\225\220\213\364\215\276\277\364\210\260\246\363\224\212\223\363\257\255\230\361\244\270\257\360\262\235\245\361\201\220\247\361\253\274\225\362\262\206\267\363\222\242\250\362\202\252\253\362\213\265\272\362\246\265\244\362\274\243\253\361\211\234\265\363\255\234\242\362\247\234\221\363\201\227\213\361\202\231\261\363\273\274\264\362\221\205\252\363\232\262\271\363\242\237\232\363\272\225\240\360\252\231\240\363\216\231\262\360\265\204\232\363\215\201\211\360\221\215\264\361\237\261\260\363\221\205\210\364\213\223\277\360\262\260\236\363\255\210\231\361\217\203\274\363\250\266\206\360\253\275\202\364\203\224\217\361\272\277\213\361\264\240\271\363\243\217\252\360\244\222\247\360\243\233\211\362\260\245\245\360\267\212\203\362\207\245\275\361\255\265\273\363\255\217\245\361\271\240\213\362\226\271\277\363\221\245\214\361\273\224\252\363\204\253\245\360\226\211\253\363\277\240\276\363\212\224\204\360\250\202\257\362\232\206\246\362\242\224\255\362\262\211\263\361\266\277\264\360\240\232\207\364\200\226\224\363\254\201\233\360\267\235\271\363\270\206\240\363\244\233\237\362\202\267\230\363\270\213\221\363\246\246\254\362\253\216\242\362\207\211\273\363\233\217\215\361\217\224\226\361\207\261\205\361\264\232\252\362\203\275\204\361\213\232\277\362\227\266\254\362\253\252\200\361\266\225\214\362\213\202\221\362\203\246\237\363\202\257\211\361\257\224\206\361\247\247\274\361\245\246\226\362\223\231\234\360\275\212\230\363\224\244\212\360\243\226\214\360\230\201\261\363\221\267\205\360\270\267\270\360\232\255\265\362\273\217\267\361\236\251\256\362\234\272\222\364\217\265\225\362\255\237\267\362\254\272\241\362\260\251\234\362\231\250\207\363\231\236\262\360\231\205\205\360\231\204\273\362\245\240\232\363\232\265\204\361\212\200\216\360\253\203\245\362\276\274\224\364\204\216\214\360\275\275\244\362\244\217\237\361\257\211\200\362\272\271\233\361\200\253\246\361\241\247\270\363\241\224\246\362\213\210\254\361\262\225\212\360\266\214\232\363\245\236\256\362\236\222\277\361\241\260\257\363\265\244\250\363\264\263\264\360\246\261\250\362\243\263\234\363\220\217\222\361\246\206\230\363\267\261\235\363\237\244\233\364\216\216\273\363\275\221\231\363\204\251\247\361\200\235\203\362\207\254\233\361\274\213\213\361\240\217\242\362\220\244\222\362\210\217\212\363\220\277\272\362\244\215\243\362\273\247\245\361\205\203\221\361\241\232\277\363\241\225\274\362\210\211\235\364\202\225\275\364\202\213\237\360\250\277\246\363\247\201\211\362\233\233\263\362\252\212\204\363\207\225\203\361\241\244\222\361\210\270\203\362\212\276\203\360\220\250\246\362\272\252\277\362\266\246\257\363\273\221\232\362\256\261\247\362\215\210\242\360\226\247\255\361\264\271\262\360\275\214\213\360\241\256\251\364\212\243\205\360\233\205\263\361\226\271\264\362\223\204\207\361\257\270\243\363\207\244\233\362\245\272\221\364\210\215\213\361\271\216\240\362\204\272\250\362\243\266\233\362\220\216\254\363\245\214\211\363\245\212\252\362\200\271\270\360\264\212\216\361\226\223\245\363\244\232\265\362\224\216\271\363\200\202\266\363\225\230\272\362\213\275\211\363\275\270\226\362\200\260\277\364\204\245\276\361\206\236\251\362\221\202\270\362\254\204\223\363\262\242\255\362\230\240\226\361\236\265\277\362\273\226\252\361\243\226\264\362\271\276\223\360\220\224\224\363\265\203\247\362\262\224\223\361\252\265\245\361\201\213\250\363\203\202\247\363\216\264\232\362\254\233\204\364\202\236\244\361\233\225\224\363\223\273\263\360\272\242\237\360\257\253\263\361\270\224\250\363\274\230\236\364\213\203\204\361\232\247\257\362\202\265\264\361\226\262\220\361\215\210\250\362\242\213\236\361\277\206\231\363\263\210\251\361\250\204\245\363\206\242\231\360\237\274\250\360\233\255\271\361\271\207\237\363\227\246\216\363\247\266\264\362\272\216\262\362\237\220\245\363\226\202\250\361\274\243\231\362\272\221\247\363\273\251\234\362\201\240\227\362\232\200\261\361\265\224\207\363\211\214\217\362\203\233\255\364\202\226\214\362\250\242\203\361\234\276\257\361\247\251\244\360\262\245\204\361\213\262\256\362\205\213\252\363\221\215\227\361\217\211\227\363\245\253\240\361\204\215\225\361\267\215\227\364\206\245\256\362\250\271\240\361\261\274\233\361\224\267\201\360\257\260\232\360\220\273\232\360\243\230\246\360\257\264\203\363\217\210\216\364\211\232\232\364\212\275\272\360\247\215\273\363\272\213\200\360\273\275\273\362\233\265\247\362\267\267\242\364\207\243\261\361\275\207\253\362\244\226\222\361\255\275\227\363\232\276\265\360\222\210\245\362\212\270\264\362\256\257\235\360\267\266\234\361\207\271\231\363\266\210\240\362\247\217\277\362\224\251\266\360\243\217\261\360\256\253\234\363\237\261\224\364\206\235\270\362\214\207\246\363\210\275\245\361\230\247\257\361\245\270\206\363\240\272\221\363\276\220\252\360\243\266\200\363\226\244\200\363\221\252\221\361\267\210\212\362\267\275\275\363\254\210\263\363\261\222\212\361\221\223\211\363\227\217\251\361\235\265\242\363\227\234\227\363\227\254\226\363\252\256\267\363\264\205\260\361\261\261\277\362\224\202\202\363\237\201\243\361\213\271\210\361\242\270\246\362\250\217\256\361\236\223\257\363\225\217\245\360\222\203\240\362\216\247\267\363\255\277\227\361\206\212\233\364\201\273\237\363\277\232\242\363\213\214\272\362\236\215\263\360\226\272\244\364\200\264\242\363\260\271\250\364\210\266\213\361\205\271\251\362\214\270\267\363\255\210\270\362\267\245\254\361\262\245\222\362\267\232\256\360\242\230\224\363\217\206\270\360\226\250\235\362\253\200\222\362\217\254\234\363\277\245\207\363\271\255\221\362\246\270\220\362\243\263\210\363\235\256\214\362\264\263\225\363\266\226\240\363\252\240\236\362\220\200\251\362\203\243\271\360\234\253\272\360\260\214\225\361\231\241\254\360\247\207\221\361\242\247\202\363\256\230\243\361\266\214\257\362\241\216\250\360\271\231\252\362\233\236\264\362\210\253\272\362\212\264\260\362\257\263\213\362\262\212\214\362\241\261\215\360\230\253\214\363\224\236\234\361\205\231\227\361\261\265\236\363\232\203\257\363\263\256\254\362\201\215\221\361\222\202\224\363\217\244\204\360\224\207\267\362\210\243\241\363\215\272\233\363\221\273\241\361\213\253\234\360\225\202\264\360\271\232\237\360\224\225\226\360\273\243\222\360\231\227\264\361\217\263\252\362\207\214\264\361\225\232\222\360\233\242\242\363\277\206\250\360\252\224\277\361\265\200\242\360\242\272\265\362\203\277\253\363\266\221\257\363\227\240\262\363\232\270\261\360\263\251\213\363\272\202\212\360\266\235\263\360\242\225\233\361\207\255\210\363\215\204\252\361\261\214\263\364\211\224\215\362\272\200\225\364\211\233\254\363\214\263\252\361\223\256\253\360\220\254\234\364\217\212\210\361\247\240\235\361\235\205\210\360\275\204\214\362\227\220\220\361\250\225\210\362\211\212\242\363\203\267\230\360\277\224\252\360\274\231\210\362\277\252\222\361\261\235\261\364\210\255\255\361\221\235\203\364\211\205\252\363\237\217\206\360\272\207\215\363\225\260\244\361\205\206\244\360\220\233\215\361\210\265\217\360\275\253\272\362\232\276\234\360\252\212\235\361\266\226\203\364\217\275\235\362\234\227\276\363\264\243\227\362\251\202\241\364\202\203\252\360\221\225\265\364\201\246\220\361\255\224\234\361\215\217\244\364\212\210\251\360\277\272\275\360\224\265\217\360\262\241\246\360\230\256\240\362\237\203\205\360\220\266\200\360\273\274\205\360\250\226\260\362\225\240\251\362\234\223\237\362\272\261\205\362\254\214\263\363\263\270\216\362\225\224\202\361\264\230\246\361\256\231\252\360\270\254\253\360\223\277\233\362\256\200\243\364\205\220\263\361\264\213\214\363\262\251\227\360\274\277\205\362\222\221\255\363\252\227\212\360\244\265\203\362\227\250\237\363\214\235\243\360\257\247\274\360\234\265\222\363\217\234\266\363\220\250\240\362\265\203\235\361\270\213\267\360\252\266\220\361\277\210\201\362\273\214\237\361\254\244\207\363\246\237\274\363\210\255\257\362\255\227\266\360\227\236\214\363\274\202\226\363\232\207\234\363\235\214\276\363\230\271\270\361\231\207\241\360\222\226\253\364\213\260\265\360\261\210\220\363\240\262\252\362\225\242\214\360\245\213\277\360\255\201\206\362\214\206\214\362\234\245\271\363\267\234\222\361\270\207\221\362\247\233\237\361\257\201\271\363\204\245\232\363\241\255\252\361\243\216\247\362\204\246\202\363\267\230\235\360\267\200\210\361\204\232\254\363\216\223\226\361\204\232\257\363\262\274\243\363\200\277\262\361\234\261\242\362\210\265\226\361\215\271\263\361\272\247\237\362\253\247\210\363\277\204\265\363\233\226\207\362\257\201\232\360\230\265\241\360\277\212\251\362\274\225\266\362\221\214\267\360\223\205\215\360\247\206\222\361\272\253\250\363\231\270\270\363\276\267\202\360\273\235\263\363\261\234\200\361\222\273\256\363\261\261\212\362\236\253\247\363\252\213\210\362\251\251\237\363\216\240\274\361\223\236\216\362\227\261\274\362\257\220\213\362\227\245\215\360\244\212\227\363\230\215\250\363\272\254\240\363\260\275\263\361\223\260\237\361\244\261\276\361\201\250\240\363\227\273\236\361\275\267\225\364\212\250\266\360\236\263\221\363\270\256\236\362\236\221\224\361\265\266\212\360\232\260\244\363\215\252\211\363\234\260\261\362\275\212\226\360\274\271\247\361\261\213\262\364\210\200\224\362\221\240\241\364\201\207\203\362\201\224\260\361\244\254\264\364\217\232\273\363\251\223\214\363\235\273\212\363\251\246\261\362\222\231\236\363\205\216\234\363\201\266\253\360\225\230\242\360\256\206\251\361\260\271\272\361\234\237\251\363\217\207\231\362\231\243\270\361\225\256\277\360\234\250\231\363\225\203\234\361\210\271\261\362\224\274\240\360\241\205\225\361\231\207\261\363\207\247\205\361\273\252\242\360\262\245\271\362\275\270\212\360\270\241\212\360\256\274\246\361\246\216\253\361\251\266\225\363\244\246\263\363\235\240\260\360\242\231\267\361\240\226\240\360\226\216\270\361\216\264\274\362\273\221\230\363\222\220\225\362\233\275\244\360\242\233\265\360\250\240\274\362\216\277\256\360\273\226\212\361\261\216\216\360\272\203\203\362\217\243\270\363\212\235\264\363\235\253\206\362\230\264\277\360\270\267\276\361\236\202\224\362\206\252\275\362\230\201\267\362\222\260\226\360\254\275\210\363\233\257\236\361\240\252\265\363\275\236\265\361\226\267\252\360\263\250\257\362\267\250\250\360\231\241\274\360\246\265\237\363\271\247\253\360\245\247\252\362\261\237\255\361\274\230\263\362\202\255\275\360\261\233\277\364\207\211\215\360\273\274\257\360\231\221\205\361\271\271\202\363\220\217\235\363\256\201\237\362\204\274\273\361\254\225\264\363\216\216\242\360\222\212\273\361\256\211\235\361\276\271\264\363\242\267\230\362\227\234\250\363\242\214\225\363\205\261\277\362\200\253\262\362\251\277\204\361\252\225\231\361\262\223\270\361\256\244\271\361\231\245\250\363\205\256\215\361\241\204\257\361\226\203\247\363\234\261\240\363\250\207\267\363\257\275\244\360\227\204\200\363\216\226\227\360\246\275\252\360\220\256\203\363\215\256\223\360\236\222\261\361\201\254\271\362\275\216\254\364\210\232\274\364\211\256\233\363\267\264\216\363\277\230\233\362\226\256\257\362\252\230\216\362\201\260\245\361\242\243\271\362\254\230\221\362\275\276\262\362\275\270\221\362\207\230\203\361\267\264\266\361\225\267\263\364\215\273\240\363\202\201\276\361\237\256\215\361\234\274\263\362\256\273\246\363\263\274\273\361\247\203\235\363\244\271\277\361\247\251\253\361\274\211\240\361\257\246\216\363\220\215\210\360\221\220\221\362\237\234\215\360\224\255\262\360\273\236\266\364\200\257\243\361\207\274\276\361\267\232\227\361\220\215\246\363\252\253\236\363\276\220\231\361\240\214\271\363\221\271\214\361\256\241\273\005\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\0: 37\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\0_user_agent"
- }
- channel_actions {
- add_n_bytes_writable: 2314850208468434944
- add_n_bytes_readable: 54
- }
- channel_actions {
- add_n_bytes_readable: 18014398509481984
- wait_ms: 15616
- }
- channel_actions {
- add_n_bytes_writable: 11532154961920
- }
- channel_actions {
- add_n_bytes_writable: 18014398509481984
- add_n_bytes_readable: 15616
- wait_ms: 2293760
- }
- }
-}
-actions {
- create_call {
- method {
- value: "dns:segeW:[rver"
- intern: true
- }
- host {
- value: "dns:server"
- intern: true
- }
- timeout: 193985152
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- flags: 80
- }
- operations {
- flags: 65416
- }
- operations {
- send_message {
- }
- }
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- advance_time: 10000000
-}
-actions {
- queue_batch {
- operations {
- receive_message {
- }
- }
- }
-}
-actions {
- advance_time: 0
-}
-actions {
- check_connectivity: true
-}
-actions {
- create_call {
- propagation_mask: 1953785960
- method {
- value: "dns:server"
- intern: true
- }
- host {
- value: "e:="
- intern: true
- }
- timeout: 1000000000
- }
-}
-actions {
- ping {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- ping {
- }
-}
-actions {
- advance_time: 1000
-}
-actions {
- advance_time: 10000000
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "hello world"
-}
-actions {
- create_call {
- method {
- value: "/foo"
- }
- timeout: 1000000000
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- flags: 80
- }
- operations {
- flags: 1
- }
- operations {
- receive_initial_metadata {
- }
- }
- operations {
- }
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- advance_time: 1
-}
-actions {
- watch_connectivity: 11000000
-}
-actions {
- ping {
- }
-}
-actions {
- queue_batch {
- operations {
- receive_message {
- }
- }
- }
-}
-actions {
- create_call {
- method {
- value: "/foo"
- }
- timeout: 1000000000
- }
-}
-actions {
- queue_batch {
- operations {
- receive_initial_metadata {
- }
- }
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- resize_resource_quota: 1
-}
-actions {
- destroy_call {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- receive_close_on_server {
- }
- }
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- send_close_from_client {
- }
- }
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- receive_message {
- }
- }
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- get_target {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- send_message {
- message {
- value: "hello world"
- }
- }
- }
- }
-}
-actions {
- request_call {
- }
-}
-actions {
- queue_batch {
- operations {
- receive_close_on_server {
- }
- }
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 4293996864
-}
-actions {
- poll_cq {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- receive_message {
- }
- }
- }
-}
-actions {
-}
-actions {
- get_peer {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/append b/test/core/end2end/fuzzers/api_fuzzer_corpus/append
deleted file mode 100644
index 20e315d2c81..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/append
+++ /dev/null
@@ -1,33 +0,0 @@
-actions {
- create_channel {
- channel_actions {}
- }
-}
-actions {
- create_call {
- method {
- value:
- "contenttype"
- }
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- metadata {
- key {
- value:
- "content-type"
- }
- }
- metadata {
- key {
- value:
- "content-type"
- }
- }
- }
- }
- }
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/call-complete-streaming b/test/core/end2end/fuzzers/api_fuzzer_corpus/call-complete-streaming
deleted file mode 100644
index 4d52068086d..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/call-complete-streaming
+++ /dev/null
@@ -1,618 +0,0 @@
-actions {
- create_server {
- }
-}
-actions {
- create_channel {
- target: "dns:server"
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- }
-}
-actions {
- create_call {
- method: { value: "/foo" }
- timeout: 1000000000
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {}
- }
- operations {
- receive_initial_metadata {}
- }
- }
-}
-actions {
- request_call {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- change_active_call {}
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {}
- }
- }
-}
-actions {
- poll_cq: {}
-}
-actions {
- change_active_call {}
-}
-actions {
- queue_batch {
- operations {
- send_message {
- message {
- value: "hello world"
- }
- }
- }
- }
-}
-actions {
- change_active_call {}
-}
-actions {
- queue_batch {
- operations {
- receive_message {}
- }
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- change_active_call {}
-}
-actions {
- queue_batch {
- operations {
- send_message {
- message {
- value: "hello world"
- }
- }
- }
- }
-}
-actions {
- change_active_call {}
-}
-actions {
- queue_batch {
- operations {
- receive_message {}
- }
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- change_active_call {}
-}
-actions {
- queue_batch {
- operations {
- receive_status_on_client {}
- }
- }
-}
-actions {
- change_active_call {}
-}
-actions {
- queue_batch {
- operations {
- send_status_from_server {
- status_code: 0
- }
- }
- operations {
- receive_close_on_server {}
- }
- }
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- queue_batch {
- operations {
- send_close_from_client {}
- }
- }
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
-
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/call-complete-unary b/test/core/end2end/fuzzers/api_fuzzer_corpus/call-complete-unary
deleted file mode 100644
index 5c9d9d6c052..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/call-complete-unary
+++ /dev/null
@@ -1,496 +0,0 @@
-actions {
- create_server {
- }
-}
-actions {
- create_channel {
- target: "dns:server"
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- }
- channel_actions {
- wait_ms: 1000
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- }
-}
-actions {
- create_call {
- method: { value: "/foo" }
- timeout: 1000000000
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {}
- }
- operations {
- receive_initial_metadata {}
- }
- operations {
- receive_message {}
- }
- operations {
- send_close_from_client {}
- }
- operations {
- receive_status_on_client {}
- }
- }
-}
-actions {
- request_call {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- change_active_call {}
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {}
- }
- operations {
- send_message {
- message {
- value: "hello world"
- }
- }
- }
- }
-}
-actions {
- queue_batch {
- operations {
- send_status_from_server {
- status_code: 0
- }
- }
- operations {
- receive_close_on_server {}
- }
- }
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 1000000
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/channelz-crash b/test/core/end2end/fuzzers/api_fuzzer_corpus/channelz-crash
deleted file mode 100644
index 0eaa5877cf8..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/channelz-crash
+++ /dev/null
@@ -1,19 +0,0 @@
-actions {
- create_channel {
- target: "\001\000\000\000\323\273`*"
- channel_args {
- key: "grpc.channelz_channel_node"
- resource_quota {
- }
- }
- channel_args {
- resource_quota {
- }
- }
- channel_args {
- resource_quota {
- }
- }
- }
-}
-
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-4849973711994880 b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-4849973711994880
deleted file mode 100644
index cd6a2537b53..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-4849973711994880
+++ /dev/null
@@ -1,55 +0,0 @@
-actions {
- create_channel {
- target: "dse:snrver"
- }
-}
-actions {
- create_call {
- method {
- value: "%:?"
- }
- }
-}
-actions {
- queue_batch {
- operations {
- receive_initial_metadata {
- }
- }
- operations {
- send_message {
- message {
- intern: true
- }
- message {
- intern: true
- }
- message {
- intern: true
- }
- message {
- value: "bob"
- }
- message {
- intern: true
- }
- message {
- intern: true
- }
- message {
- intern: true
- }
- message {
- intern: true
- }
- message {
- intern: true
- }
- }
- }
- operations {
- receive_initial_metadata {
- }
- }
- }
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-5180720131997696 b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-5180720131997696
deleted file mode 100644
index 20c76dc1da1..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-5180720131997696
+++ /dev/null
@@ -1,106 +0,0 @@
-actions {
- create_channel {
- target: "unix:"
- channel_actions {
- add_n_bytes_writable: 150
- wait_ms: 150
- }
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- create_server {
- channel_args {
- key: "grpc.http2.max_ping_strikes"
- }
- }
-}
-actions {
- request_call {
- }
-}
-actions {
- advance_time: 1886680168
-}
-actions {
- watch_connectivity: 1886680167
-}
-actions {
- advance_time: 1886680168
-}
-actions {
- ping {
- }
-}
-actions {
- advance_time: 4194238464
-}
-actions {
- shutdown_server {
- }
-}
-actions {
- advance_time: 1543528704
-}
-actions {
- advance_time: 4194238464
-}
-actions {
- get_target {
- }
-}
-actions {
- advance_time: 1886680168
-}
-actions {
- advance_time: 745829480
-}
-actions {
- enable_tracer: "all"
-}
-actions {
- request_call {
- }
-}
-actions {
- shutdown_server {
- }
-}
-actions {
- advance_time: 1886680168
-}
-actions {
- advance_time: 1886680167
-}
-actions {
- advance_time: 1886680168
-}
-actions {
- advance_time: 1543528704
-}
-actions {
- ping {
- }
-}
-actions {
- advance_time: 4194238464
-}
-actions {
- advance_time: 4194238464
-}
-actions {
- advance_time: 4194238464
-}
-actions {
- advance_time: 4194238464
-}
-actions {
-}
-actions {
- destroy_call {
- }
-}
-actions {
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-5590514309398528.test b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-5590514309398528.test
deleted file mode 100644
index 4735742e93b..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-5590514309398528.test
+++ /dev/null
@@ -1,117 +0,0 @@
-actions {
- create_server {
- channel_args {
- key: "grpc.resource_quota"
- resource_quota {
- }
- }
- channel_args {
- }
- }
-}
-actions {
- create_channel {
- target: "dns:server"
- channel_args {
- resource_quota {
- }
- }
- channel_args {
- i: 1
- }
- }
-}
-actions {
- create_call {
- method {
- value: "dns:sers:s"
- intern: true
- }
- timeout: 999962120
- }
-}
-actions {
- create_call {
- method {
- value: "dns:se0s[s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000W\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D08796287\000\000\000\000\000\000\000\000\000\000\000\000\000"
- }
- host {
- value: "dns:sers:s"
- intern: true
- }
- timeout: 1000000000
- }
-}
-actions {
- get_peer {
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- }
- operations {
- flags: 1634992128
- }
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- advance_time: 10000000
-}
-actions {
- queue_batch {
- }
-}
-actions {
- advance_time: 10000000
-}
-actions {
- watch_connectivity: 10131072
-}
-actions {
- advance_time: 80
-}
-actions {
- create_call {
- method {
- value: "dns:sers:ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
- intern: true
- }
- host {
- value: "dns:sers:s"
- intern: true
- }
- timeout: 999962120
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- destroy_call {
- }
-}
-actions {
- resize_resource_quota: 0
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- }
- operations {
- flags: 1634992128
- }
- }
-}
-actions {
- disable_tracer: "dns:sers:s"
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a807143b6ea93ba41d3b8e76bb99d06022c82565 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a807143b6ea93ba41d3b8e76bb99d06022c82565
deleted file mode 100644
index b96a5fd2448..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a807143b6ea93ba41d3b8e76bb99d06022c82565
+++ /dev/null
@@ -1,21 +0,0 @@
-actions {
- create_channel {
- channel_actions {
- }
- }
-}
-actions {
- create_call {
- method {
- value: "contenttype"
- }
- }
-}
-actions {
- queue_batch {
- operations {
- receive_initial_metadata {
- }
- }
- }
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-on-unknown-compression-algorithm b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-on-unknown-compression-algorithm
deleted file mode 100644
index 0ef0af809d2..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-on-unknown-compression-algorithm
+++ /dev/null
@@ -1,19 +0,0 @@
-actions {
- create_channel {
- target: "unix:phttpShttp6\327\227Go"
- channel_args {
- key: "grpc.default_compression_algorithm"
- i: 4702337453602635775
- }
- }
-}
-actions {
- create_server {}
-}
-actions {
- check_connectivity: true
-}
-actions {
- advance_time: 6881403
-}
-actions {}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/create_connection.textproto b/test/core/end2end/fuzzers/api_fuzzer_corpus/create_connection.textproto
deleted file mode 100644
index 294a1687ff5..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/create_connection.textproto
+++ /dev/null
@@ -1,86 +0,0 @@
-actions {
- create_server {}
-}
-actions {
- create_channel {
- target: "dns:server"
- }
-}
-actions {
- create_call {
- method: { value: "/foo" }
- host: { value: "bob" }
- timeout: 1000000000
- }
-}
-actions {
- request_call {}
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {}
- }
- operations {
- send_message {}
- }
- operations {
- send_close_from_client {}
- }
- operations {
- receive_initial_metadata {}
- }
- operations {
- receive_message {}
- }
- operations {
- receive_status_on_client {}
- }
- }
-}
-actions {
- change_active_call {}
-}
-actions {
- advance_time: 10000000
-}
-actions {
- advance_time: 1000
-}
-actions {
- advance_time: 10000000
-}
-actions {
- advance_time: 100000
-}
-actions {
- poll_cq: {}
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {}
- }
- operations {
- send_message {}
- }
- operations {
- send_status_from_server {}
- }
- operations {
- receive_message {}
- }
- operations {
- receive_close_on_server {}
- }
- }
-}
-actions {
- advance_time: 100000
-}
-actions {
- poll_cq: {}
-}
-actions {
- advance_time: 100000
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/get-leak b/test/core/end2end/fuzzers/api_fuzzer_corpus/get-leak
deleted file mode 100644
index 2828b2dcec2..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/get-leak
+++ /dev/null
@@ -1,32 +0,0 @@
-actions {
- create_server {}
-}
-actions {
- create_channel {
- target:
- "unix:\360\32367\227Go\254"
- }
-}
-actions {
- create_call {
- method {
- value: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
- }
- timeout: 1000000000
- }
-}
-actions {
- queue_batch {
- operations{
- send_initial_metadata {}
- flags: 64
- }
- operations {
- send_message {}
- }
- }
-}
-actions {
- advance_time : 10000000
-}
-actions {}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/long-path b/test/core/end2end/fuzzers/api_fuzzer_corpus/long-path
deleted file mode 100644
index 11af088665d..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/long-path
+++ /dev/null
@@ -1,164 +0,0 @@
-actions {
- create_server {
- channel_args {
- key: "grpc.http2.bdp_probe"
- }
- }
-}
-actions {
- create_channel {
- target: "dns:server"
- channel_actions {
- add_n_bytes_writable: 12366884576759382016
- add_n_bytes_readable: 5832
- }
- channel_actions {
- add_n_bytes_readable: 18014398509481984
- wait_ms: 15616
- }
- channel_actions {
- add_n_bytes_writable: 11532154961920
- add_n_bytes_readable: 14073748835532
- }
- channel_actions {
- add_n_bytes_writable: 18014398509481792
- add_n_bytes_readable: 15616
- }
- }
-}
-actions {
- create_call {
- propagation_mask: 2621440
- method {
- value: "nssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss¶sssssssssssssssssssss¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkôkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk”kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkw§kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkktvkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkÌ£kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkktvkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk”kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé1054éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééêéééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé¼ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\257dssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss2863ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛssssssssss\18446744073709551401sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\222fsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss:server"
- }
- timeout: 1935985152
- }
-}
-actions {
- request_call {
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- flags: 80
- }
- operations {
- flags: 1
- }
- operations {
- send_message {
- message {
- value: "http"
- }
- }
- }
- operations {
- }
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- advance_time: 10000000
-}
-actions {
- advance_time: 16
-}
-actions {
- advance_time: 10000000
-}
-actions {
- advance_time: 4
-}
-actions {
- check_connectivity: true
-}
-actions {
- create_call {
- method {
- value: "dns:server"
- intern: true
- }
- timeout: 1000000000
- }
-}
-actions {
- ping {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- ping {
- }
-}
-actions {
- advance_time: 1000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "dns:server"
-}
-actions {
- create_call {
- host {
- value: "dns:server"
- }
- timeout: 1000000000
- }
-}
-actions {
-}
-actions {
-}
-actions {
- advance_time: 10000000
-}
-actions {
- watch_connectivity: 9998208
-}
-actions {
- requess_call {
- }
-}
-actions {
- ping {
- }
-}
-actions {
- ping {
- }
-}
-actions {
- request_call {
- }
-}
-actions {
- get_peer {
- }
-}
-actions {
-}
-actions {
- get_peer {
- }
-}
-actions {
- shutdown_server {
- }
-}
-actions {
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/min_time_rounding b/test/core/end2end/fuzzers/api_fuzzer_corpus/min_time_rounding
deleted file mode 100644
index 7a14cd77e85..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/min_time_rounding
+++ /dev/null
@@ -1,15 +0,0 @@
-actions {
- create_channel {
- channel_actions {}
- }
-}
-actions {
- advance_time : 2
-}
-actions {
- watch_connectivity : 1
-}
-actions {
- poll_cq {}
-}
-
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/shifty-mcshifter b/test/core/end2end/fuzzers/api_fuzzer_corpus/shifty-mcshifter
deleted file mode 100644
index 6c615467610..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/shifty-mcshifter
+++ /dev/null
@@ -1,21 +0,0 @@
-actions {
- create_channel {
- target: "unix:"
- channel_args {
- key: "grpc.default_compression_algorithm"
- i: 71776123355660288
- }
- }
-}
-actions {
- create_server {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- advance_time: 6881279
-}
-actions {
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4563554393260032 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4563554393260032
deleted file mode 100644
index 242264d5470..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4563554393260032
+++ /dev/null
@@ -1,46 +0,0 @@
-actions {
- create_server {
- }
-}
-actions {
- create_channel {
- target: "unix::::::::::::::::::::::::::;:::::;:::::::::::::>:::::::::::::::::::::::9:::::\026I:::::::c::,:::\332\261::::::::::::::::"
- channel_actions {
- add_n_bytes_writable: 18446744073709551607
- add_n_bytes_readable: 18446744073709551607
- }
- }
-}
-actions {
- create_call {
- propagation_mask: 6881280
- method {
- value: "/foo"
- }
- timeout: 1953002608
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- }
- operations {
- send_message {
- message {
- intern: true
- }
- message {
- value: "Bh\007-600"
- intern: true
- }
- }
- }
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4572962842083328 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4572962842083328
deleted file mode 100644
index 423a784d56a..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4572962842083328
+++ /dev/null
@@ -1,29 +0,0 @@
-actions {
- create_channel {
- target: "unix::pehttpP~GK467440737046,,\343\236\234,,t49,Sac,,t"
- channel_args {
- key: "grpc.lb_policy_name"
- str: "unix::pehttpP~GK467440737046,,\343\236\234,,t49,Sac,,t"
- }
- channel_actions {
- add_n_bytes_writable: 32769
- wait_ms: 89
- }
- }
-}
-actions {
- create_call {
- method {
- value: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- }
- timeout: 858993408
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- }
- }
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4825725484269568 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4825725484269568
deleted file mode 100644
index 3335a8b4358..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4825725484269568
+++ /dev/null
@@ -1,400 +0,0 @@
-actions {
- create_server {
- }
-}
-actions {
- create_channel {
- target: "dns:server"
- channel_actions {
- add_n_bytes_writable: 1320
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- wait_ms: 20
- }
- channel_actions {
- add_n_bytes_writable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_readable: 20
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 532
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 1000
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 532
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 16400
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 2338333577814474752
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 34359738388
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 20
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 1000
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- wait_ms: 1000
- }
- }
-}
-actions {
- create_call {
- propagation_mask: 536870912
- method {
- value: "/voo"
- }
- timeout: 1000000000
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- }
- operations {
- receive_initial_metadata {
- }
- }
- }
-}
-actions {
- request_call {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 16960
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- }
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- send_message {
- message {
- value: "hello wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwworld"
- }
- }
- }
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- queue_batch {
- operations {
- receive_message {
- }
- }
- operations {
- send_message {
- message {
- value: "hello wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00\\000\\000\\000\\000\\000\"\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n }\n channel_args {\n str:\337\"\"\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n key: \"\\022\"\n str: \"\"\n }\n channel_args {\n resource_quota {\n }\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n }\n channel_args {\n key: \"xds_clustes {\\n create_server {\\n r_resolver_e\"\n str: \"http\"\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n }\n channel_args {\n }\n channel_args {\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n str: \"\"\n }\n }\n}\nactions {\n create_channel {\n channel_args {\n key: \"http\"\n str: \"\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwworld"
- }
- }
- }
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- send_close_from_client {
- }
- }
- operations {
- receive_status_on_client {
- }
- }
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- send_message {
- message {
- value: "hello"
- }
- }
- }
- }
-}
-actions {
- queue_batch {
- operations {
- send_status_from_server {
- }
- }
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- queue_batch {
- operations {
- receive_message {
- }
- }
- }
-}
-
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4902018028535808 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4902018028535808
deleted file mode 100644
index e8a4b0c7b13..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4902018028535808
+++ /dev/null
@@ -1,35 +0,0 @@
-actions {
- create_channel {
- target: "unix:"
- channel_actions {
- add_n_bytes_writable: 42932895744
- add_n_bytes_readable: 34359738368
- }
- }
-}
-actions {
- create_call {
- propagation_mask: 9869440
- method {
- value: "v"
- intern: true
- }
- timeout: 1000000000
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- metadata {
- key {
- value: "content-type"
- }
- value {
- value: "u-bin"
- }
- }
- }
- }
- }
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4953856886308864 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4953856886308864
deleted file mode 100644
index 50fd147eb5e..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4953856886308864
+++ /dev/null
@@ -1,46 +0,0 @@
-actions {
- create_channel {
- target: "unix::\360,\206=\211::::::::::6::::::::::::,:::\354\327:::::::::::::::::::::::::174515::::::::::::::::::::174515:::::::::::::::::, \310\013::::::, \310/::::::::::::::::::::::\177::::::::::::::::::::::::, \310/\032::travel/flights/summary/proto/fac::::::::, \310/\032::::::::::::::74515::::::::::::::\251:::, \310/::::::, \310/:::::::8c\017\303:::::::::::\177::::::::::::::::::::::::, \310/\032::::::::::, \310/\032::::::::::::::::::::::::::::::::::::::::::::::::::?:::::::::::::::::::::::::;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::?:::::::::::::::::::::::::;::::::::::::::"
- channel_creds {
- composite_channel_creds {
- channel_creds {
- composite_channel_creds {
- channel_creds {
- composite_channel_creds {
- channel_creds {
- ssl_channel_creds {
- }
- }
- }
- }
- call_creds {
- composite_call_creds {
- call_creds {
- composite_call_creds {
- call_creds {
- access_token: ""
- }
- call_creds {
- iam {
- }
- }
- }
- }
- }
- }
- }
- }
- call_creds {
- composite_call_creds {
- call_creds {
- access_token: ""
- }
- }
- }
- }
- }
- }
-}
-actions {
- check_connectivity: true
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5097648256581632 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5097648256581632
deleted file mode 100644
index 181a8a0ec67..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5097648256581632
+++ /dev/null
@@ -1,2086 +0,0 @@
-actions {
- create_server {
- }
-}
-actions {
- create_channel {
- target: "dns:server"
- channel_actions {
- add_n_bytes_writable: 1320
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 1
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 199
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 1
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 199
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_readable: 20
- wait_ms: 2432595770428919637
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 20
- add_n_bytes_readable: 20
- wait_ms: 1000
- }
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 10
- wait_ms: 1000
- }
- }
-}
-actions {
- create_call {
- method {
- value: "/foo"
- }
- host {
- value: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
- }
- timeout: 1000000000
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- }
- operations {
- receive_initial_metadata {
- }
- }
- }
-}
-actions {
- request_call {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- advance_time: 1000000
-}
-actions {
- shutdown_server {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- receive_message {
- }
- }
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- send_message {
- message {
- value: "hello wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwworld"
- }
- }
- }
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- shutdown_server {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "-3333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- cancel_all_calls_if_shutdown {
- }
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- enable_tracer: "\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- request_call {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- }
- operations {
- receive_initial_metadata {
- }
- }
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- advance_time: 0
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- queue_batch {
- operations {
- flags: 8069235
- }
- operations {
- send_status_from_server {
- }
- flags: 219
- }
- operations {
- send_close_from_client {
- }
- }
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1131758447
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- change_active_call {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- advance_time: 0
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- ping {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 6881280
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1449353472
-}
-actions {
- get_target {
- }
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
-}
-actions {
- change_active_call {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- advance_time: 0
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- advance_time: 1449197568
-}
-actions {
- advance_time: 262144
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- get_peer {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- advance_time: 0
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- advance_time: 0
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- shutdown_server {
- }
-}
-actions {
- shutdown_server {
- }
-}
-actions {
- advance_time: 0
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- get_target {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1633051392
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- advance_time: 0
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1510145
-}
-actions {
- check_connectivity: true
-}
-actions {
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- watch_connectivity: 4244570112
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- advance_time: 0
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- check_connectivity: false
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- advance_time: 0
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- cancel_call {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- check_connectivity: true
-}
-actions {
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- advance_time: 1449353472
-}
-actions {
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: false
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 5134505
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: false
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- advance_time: 0
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- watch_connectivity: 474896553
-}
-actions {
- check_connectivity: true
-}
-actions {
- enable_tracer: ""
-}
-actions {
- poll_cq {
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 656
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "2"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 6881280
-}
-actions {
- shutdown_server {
- }
-}
-actions {
- advance_time: 0
-}
-actions {
- ping {
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- poll_cq {
- }
-}
-actions {
- disable_tracer: "33333"
-}
-actions {
- advance_time: 1449353472
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 779436911
-}
-actions {
- poll_cq {
- }
-}
-actions {
- watch_connectivity: 1
-}
-actions {
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- receive_message {
- }
- }
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- receive_status_on_client {
- }
- }
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- queue_batch {
- operations {
- send_status_from_server {
- }
- }
- operations {
- receive_close_on_server {
- }
- }
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- queue_batch {
- operations {
- send_close_from_client {
- }
- }
- }
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- advance_time: 1000000
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5212802075197440 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5212802075197440
deleted file mode 100644
index e79c06b0a63..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5212802075197440
+++ /dev/null
@@ -1,17 +0,0 @@
-actions {
- create_channel {
- target: "unix::\360,\206::::::::::::\354\327::::::::::::::::::\213\300:::::174515:::::::::::::::::, \310/:::::::::::::::::::::::::::::::::::::::?:::::::::::::::::::::::::;::::::::::::::"
- channel_args {
- key: "grpc.channel_credentials"
- resource_quota {
- }
- }
- channel_creds {
- ssl_channel_creds {
- }
- }
- }
-}
-actions {
- check_connectivity: true
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5404970078044160 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5404970078044160
deleted file mode 100644
index d7dc5f4388d..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5404970078044160
+++ /dev/null
@@ -1,57 +0,0 @@
-actions {
- create_channel {
- target: "unix:"
- channel_actions {
- add_n_bytes_writable: 10
- add_n_bytes_readable: 1000002
- }
- }
-}
-actions {
- create_call {
- method {
- value: "0"
- }
- timeout: 869738192
- }
-}
-actions {
- queue_batch {
- operations {
- send_message {
- message {
- intern: true
- }
- message {
- intern: true
- }
- message {
- intern: true
- }
- message {
- }
- message {
- intern: true
- }
- message {
- }
- message {
- value: "Z"
- intern: true
- }
- message {
- intern: true
- }
- message {
- value: "http"
- intern: true
- }
- }
- }
- operations {
- receive_message {
- }
- flags: 11008
- }
- }
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5550279127072768 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5550279127072768
deleted file mode 100644
index 0a3cde58182..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5550279127072768
+++ /dev/null
@@ -1,48 +0,0 @@
-actions {
- create_server {
- }
-}
-actions {
- create_channel {
- target: "unix:"
- channel_args {
- key: "grpgrpc.max_r+ceivc.max_r+ceiv"
- str: "http"
- }
- channel_actions {
- add_n_bytes_writable: 34359738368
- add_n_bytes_readable: 34359738368
- }
- }
-}
-actions {
- create_call {
- propagation_mask: 2621440
- method {
- value: "htth"
- }
- host {
- value: "http"
- intern: true
- }
- timeout: 1935985152
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- metadata {
- key {
- value: "te"
- }
- value {
- value: "invalid-value"
- intern: true
- }
- }
- }
- }
- }
-}
-
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5560572032974848 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5560572032974848
deleted file mode 100644
index 985d096eb48..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5560572032974848
+++ /dev/null
@@ -1,33 +0,0 @@
-actions {
- create_channel {
- target: "unix::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:"
- channel_args {
- key: "grpc.use_local_subchannel_pool"
- i: -26859368237907295
- }
- channel_creds {
- composite_channel_creds {
- channel_creds {
- composite_channel_creds {
- channel_creds {
- ssl_channel_creds {
- }
- }
- call_creds {
- access_token: "grpc.use_local_subchannel_pool"
- }
- }
- }
- call_creds {
- access_token: "grpc.use_local_subchannel_pool"
- }
- }
- }
- channel_actions {
- wait_ms: 15
- }
- }
-}
-actions {
- check_connectivity: true
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-6703968097271808 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-6703968097271808
deleted file mode 100644
index cb144eb09f4..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-6703968097271808
+++ /dev/null
@@ -1,62 +0,0 @@
-actions {
- create_server {
- }
-}
-actions {
- create_channel {
- target: "dns:server"
- }
-}
-actions {
- create_call {
- method {
- value: "/foo"
- }
- timeout: 1000000000
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- }
- }
-}
-actions {
- advance_time: 9541248
-}
-actions {
- queue_batch {
- operations {
- send_close_from_client {
- }
- }
- operations {
- send_message {
- }
- }
- operations {
- receive_initial_metadata {
- }
- flags: 1895825408
- }
- }
-}
-actions {
- queue_batch {
- operations {
- send_message {
- message {
- value: "grp[.default_authority"
- intern: true
- }
- }
- }
- }
-}
-actions {
- advance_time: 10000000
-}
-actions {
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout1
deleted file mode 100644
index d77be10d56b..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout1
+++ /dev/null
@@ -1,105 +0,0 @@
-actions {
- create_server {
- }
-}
-actions {
- create_channel {
- target: "unix::::::::::::::::::::::::::;:::::;:::::::::::>:::::::::::::::::::::::9:::::\026I:::::::c::,::::\001::::::::::::::::"
- channel_actions {
- add_n_bytes_writable: 55
- add_n_bytes_readable: 106652627894272
- }
- }
-}
-actions {
- advance_time: 257
-}
-actions {
- create_call {
- propagation_mask: 83968879
- method {
- value: "u-bin"
- }
- host {
- value: "\361\243\275\203\361\226\215\265\363\274\273\202\363\234\232\265\360\243\230\252\361\241\227\253\360\233\262\234\363\242\252\237\362\231\230\250\360\260\203\220\362\225\271\250\360\264\257\267\361\201\262\227\363\235\256\253\360\250\251\207\362\254\245\212\362\270\225\220\362\227\235\250\363\227\272\241\362\254\272\206\361\251\216\231\361\200\275\233\363\242\271\201\361\252\244\252\361\253\210\274\361\214\232\240\362\272\276\276\362\234\247\242\345\225\225"
- intern: true
- }
- timeout: 1000000000
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- metadata {
- key {
- value: "oo"
- }
- value {
- value: "u-bin"
- intern: true
- }
- }
- metadata {
- key {
- value: "u-bio"
- }
- value {
- value: "u-bin"
- }
- }
- metadata {
- key {
- value: "u-biogrpc.lame_filter_error"
- intern: true
- }
- value {
- value: "u-bin"
- intern: true
- }
- }
- metadata {
- key {
- value: "u-bin"
- intern: true
- }
- value {
- value: "unix::pehttp,\014,,Sac,,t"
- }
- }
- }
- }
- operations {
- flags: 53
- }
- operations {
- flags: 1886680168
- }
- }
-}
-actions {
- request_call {
- }
-}
-actions {
- advance_time: 9869440
-}
-actions {
- create_server {
- }
-}
-actions {
-}
-actions {
- get_target {
- }
-}
-actions {
- enable_tracer: "u-bin"
-}
-actions {
-}
-actions {
-}
-actions {
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/validator-fail b/test/core/end2end/fuzzers/api_fuzzer_corpus/validator-fail
deleted file mode 100644
index c735e9a10c6..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/validator-fail
+++ /dev/null
@@ -1,67 +0,0 @@
-actions {
- create_server {
- }
-}
-actions {
- create_channel {
- target: "dns:server"
- }
-}
-actions {
- create_call {
- method {
- value: "/foo"
- }
- timeout: 1000000000
- }
-}
-actions {
- request_call {
- }
-}
-actions {
- queue_batch {
- operations {
- send_initial_metadata {
- }
- }
- operations {
- send_message {
- }
- }
- }
-}
-actions {
- change_active_call {
- }
-}
-actions {
- advance_time: 10000000
-}
-actions {
- advance_time: 10000000
-}
-actions {
- poll_cq {
- }
-}
-actions {
- queue_batch {
- operations {
- receive_message {
- }
- }
- }
-}
-actions {
- queue_batch {
- operations {
- send_close_from_client {
- }
- }
- operations {
- receive_close_on_server {
- }
- }
- }
-}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/xds-client-grpc-error-leak b/test/core/end2end/fuzzers/api_fuzzer_corpus/xds-client-grpc-error-leak
deleted file mode 100644
index 422b794c2b1..00000000000
--- a/test/core/end2end/fuzzers/api_fuzzer_corpus/xds-client-grpc-error-leak
+++ /dev/null
@@ -1,22 +0,0 @@
-actions {
- create_channel {
- target: "xds:SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSS\323\213MSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS}SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS\323\227^SSSSS¬SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS3209695SSSSSSSSSSSSS————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS18446744073709551330222222222222222222222222222222"
- channel_args {
- }
- channel_args {
- resource_quota {
- }
- }
- channel_actions {
- add_n_bytes_writable: 1952669952
- add_n_bytes_readable: 34657102164287744
- }
- }
-}
-actions {
- check_connectivity: true
-}
-actions {
-}
-actions {
-}
diff --git a/test/core/event_engine/fuzzing_event_engine/BUILD b/test/core/event_engine/fuzzing_event_engine/BUILD
index d4223a71a54..3766178ff34 100644
--- a/test/core/event_engine/fuzzing_event_engine/BUILD
+++ b/test/core/event_engine/fuzzing_event_engine/BUILD
@@ -28,6 +28,7 @@ grpc_cc_library(
deps = [
":fuzzing_event_engine_proto",
"//:event_engine_base_hdrs",
+ "//:time",
],
)
diff --git a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc
index 1449872124a..172e0afc3cd 100644
--- a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc
+++ b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc
@@ -14,25 +14,101 @@
#include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h"
+#include
+
#include
+#include
+
+#include "src/core/lib/gprpp/time.h"
+#include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.h"
+
+extern gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type);
+
namespace grpc_event_engine {
namespace experimental {
namespace {
const intptr_t kTaskHandleSalt = 12345;
-}
+FuzzingEventEngine* g_fuzzing_event_engine = nullptr;
+} // namespace
FuzzingEventEngine::FuzzingEventEngine(Options options)
: final_tick_length_(options.final_tick_length) {
- for (const auto& delay : options.actions.tick_lengths()) {
- tick_increments_[delay.id()] += std::chrono::microseconds(delay.delay_us());
+ GPR_ASSERT(g_fuzzing_event_engine == nullptr);
+ g_fuzzing_event_engine = this;
+
+ gpr_now_impl = GlobalNowImpl;
+
+ Restart(fuzzing_event_engine::Actions());
+}
+
+void FuzzingEventEngine::Restart(const fuzzing_event_engine::Actions& actions) {
+ grpc_core::MutexLock lock(&mu_);
+
+ tick_increments_.clear();
+ task_delays_.clear();
+ tasks_by_id_.clear();
+ tasks_by_time_.clear();
+ next_task_id_ = 1;
+ current_tick_ = 0;
+ // Start at 5 seconds after the epoch.
+ // This needs to be more than 1, and otherwise is kind of arbitrary.
+ // The grpc_core::Timer code special cases the zero second time period after
+ // epoch to allow for some fancy atomic stuff.
+ now_ = Time() + std::chrono::seconds(5);
+
+ // Whilst a fuzzing event engine is active we override grpc's now function.
+ grpc_core::TestOnlySetProcessEpoch(NowAsTimespec(GPR_CLOCK_MONOTONIC));
+
+ auto update_delay = [](std::map* map,
+ fuzzing_event_engine::Delay delay, Duration max) {
+ auto& value = (*map)[delay.id()];
+ if (delay.delay_us() > max.count() / GPR_NS_PER_US) {
+ value = max;
+ return;
+ }
+ Duration add = std::chrono::microseconds(delay.delay_us());
+ if (add >= max - value) {
+ value = max;
+ } else {
+ value += add;
+ }
+ };
+
+ for (const auto& delay : actions.tick_lengths()) {
+ update_delay(&tick_increments_, delay, std::chrono::hours(24));
}
- for (const auto& delay : options.actions.run_delay()) {
- task_delays_[delay.id()] += std::chrono::microseconds(delay.delay_us());
+ for (const auto& delay : actions.run_delay()) {
+ update_delay(&task_delays_, delay, std::chrono::seconds(30));
}
}
+void FuzzingEventEngine::FuzzingDone() {
+ grpc_core::MutexLock lock(&mu_);
+ tick_increments_.clear();
+}
+
+FuzzingEventEngine::~FuzzingEventEngine() {
+ GPR_ASSERT(g_fuzzing_event_engine == this);
+ g_fuzzing_event_engine = nullptr;
+}
+
+gpr_timespec FuzzingEventEngine::NowAsTimespec(gpr_clock_type clock_type) {
+ // TODO(ctiller): add a facility to track realtime and monotonic clocks
+ // separately to simulate divergence.
+ GPR_ASSERT(clock_type != GPR_TIMESPAN);
+ const Duration d = now_.time_since_epoch();
+ auto secs = std::chrono::duration_cast(d);
+ return {secs.count(), static_cast((d - secs).count()), clock_type};
+}
+
+gpr_timespec FuzzingEventEngine::GlobalNowImpl(gpr_clock_type clock_type) {
+ GPR_ASSERT(g_fuzzing_event_engine != nullptr);
+ grpc_core::MutexLock lock(&g_fuzzing_event_engine->mu_);
+ return g_fuzzing_event_engine->NowAsTimespec(clock_type);
+}
+
void FuzzingEventEngine::Tick() {
std::vector> to_run;
{
@@ -41,9 +117,11 @@ void FuzzingEventEngine::Tick() {
auto tick_it = tick_increments_.find(current_tick_);
if (tick_it != tick_increments_.end()) {
now_ += tick_it->second;
+ GPR_ASSERT(now_.time_since_epoch().count() >= 0);
tick_increments_.erase(tick_it);
} else if (tick_increments_.empty()) {
now_ += final_tick_length_;
+ GPR_ASSERT(now_.time_since_epoch().count() >= 0);
}
++current_tick_;
// Find newly expired timers.
diff --git a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h
index 38d9efeb8fc..87f8c659a88 100644
--- a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h
+++ b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h
@@ -20,6 +20,7 @@
#include