From 0ca0691ca7ec45e4551a3f5c475c155ac6801fdb Mon Sep 17 00:00:00 2001 From: Ramesh Errabolu Date: Tue, 19 May 2020 17:37:57 -0500 Subject: [PATCH] Build ROCr core and image libraries as one shared object Change-Id: I3a16c1227e7db2e386ab33886965596fa0fb0c87 --- runtime/hsa-ext-image/CMakeLists.txt | 77 +---- runtime/hsa-runtime/CMakeLists.txt | 28 ++ .../hsa-runtime/core/inc/hsa_ext_interface.h | 9 +- .../core/runtime/hsa_ext_interface.cpp | 291 ++---------------- runtime/hsa-runtime/core/runtime/runtime.cpp | 6 +- runtime/hsa-runtime/core/util/flag.h | 6 + runtime/hsa-runtime/core/util/utils.h | 46 ++- runtime/hsa-runtime/image/CMakeLists.txt | 182 +++++++++++ runtime/hsa-runtime/image/amd_ext.cpp | 29 -- runtime/hsa-runtime/image/blit_kernel.cpp | 92 +++--- runtime/hsa-runtime/image/blit_kernel.h | 8 +- .../hsa-runtime/image/blit_object_gfx7xx.cpp | 4 + .../hsa-runtime/image/blit_object_gfx8xx.cpp | 4 + .../hsa-runtime/image/blit_object_gfx9xx.cpp | 4 + .../hsa-runtime/image/blit_src/CMakeLists.txt | 3 +- .../image/blit_src/create_hsaco_ascii_file.sh | 9 + runtime/hsa-runtime/image/device_info.cpp | 14 +- runtime/hsa-runtime/image/device_info.h | 12 +- runtime/hsa-runtime/image/hsa_ext_image.cpp | 224 +++++++------- runtime/hsa-runtime/image/image.so.def | 22 -- runtime/hsa-runtime/image/image_lut.h | 7 +- runtime/hsa-runtime/image/image_lut_kv.cpp | 7 +- runtime/hsa-runtime/image/image_lut_kv.h | 7 +- runtime/hsa-runtime/image/image_manager.cpp | 27 +- runtime/hsa-runtime/image/image_manager.h | 7 +- .../hsa-runtime/image/image_manager_ai.cpp | 35 ++- runtime/hsa-runtime/image/image_manager_ai.h | 7 +- .../hsa-runtime/image/image_manager_kv.cpp | 98 +++--- runtime/hsa-runtime/image/image_manager_kv.h | 7 +- .../hsa-runtime/image/image_manager_nv.cpp | 46 +-- runtime/hsa-runtime/image/image_manager_nv.h | 9 +- runtime/hsa-runtime/image/image_runtime.cpp | 102 +++--- runtime/hsa-runtime/image/image_runtime.h | 21 +- .../image/inc/hsa_ext_image_impl.h | 90 ++++++ runtime/hsa-runtime/image/resource.h | 7 +- runtime/hsa-runtime/image/resource_ai.h | 6 +- runtime/hsa-runtime/image/resource_kv.h | 9 +- runtime/hsa-runtime/image/resource_nv.h | 6 +- runtime/hsa-runtime/image/util.h | 152 +++++++-- 39 files changed, 942 insertions(+), 778 deletions(-) mode change 100755 => 100644 runtime/hsa-ext-image/CMakeLists.txt create mode 100755 runtime/hsa-runtime/image/CMakeLists.txt delete mode 100644 runtime/hsa-runtime/image/amd_ext.cpp delete mode 100644 runtime/hsa-runtime/image/image.so.def create mode 100644 runtime/hsa-runtime/image/inc/hsa_ext_image_impl.h diff --git a/runtime/hsa-ext-image/CMakeLists.txt b/runtime/hsa-ext-image/CMakeLists.txt old mode 100755 new mode 100644 index 30b642083c..9ca3348703 --- a/runtime/hsa-ext-image/CMakeLists.txt +++ b/runtime/hsa-ext-image/CMakeLists.txt @@ -18,7 +18,7 @@ if (ROCM_CCACHE_BUILD) endif() # if (ROCM_CCACHE_BUILD) ## Include the cmake_modules utils.cmake -list ( APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../hsa-runtime/cmake_modules" ) +list ( APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../cmake_modules" ) include ( utils ) ## Compiler preproc definitions. @@ -46,25 +46,13 @@ endif () set( SO_VERSION_STRING "${SO_MAJOR}.${SO_MINOR}.${SO_PATCH}" ) set( PACKAGE_VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_COMMIT_COUNT}-${VERSION_JOB}-${VERSION_HASH}" ) -## Find the hsakmt library and include files -get_include_path( HSAKMT_INC_PATH "libhsakmt include path" NAMES "hsakmt.h" "libhsakmt/hsakmt.h" HINTS "${CMAKE_BINARY_DIR}/../../include" "${CMAKE_CURRENT_SOURCE_DIR}/../../../../libhsakmt/include" PATHS "/opt/rocm/include") -get_library_path( HSAKMT_LIB_PATH "libhsakmt library path" NAMES "libhsakmt.so" HINTS "${CMAKE_BINARY_DIR}/../../lib" "${CMAKE_BINARY_DIR}/../roct" PATHS "/opt/rocm/lib") -include_directories( ${HSAKMT_INC_PATH} ) -link_directories( ${HSAKMT_LIB_PATH} ) - -## Find the hsa-runtime and include files -get_include_path( HSA_INC_PATH "ROCr include path" NAMES "inc/hsa.h" HINTS "${CMAKE_CURRENT_SOURCE_DIR}/../hsa-runtime" "${CMAKE_BINARY_DIR}/../../include" PATHS "/opt/rocm/include") -get_library_path( HSA_LIB_PATH "ROCr library path" NAMES "libhsa-runtime64.so" HINTS "${CMAKE_BINARY_DIR}/../../lib" "${CMAKE_BINARY_DIR}/../hsa-core" "${CMAKE_CURRENT_SOURCE_DIR}/../hsa-runtime/build" PATHS "/opt/rocm/lib") -include_directories( ${HSA_INC_PATH} ) -link_directories( ${HSA_LIB_PATH} ) - ## Find self -if( "${IMAGE_SOURCE_DIR}" STREQUAL "" ) - get_include_path( IMG_SOURCE_FILE null NAMES "image_runtime.h" HINTS "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/../hsa-runtime/image/" ) - get_filename_component( IMAGE_SOURCE_DIR "${IMG_SOURCE_FILE}" ABSOLUTE ) - unset( IMG_SOURCE_FILE CACHE ) +if( "${EXT_SOURCE_DIR}" STREQUAL "" ) + get_include_path( EXT_SOURCE_FILE null NAMES "image/hsa_ext_image.cpp" HINTS "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/../../ext/" ) + get_filename_component( EXT_SOURCE_DIR "${EXT_SOURCE_FILE}/.." ABSOLUTE ) + unset( EXT_SOURCE_FILE CACHE ) endif() -set( IMAGE_SOURCE_DIR ${IMAGE_SOURCE_DIR} CACHE PATH "Image lib source dir" FORCE ) +set( EXT_SOURCE_DIR ${EXT_SOURCE_DIR} CACHE PATH "Image lib source dir" FORCE ) get_filename_component( OPEN_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/.." ABSOLUTE CACHE ) set( OPEN_SOURCE_DIR ${OPEN_SOURCE_DIR} CACHE PATH "Open source root dir" FORCE ) @@ -87,61 +75,20 @@ if ( "${CMAKE_BUILD_TYPE}" STREQUAL Debug ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb" ) endif () -set ( DRVDEF "${IMAGE_SOURCE_DIR}/image.so.def" ) +set ( DRVDEF "${EXT_SOURCE_DIR}/image/image.so.def" ) set ( CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bdynamic -Wl,-z,noexecstack -Wl,--version-script=${DRVDEF} -Wl,--enable-new-dtags" ) ## Library path(s). -include_directories(${IMAGE_SOURCE_DIR}/) +include_directories(${REG_INCLUDE}) +include_directories(${EXT_SOURCE_DIR}/..) +include_directories(${EXT_SOURCE_DIR}/inc) include_directories(${OPEN_SOURCE_DIR}/hsa-runtime) include_directories(${OPEN_SOURCE_DIR}/hsa-runtime/inc) include_directories(${OPEN_SOURCE_DIR}/hsa-runtime/core/inc) -include_directories(${IMAGE_SOURCE_DIR}/addrlib) -include_directories(${IMAGE_SOURCE_DIR}/addrlib/inc) -include_directories(${IMAGE_SOURCE_DIR}/addrlib/src) -include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/core) -include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/r800) -include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/gfx9) -include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/gfx10) -include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/chip/r800) -include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/chip/gfx9) -include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/chip/gfx10) - -set ( IMAGE_SRCS ${IMAGE_SOURCE_DIR}/addrlib/src/addrinterface.cpp - ${IMAGE_SOURCE_DIR}/addrlib/src/core/coord.cpp - ${IMAGE_SOURCE_DIR}/addrlib/src/core/addrlib.cpp - ${IMAGE_SOURCE_DIR}/addrlib/src/core/addrlib1.cpp - ${IMAGE_SOURCE_DIR}/addrlib/src/core/addrlib2.cpp - ${IMAGE_SOURCE_DIR}/addrlib/src/core/addrobject.cpp - ${IMAGE_SOURCE_DIR}/addrlib/src/core/addrelemlib.cpp - ${IMAGE_SOURCE_DIR}/addrlib/src/r800/ciaddrlib.cpp - ${IMAGE_SOURCE_DIR}/addrlib/src/r800/egbaddrlib.cpp - ${IMAGE_SOURCE_DIR}/addrlib/src/r800/siaddrlib.cpp - ${IMAGE_SOURCE_DIR}/addrlib/src/gfx9/gfx9addrlib.cpp - ${IMAGE_SOURCE_DIR}/addrlib/src/gfx10/gfx10addrlib.cpp - ${IMAGE_SOURCE_DIR}/amd_ext.cpp - ${IMAGE_SOURCE_DIR}/device_info.cpp - ${IMAGE_SOURCE_DIR}/hsa_ext_image.cpp - ${IMAGE_SOURCE_DIR}/image_runtime.cpp - ${IMAGE_SOURCE_DIR}/image_manager.cpp - ${IMAGE_SOURCE_DIR}/image_manager_kv.cpp - ${IMAGE_SOURCE_DIR}/image_manager_ai.cpp - ${IMAGE_SOURCE_DIR}/image_manager_nv.cpp - ${IMAGE_SOURCE_DIR}/image_lut_kv.cpp - ${IMAGE_SOURCE_DIR}/blit_object_gfx7xx.cpp - ${IMAGE_SOURCE_DIR}/blit_object_gfx8xx.cpp - ${IMAGE_SOURCE_DIR}/blit_object_gfx9xx.cpp - ${IMAGE_SOURCE_DIR}/opencl_blit_objects.cpp - ${IMAGE_SOURCE_DIR}/blit_kernel.cpp - ${OPEN_SOURCE_DIR}/hsa-runtime/core/common/shared.cpp - ${OPEN_SOURCE_DIR}/hsa-runtime/core/common/hsa_table_interface.cpp -) - -add_subdirectory(${IMAGE_SOURCE_DIR}/blit_src ${CMAKE_CURRENT_BINARY_DIR}/image_blit) -set_source_files_properties(${IMAGE_SOURCE_DIR}/opencl_blit_objects.cpp PROPERTIES GENERATED 1) +set ( IMAGE_SRCS ${EXT_SOURCE_DIR}/image/hsa_ext_image.cpp) add_library ( ${IMAGE_TARGET} SHARED ${IMAGE_SRCS} ) -add_dependencies( ${IMAGE_TARGET} opencl_blit_objects.cpp ) ## Set the VERSION and SOVERSION values set_property ( TARGET ${IMAGE_TARGET} PROPERTY VERSION "${SO_VERSION_STRING}" ) @@ -150,8 +97,6 @@ set_property ( TARGET ${IMAGE_TARGET} PROPERTY SOVERSION "${SO_MAJOR}" ) ## Add the core runtime in the link target_link_libraries ( ${IMAGE_TARGET} - PRIVATE hsa-runtime64 - PRIVATE hsakmt c dl pthread rt ) diff --git a/runtime/hsa-runtime/CMakeLists.txt b/runtime/hsa-runtime/CMakeLists.txt index eab7768217..f9120455c6 100644 --- a/runtime/hsa-runtime/CMakeLists.txt +++ b/runtime/hsa-runtime/CMakeLists.txt @@ -46,6 +46,13 @@ cmake_minimum_required ( VERSION 3.5.0 ) set ( CORE_RUNTIME_NAME "hsa-runtime" ) set ( CORE_RUNTIME_TARGET "${CORE_RUNTIME_NAME}64" ) set ( CORE_RUNTIME_LIBRARY "lib${CORE_RUNTIME_TARGET}" ) + +## Set image module name +set ( IMAGE_NAME "hsa-ext-image" ) +set ( IMAGE_TARGET "${IMAGE_NAME}64" ) +set ( IMAGE_LIBRARY "lib${IMAGE_TARGET}" ) + +## Set project name project( ${CORE_RUNTIME_TARGET} ) if ( NOT DEFINED BUILD_SHARED_LIBS ) @@ -172,6 +179,14 @@ set ( SRCS "core/util/lnx/os_linux.cpp" add_library( ${CORE_RUNTIME_TARGET} ${SRCS} ) +## Build Blit kernels +set(IMAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/image) +add_subdirectory(${IMAGE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/image) + +## Link Core runtime with Thunk (ROCt) and Image libraries +#target_link_libraries ( ${CORE_RUNTIME_TARGET} PUBLIC ${IMAGE_SOURCE_DIR} ) +target_link_libraries ( ${CORE_RUNTIME_TARGET} PRIVATE ${IMAGE_TARGET} ) +#target_link_libraries ( ${CORE_RUNTIME_TARGET} ${IMAGE_TARGET} ) target_link_libraries ( ${CORE_RUNTIME_TARGET} PRIVATE hsakmt elf dl pthread rt @@ -227,8 +242,21 @@ set ( CPACK_DEBIAN_PACKAGE_DEPENDS "hsakmt-roct" ) set ( CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/RadeonOpenCompute/ROCR-Runtime" ) set ( CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/DEBIAN/postinst;${CMAKE_CURRENT_SOURCE_DIR}/DEBIAN/prerm" ) +# Declare that this package will replace functionality provided by hsa-ext-rocr-dev package +set ( CPACK_DEBIAN_PACKAGE_BREAKS "hsa-ext-rocr-dev" ) +set ( CPACK_DEBIAN_PACKAGE_PROVIDES "hsa-ext-rocr-dev" ) +set ( CPACK_DEBIAN_PACKAGE_REPLACES "hsa-ext-rocr-dev" ) +set ( CPACK_DEBIAN_PACKAGE_CONFLICTS "hsa-ext-rocr-dev" ) + ## RPM package specific variables set ( CPACK_RPM_PACKAGE_DEPENDS "hsakmt-roct" ) + +# Declare that this package will replace functionality provided by hsa-ext-rocr-dev package +#set ( CPACK_DEBIAN_PACKAGE_BREAKS "hsa-ext-rocr-dev" ) # equivalent command not found +set ( CPACK_RPM_PACKAGE_PROVIDES "hsa-ext-rocr-dev" ) +set ( CPACK_RPM_PACKAGE_OBSOLETES "hsa-ext-rocr-dev" ) +set ( CPACK_RPM_PACKAGE_CONFLICTS "hsa-ext-rocr-dev" ) + set ( CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/RPM/rpm_post" ) set ( CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/RPM/rpm_postun" ) diff --git a/runtime/hsa-runtime/core/inc/hsa_ext_interface.h b/runtime/hsa-runtime/core/inc/hsa_ext_interface.h index d3b4e92fbf..81ebdda13f 100644 --- a/runtime/hsa-runtime/core/inc/hsa_ext_interface.h +++ b/runtime/hsa-runtime/core/inc/hsa_ext_interface.h @@ -68,9 +68,14 @@ class ExtensionEntryPoints { ExtensionEntryPoints(); bool LoadFinalizer(std::string library_name); - bool LoadImage(std::string library_name); void Unload(); + // Update Image Api table with handles to implementation + bool LoadImage(); + + // Reset Api tables to point to null implementations + void UnloadImage(); + private: typedef void (*Load_t)(const ::HsaApiTable* table); typedef void (*Unload_t)(); @@ -87,7 +92,7 @@ class ExtensionEntryPoints { void InitAmdExtTable(); // Update Amd Ext table for Api related to Images - void UpdateAmdExtTable(void *func_ptr); + void UpdateAmdExtTable(decltype(::hsa_amd_image_create)* func_ptr); DISALLOW_COPY_AND_ASSIGN(ExtensionEntryPoints); }; diff --git a/runtime/hsa-runtime/core/runtime/hsa_ext_interface.cpp b/runtime/hsa-runtime/core/runtime/hsa_ext_interface.cpp index 1fc08ca884..b9b814be09 100644 --- a/runtime/hsa-runtime/core/runtime/hsa_ext_interface.cpp +++ b/runtime/hsa-runtime/core/runtime/hsa_ext_interface.cpp @@ -40,134 +40,18 @@ // //////////////////////////////////////////////////////////////////////////////// +#include "image/inc/hsa_ext_image_impl.h" #include "core/inc/hsa_ext_interface.h" +#include "core/inc/runtime.h" #include -#include "core/inc/runtime.h" +// Implementations for missing / unsupported extensions +template static R hsa_ext_null(ARGS...) { + return HSA_STATUS_ERROR_NOT_INITIALIZED; +} namespace core { -// Implementations for missing / unsupported extensions -template -static T0 hsa_ext_null() { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8, T9) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_ext_null(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, - T14, T15, T16, T17, T18, T19, T20) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} -template -static T0 hsa_amd_null(T1, T2, T3, T4, T5, T6) { - return HSA_STATUS_ERROR_NOT_INITIALIZED; -} - ExtensionEntryPoints::ExtensionEntryPoints() { InitFinalizerExtTable(); InitImageExtTable(); @@ -223,21 +107,28 @@ void ExtensionEntryPoints::InitAmdExtTable() { // Update Amd Ext table for Api related to Images. // @note: Interface should be updated when Amd Ext table // begins hosting Api's from other extension libraries -void ExtensionEntryPoints::UpdateAmdExtTable(void *func_ptr) { - +void ExtensionEntryPoints::UpdateAmdExtTable(decltype(::hsa_amd_image_create)* func_ptr) { assert(hsa_api_table_.amd_ext_api.hsa_amd_image_create_fn == (decltype(hsa_amd_image_create)*)hsa_ext_null && "Duplicate load of extension import."); assert(hsa_internal_api_table_.amd_ext_api.hsa_amd_image_create_fn == (decltype(hsa_amd_image_create)*)hsa_ext_null && "Duplicate load of extension import."); - hsa_api_table_.amd_ext_api.hsa_amd_image_create_fn = - (decltype(hsa_amd_image_create)*)func_ptr; - hsa_internal_api_table_.amd_ext_api.hsa_amd_image_create_fn = - (decltype(hsa_amd_image_create)*)func_ptr; + hsa_api_table_.amd_ext_api.hsa_amd_image_create_fn = func_ptr; + hsa_internal_api_table_.amd_ext_api.hsa_amd_image_create_fn = func_ptr; +} + +void ExtensionEntryPoints::UnloadImage() { + InitAmdExtTable(); + InitImageExtTable(); + core::hsa_internal_api_table_.Reset(); + rocr::image::ReleaseImageRsrcs(); } void ExtensionEntryPoints::Unload() { + // Reset Image apis to hsa_ext_null function + UnloadImage(); + for (auto lib : libs_) { void* ptr = os::GetExportAddress(lib, "Unload"); if (ptr) { @@ -259,138 +150,17 @@ void ExtensionEntryPoints::Unload() { core::hsa_internal_api_table_.Reset(); } -bool ExtensionEntryPoints::LoadImage(std::string library_name) { - os::LibHandle lib = os::LoadLib(library_name); - if (lib == NULL) { - return false; - } - libs_.push_back(lib); - - void* ptr; - - ptr = os::GetExportAddress(lib, "hsa_ext_image_get_capability_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_image_get_capability_fn == - (decltype(::hsa_ext_image_get_capability)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_image_get_capability_fn = - (decltype(::hsa_ext_image_get_capability)*)ptr; +bool ExtensionEntryPoints::LoadImage() { + // Consult user input on linking to Image implementation + bool disable_image = core::Runtime::runtime_singleton_->flag().disable_image(); + if (disable_image) { + return true; } - ptr = os::GetExportAddress(lib, "hsa_ext_image_data_get_info_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_image_data_get_info_fn == - (decltype(::hsa_ext_image_data_get_info)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_image_data_get_info_fn = - (decltype(::hsa_ext_image_data_get_info)*)ptr; - } + // Bind to Image implementation api's + decltype(::hsa_amd_image_create)* func; + rocr::image::LoadImage(&image_api, &func); - ptr = os::GetExportAddress(lib, "hsa_ext_image_create_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_image_create_fn == - (decltype(::hsa_ext_image_create)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_image_create_fn = (decltype(::hsa_ext_image_create)*)ptr; - } - - ptr = os::GetExportAddress(lib, "hsa_ext_image_import_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_image_import_fn == - (decltype(::hsa_ext_image_import)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_image_import_fn = (decltype(::hsa_ext_image_import)*)ptr; - } - - ptr = os::GetExportAddress(lib, "hsa_ext_image_export_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_image_export_fn == - (decltype(::hsa_ext_image_export)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_image_export_fn = (decltype(::hsa_ext_image_export)*)ptr; - } - - ptr = os::GetExportAddress(lib, "hsa_ext_image_copy_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_image_copy_fn == - (decltype(::hsa_ext_image_copy)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_image_copy_fn = (decltype(::hsa_ext_image_copy)*)ptr; - } - - ptr = os::GetExportAddress(lib, "hsa_ext_image_clear_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_image_clear_fn == - (decltype(::hsa_ext_image_clear)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_image_clear_fn = (decltype(::hsa_ext_image_clear)*)ptr; - } - - ptr = os::GetExportAddress(lib, "hsa_ext_image_destroy_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_image_destroy_fn == - (decltype(::hsa_ext_image_destroy)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_image_destroy_fn = (decltype(::hsa_ext_image_destroy)*)ptr; - } - - ptr = os::GetExportAddress(lib, "hsa_ext_sampler_create_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_sampler_create_fn == - (decltype(::hsa_ext_sampler_create)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_sampler_create_fn = (decltype(::hsa_ext_sampler_create)*)ptr; - } - - ptr = os::GetExportAddress(lib, "hsa_ext_sampler_destroy_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_sampler_destroy_fn == - (decltype(::hsa_ext_sampler_destroy)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_sampler_destroy_fn = - (decltype(::hsa_ext_sampler_destroy)*)ptr; - } - - ptr = os::GetExportAddress(lib, "hsa_ext_image_get_capability_with_layout_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_image_get_capability_with_layout_fn == - (decltype(::hsa_ext_image_get_capability_with_layout)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_image_get_capability_with_layout_fn = - (decltype(::hsa_ext_image_get_capability_with_layout)*)ptr; - } - - ptr = os::GetExportAddress(lib, "hsa_ext_image_data_get_info_with_layout_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_image_data_get_info_with_layout_fn == - (decltype(::hsa_ext_image_data_get_info_with_layout)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_image_data_get_info_with_layout_fn = - (decltype(::hsa_ext_image_data_get_info_with_layout)*)ptr; - } - - ptr = os::GetExportAddress(lib, "hsa_ext_image_create_with_layout_impl"); - if (ptr != NULL) { - assert(image_api.hsa_ext_image_create_with_layout_fn == - (decltype(::hsa_ext_image_create_with_layout)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_ext_image_create_with_layout_fn = (decltype(::hsa_ext_image_create_with_layout)*)ptr; - } - - ptr = os::GetExportAddress(lib, "hsa_amd_image_get_info_max_dim_impl"); - if (ptr != NULL) { - assert(image_api.hsa_amd_image_get_info_max_dim_fn == - (decltype(::hsa_amd_image_get_info_max_dim)*)hsa_ext_null && - "Duplicate load of extension import."); - image_api.hsa_amd_image_get_info_max_dim_fn = - (decltype(::hsa_amd_image_get_info_max_dim)*)ptr; - } - - ptr = os::GetExportAddress(lib, "hsa_amd_image_create_impl"); - if (ptr != NULL) { - UpdateAmdExtTable(ptr); - } - // Initialize Version of Api Table image_api.version.major_id = HSA_IMAGE_API_TABLE_MAJOR_VERSION; image_api.version.minor_id = sizeof(ImageExtTable); @@ -400,11 +170,8 @@ bool ExtensionEntryPoints::LoadImage(std::string library_name) { hsa_internal_api_table_.CloneExts(&image_api, core::HsaApiTable::HSA_EXT_IMAGE_API_TABLE_ID); - ptr = os::GetExportAddress(lib, "Load"); - if (ptr != NULL) { - ((Load_t)ptr)(&core::hsa_internal_api_table_.hsa_api); - } - + // Update Amd Ext Api table Api that deals with Images + UpdateAmdExtTable(func); return true; } diff --git a/runtime/hsa-runtime/core/runtime/runtime.cpp b/runtime/hsa-runtime/core/runtime/runtime.cpp index 69b2e5ed48..8e1b6922d2 100644 --- a/runtime/hsa-runtime/core/runtime/runtime.cpp +++ b/runtime/hsa-runtime/core/runtime/runtime.cpp @@ -1349,13 +1349,9 @@ void Runtime::LoadExtensions() { #ifdef HSA_LARGE_MODEL static const std::string kFinalizerLib[] = {"hsa-ext-finalize64.dll", "libhsa-ext-finalize64.so.1"}; - static const std::string kImageLib[] = {"hsa-ext-image64.dll", - "libhsa-ext-image64.so.1"}; #else static const std::string kFinalizerLib[] = {"hsa-ext-finalize.dll", "libhsa-ext-finalize.so.1"}; - static const std::string kImageLib[] = {"hsa-ext-image.dll", - "libhsa-ext-image.so.1"}; #endif // Update Hsa Api Table with handle of Finalizer extension Apis @@ -1366,7 +1362,7 @@ void Runtime::LoadExtensions() { core::HsaApiTable::HSA_EXT_FINALIZER_API_TABLE_ID); // Update Hsa Api Table with handle of Image extension Apis - extensions_.LoadImage(kImageLib[os_index(os::current_os)]); + extensions_.LoadImage(); hsa_api_table_.LinkExts(&extensions_.image_api, core::HsaApiTable::HSA_EXT_IMAGE_API_TABLE_ID); } diff --git a/runtime/hsa-runtime/core/util/flag.h b/runtime/hsa-runtime/core/util/flag.h index 8f4a474324..ce054d84f3 100644 --- a/runtime/hsa-runtime/core/util/flag.h +++ b/runtime/hsa-runtime/core/util/flag.h @@ -113,6 +113,9 @@ class Flag { var = os::GetEnvVar("HSA_NO_SCRATCH_THREAD_LIMITER"); no_scratch_thread_limit_ = (var == "1") ? true : false; + + var = os::GetEnvVar("HSA_DISABLE_IMAGE"); + disable_image_ = (var == "1") ? true : false; } bool check_flat_scratch() const { return check_flat_scratch_; } @@ -153,6 +156,8 @@ class Flag { std::string tools_lib_names() const { return tools_lib_names_; } + bool disable_image() const { return disable_image_; } + private: bool check_flat_scratch_; bool enable_vm_fault_message_; @@ -167,6 +172,7 @@ class Flag { bool fine_grain_pcie_; bool no_scratch_reclaim_; bool no_scratch_thread_limit_; + bool disable_image_; std::string enable_sdma_; diff --git a/runtime/hsa-runtime/core/util/utils.h b/runtime/hsa-runtime/core/util/utils.h index fbe7e4760a..0fdabef811 100644 --- a/runtime/hsa-runtime/core/util/utils.h +++ b/runtime/hsa-runtime/core/util/utils.h @@ -326,6 +326,50 @@ static __forceinline std::string& rtrim(std::string& s) { static __forceinline std::string& trim(std::string& s) { return ltrim(rtrim(s)); } +template +static __forceinline uint32_t BitSelect(T p) { + static_assert(sizeof(T) <= sizeof(uintptr_t), "Type out of range."); + static_assert(highBit < sizeof(uintptr_t) * 8, "Bit index out of range."); + + uintptr_t ptr = p; + if (highBit != (sizeof(uintptr_t) * 8 - 1)) + return (uint32_t)((ptr & ((1ull << (highBit + 1)) - 1)) >> lowBit); + else + return (uint32_t)(ptr >> lowBit); +} + +inline uint32_t PtrLow16Shift8(const void* p) { + uintptr_t ptr = reinterpret_cast(p); + return (uint32_t)((ptr & 0xFFFFULL) >> 8); +} + +inline uint32_t PtrHigh64Shift16(const void* p) { + uintptr_t ptr = reinterpret_cast(p); + return (uint32_t)((ptr & 0xFFFFFFFFFFFF0000ULL) >> 16); +} + +inline uint32_t PtrLow40Shift8(const void* p) { + uintptr_t ptr = reinterpret_cast(p); + return (uint32_t)((ptr & 0xFFFFFFFFFFULL) >> 8); +} + +inline uint32_t PtrHigh64Shift40(const void* p) { + uintptr_t ptr = reinterpret_cast(p); + return (uint32_t)((ptr & 0xFFFFFF0000000000ULL) >> 40); +} + +inline uint32_t PtrLow32(const void* p) { + return static_cast(reinterpret_cast(p)); +} + +inline uint32_t PtrHigh32(const void* p) { + uint32_t ptr = 0; +#ifdef HSA_LARGE_MODEL + ptr = static_cast(reinterpret_cast(p) >> 32); +#endif + return ptr; +} + #include "atomic_helpers.h" -#endif // HSA_RUNTIME_CORE_UTIL_UTIIS_H_ +#endif // HSA_RUNTIME_CORE_UTIL_UTILS_H_ diff --git a/runtime/hsa-runtime/image/CMakeLists.txt b/runtime/hsa-runtime/image/CMakeLists.txt new file mode 100755 index 0000000000..c7f31cff97 --- /dev/null +++ b/runtime/hsa-runtime/image/CMakeLists.txt @@ -0,0 +1,182 @@ +cmake_minimum_required ( VERSION 3.5.0 ) + +## Set ext runtime module name and project name. +set ( IMAGE_NAME "hsa-ext-image" ) +set ( IMAGE_TARGET "${IMAGE_NAME}64" ) +set ( IMAGE_LIBRARY "lib${IMAGE_TARGET}" ) +project ( ${IMAGE_TARGET} ) + +## Build image as a shared or static library +#if ( NOT DEFINED BUILD_SHARED_LIBS ) +# set ( BUILD_SHARED_LIBS "on" ) +#endif() +#set ( BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS} CACHE BOOL "Build shared library (.so) or not.") + +# Optionally, build with ccache. +set(ROCM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build") +if (ROCM_CCACHE_BUILD) + find_program(CCACHE_PROGRAM ccache) + if (CCACHE_PROGRAM) + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM}) + else() + message(WARNING "Unable to find ccache. Falling back to real compiler") + endif() # if (CCACHE_PROGRAM) +endif() # if (ROCM_CCACHE_BUILD) + +## Include the cmake_modules utils.cmake +list ( APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../cmake_modules" ) +include ( utils ) + +## Compiler preproc definitions. +add_definitions ( -D__linux__ ) +add_definitions ( -DUNIX_OS ) +add_definitions ( -DLINUX ) +add_definitions ( -D__AMD64__ ) +add_definitions ( -D__x86_64__ ) +add_definitions ( -DAMD_INTERNAL_BUILD ) +add_definitions ( -DLITTLEENDIAN_CPU=1 ) +add_definitions ( -D HSA_DEPRECATED= ) +add_definitions ( -D BRAHMA_BUILD=1 ) + +## Get the package version. +#get_version( "1.1.9") +#set(SO_MAJOR 1) +#set(SO_MINOR 1) +#if ( ${ROCM_PATCH_VERSION} ) +# set ( SO_PATCH ${ROCM_PATCH_VERSION}) +# set ( VERSION_PATCH ${ROCM_PATCH_VERSION}) +#else () +# set(SO_PATCH 9) +#endif () + +#set( SO_VERSION_STRING "${SO_MAJOR}.${SO_MINOR}.${SO_PATCH}" ) +#set( PACKAGE_VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_COMMIT_COUNT}-${VERSION_JOB}-${VERSION_HASH}" ) + +## Find the hsakmt library and include files +get_include_path( HSAKMT_INC_PATH "libhsakmt include path" NAMES "hsakmt.h" "libhsakmt/hsakmt.h" HINTS "${CMAKE_BINARY_DIR}/../../include" "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../libhsakmt/include" PATHS "/opt/rocm/include") +get_library_path( HSAKMT_LIB_PATH "libhsakmt library path" NAMES "libhsakmt.so" HINTS "${CMAKE_BINARY_DIR}/../../lib" "${CMAKE_BINARY_DIR}/../roct" PATHS "/opt/rocm/lib") +include_directories( ${HSAKMT_INC_PATH} ) +link_directories( ${HSAKMT_LIB_PATH} ) + +## Find the hsa-runtime and include files +#get_include_path( HSA_INC_PATH "ROCr include path" NAMES "inc/hsa.h" HINTS "${CMAKE_CURRENT_SOURCE_DIR}/../hsa-runtime" "${CMAKE_BINARY_DIR}/../../include" PATHS "/opt/rocm/include") +#get_library_path( HSA_LIB_PATH "ROCr library path" NAMES "libhsa-runtime64.so" HINTS "${CMAKE_BINARY_DIR}/../../lib" "${CMAKE_BINARY_DIR}/../hsa-core" "${CMAKE_CURRENT_SOURCE_DIR}/../hsa-runtime/build" PATHS "/opt/rocm/lib") +#include_directories( ${HSA_INC_PATH} ) +#link_directories( ${HSA_LIB_PATH} ) + +## Find self +if( "${IMAGE_SOURCE_DIR}" STREQUAL "" ) + get_include_path( IMG_SOURCE_FILE null NAMES "image_runtime.h" HINTS "${CMAKE_CURRENT_SOURCE_DIR}" ) + get_filename_component( IMAGE_SOURCE_DIR "${IMG_SOURCE_FILE}" ABSOLUTE ) + unset( IMG_SOURCE_FILE CACHE ) +endif() +set( IMAGE_SOURCE_DIR ${IMAGE_SOURCE_DIR} CACHE PATH "Image lib source dir" FORCE ) + +message( "Value of cmake_current_source_dir: ${CMAKE_CURRENT_SOURCE_DIR} ") +get_filename_component( OPEN_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../.." ABSOLUTE CACHE ) +message( "Value of open_source_dir: ${OPEN_SOURCE_DIR} ") +set( OPEN_SOURCE_DIR ${OPEN_SOURCE_DIR} CACHE PATH "Open source root dir" FORCE ) + +## Set RUNPATH - ../../lib covers use of the legacy symlink in /hsa/lib/ +set(CMAKE_INSTALL_RPATH "$ORIGIN;$ORIGIN/../../lib;$ORIGIN/../../lib64;$ORIGIN/../lib64") + +## ------------------------- Linux Compiler and Linker options ------------------------- +set ( CMAKE_CXX_FLAGS "-std=c++11 " ) +#set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations -fPIC" ) +#set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC" ) + +set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -fexceptions -fno-rtti -fvisibility=hidden -Wno-error=sign-compare -Wno-sign-compare -Wno-write-strings -Wno-deprecated-declarations -Wno-conversion-null -fno-math-errno -fno-threadsafe-statics -fmerge-all-constants -fms-extensions -Wno-error=comment -Wno-comment -Wno-error=pointer-arith -Wno-pointer-arith -fPIC" ) + +#if ( CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" ) +# set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64 -msse -msse2" ) +#elseif ( CMAKE_SYSTEM_PROCESSOR STREQUAL "x86" ) +# set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32" ) +#endif () + +#if ( "${CMAKE_BUILD_TYPE}" STREQUAL Debug ) +# set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb" ) +#endif () + +#set ( DRVDEF "${IMAGE_SOURCE_DIR}/image.so.def" ) + +set ( CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bdynamic -Wl,-z,noexecstack -Wl,--version-script=${DRVDEF} -Wl,--enable-new-dtags" ) + +## Library path(s). +include_directories(${IMAGE_SOURCE_DIR}/) +include_directories(${OPEN_SOURCE_DIR}/hsa-runtime) +include_directories(${OPEN_SOURCE_DIR}/hsa-runtime/inc) +include_directories(${OPEN_SOURCE_DIR}/hsa-runtime/core/inc) +include_directories(${IMAGE_SOURCE_DIR}/addrlib/) +include_directories(${IMAGE_SOURCE_DIR}/addrlib/inc) +include_directories(${IMAGE_SOURCE_DIR}/addrlib/src) +include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/core) +include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/r800) +include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/gfx9) +include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/gfx10) +include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/chip/r800) +include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/chip/gfx9) +include_directories(${IMAGE_SOURCE_DIR}/addrlib/src/chip/gfx10) + +set ( IMAGE_SRCS ${IMAGE_SOURCE_DIR}/addrlib/src/addrinterface.cpp + ${IMAGE_SOURCE_DIR}/addrlib/src/core/coord.cpp + ${IMAGE_SOURCE_DIR}/addrlib/src/core/addrlib.cpp + ${IMAGE_SOURCE_DIR}/addrlib/src/core/addrlib1.cpp + ${IMAGE_SOURCE_DIR}/addrlib/src/core/addrlib2.cpp + ${IMAGE_SOURCE_DIR}/addrlib/src/core/addrobject.cpp + ${IMAGE_SOURCE_DIR}/addrlib/src/core/addrelemlib.cpp + ${IMAGE_SOURCE_DIR}/addrlib/src/r800/ciaddrlib.cpp + ${IMAGE_SOURCE_DIR}/addrlib/src/r800/egbaddrlib.cpp + ${IMAGE_SOURCE_DIR}/addrlib/src/r800/siaddrlib.cpp + ${IMAGE_SOURCE_DIR}/addrlib/src/gfx9/gfx9addrlib.cpp + ${IMAGE_SOURCE_DIR}/addrlib/src/gfx10/gfx10addrlib.cpp + ${IMAGE_SOURCE_DIR}/device_info.cpp + ${IMAGE_SOURCE_DIR}/hsa_ext_image.cpp + ${IMAGE_SOURCE_DIR}/image_runtime.cpp + ${IMAGE_SOURCE_DIR}/image_manager.cpp + ${IMAGE_SOURCE_DIR}/image_manager_kv.cpp + ${IMAGE_SOURCE_DIR}/image_manager_ai.cpp + ${IMAGE_SOURCE_DIR}/image_manager_nv.cpp + ${IMAGE_SOURCE_DIR}/image_lut_kv.cpp + ${IMAGE_SOURCE_DIR}/blit_object_gfx7xx.cpp + ${IMAGE_SOURCE_DIR}/blit_object_gfx8xx.cpp + ${IMAGE_SOURCE_DIR}/blit_object_gfx9xx.cpp + ${IMAGE_SOURCE_DIR}/opencl_blit_objects.cpp + ${IMAGE_SOURCE_DIR}/blit_kernel.cpp +) + +add_subdirectory(${IMAGE_SOURCE_DIR}/blit_src ${CMAKE_CURRENT_BINARY_DIR}/image_blit) +set_source_files_properties(${IMAGE_SOURCE_DIR}/opencl_blit_objects.cpp PROPERTIES GENERATED 1) + +#add_library ( ${IMAGE_TARGET} SHARED ${IMAGE_SRCS} ) +add_library ( ${IMAGE_TARGET} STATIC ${IMAGE_SRCS} ) +add_dependencies( ${IMAGE_TARGET} opencl_blit_objects.cpp ) + +## Set the VERSION and SOVERSION values +#set_property ( TARGET ${IMAGE_TARGET} PROPERTY VERSION "${SO_VERSION_STRING}" ) +#set_property ( TARGET ${IMAGE_TARGET} PROPERTY SOVERSION "${SO_MAJOR}" ) + +## Add the core runtime in the link +#target_link_libraries ( +# ${IMAGE_TARGET} +# PRIVATE hsa-runtime64 +# PRIVATE hsakmt +# c dl pthread rt +#) + +## If the build is Release, strip the target library +#if ( "${CMAKE_BUILD_TYPE}" STREQUAL Release ) +# add_custom_command ( TARGET ${IMAGE_TARGET} POST_BUILD COMMAND ${CMAKE_STRIP} $ ) +#endif () + +## Create symlinks for legacy packaging and install +#if ( ${BUILD_SHARED_LIBS} ) +# add_custom_target ( hsa_images_lib_link ALL WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_COMMAND} -E create_symlink ../hsa/lib/${IMAGE_LIBRARY}.so ${IMAGE_LIBRARY}-link.so ) +#endif() + +## Set install information +#if ( ${BUILD_SHARED_LIBS} ) +# install ( TARGETS ${IMAGE_TARGET} LIBRARY DESTINATION hsa/lib ) +# install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_LIBRARY}-link.so DESTINATION lib PERMISSIONS OWNER_WRITE OWNER_READ RENAME ${IMAGE_LIBRARY}.so ) +#endif() + + diff --git a/runtime/hsa-runtime/image/amd_ext.cpp b/runtime/hsa-runtime/image/amd_ext.cpp deleted file mode 100644 index a9836248b0..0000000000 --- a/runtime/hsa-runtime/image/amd_ext.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "inc/hsa.h" -#include "inc/hsa_api_trace.h" -#include "core/inc/hsa_table_interface.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void HSA_API_EXPORT Load(const ::HsaApiTable* table); -void HSA_API_EXPORT Unload(); - -// Per library unload callback function. Set by the finalizer or image library -// when needed. -void (*UnloadCallback)() = NULL; - -void Load(const ::HsaApiTable* table) { - // Setup to bypass the runtime intercept layer. - hsa_table_interface_init(table); -} - -void Unload() { - if (UnloadCallback != NULL) { - UnloadCallback(); - } -} - -#ifdef __cplusplus -} -#endif diff --git a/runtime/hsa-runtime/image/blit_kernel.cpp b/runtime/hsa-runtime/image/blit_kernel.cpp index 333e2aa57d..1693e78fd0 100644 --- a/runtime/hsa-runtime/image/blit_kernel.cpp +++ b/runtime/hsa-runtime/image/blit_kernel.cpp @@ -16,8 +16,13 @@ #undef HSA_ARGUMENT_ALIGN_BYTES #define HSA_ARGUMENT_ALIGN_BYTES 16 +#include "core/inc/hsa_internal.h" +#include "core/inc/hsa_ext_amd_impl.h" #include "core/inc/hsa_table_interface.h" +namespace rocr { +namespace image { + extern uint8_t blit_object_gfx7xx[14608]; extern uint8_t blit_object_gfx8xx[15424]; extern uint8_t blit_object_gfx9xx[15432]; @@ -37,8 +42,6 @@ extern uint8_t ocl_blit_object_gfx1010[]; extern uint8_t ocl_blit_object_gfx1011[]; extern uint8_t ocl_blit_object_gfx1012[]; -namespace amd { - // Arguments inserted by OCL compiler, all zero here. struct OCLHiddenArgs { uint64_t offset_x; @@ -52,20 +55,20 @@ struct OCLHiddenArgs { static void* Allocate(hsa_agent_t agent, size_t size) { //use the host accessible kernarg pool - hsa_amd_memory_pool_t pool = ext_image::ImageRuntime::instance()->kernarg_pool(); + hsa_amd_memory_pool_t pool = ImageRuntime::instance()->kernarg_pool(); void* ptr = NULL; - hsa_status_t status = hsa_amd_memory_pool_allocate(pool, size, 0, &ptr); + hsa_status_t status = AMD::hsa_amd_memory_pool_allocate(pool, size, 0, &ptr); assert(status == HSA_STATUS_SUCCESS); if (status != HSA_STATUS_SUCCESS) return NULL; - status = hsa_amd_agents_allow_access(1, &agent, NULL, ptr); + status = AMD::hsa_amd_agents_allow_access(1, &agent, NULL, ptr); assert(status == HSA_STATUS_SUCCESS); if (status != HSA_STATUS_SUCCESS) { - hsa_amd_memory_pool_free(ptr); + AMD::hsa_amd_memory_pool_free(ptr); return NULL; } return ptr; @@ -82,7 +85,7 @@ hsa_status_t BlitKernel::Cleanup() { for (std::pair pair : code_executable_map_) { - hsa_executable_destroy(pair.second); + HSA::hsa_executable_destroy(pair.second); } code_executable_map_.clear(); @@ -96,8 +99,7 @@ hsa_status_t BlitKernel::BuildBlitCode( hsa_agent_t agent, std::vector& blit_code_catalog) { // Find existing kernels in the list that have compatible ISA. hsa_isa_t agent_isa = {0}; - hsa_status_t status = - hsa_agent_get_info(agent, HSA_AGENT_INFO_ISA, &agent_isa); + hsa_status_t status = HSA::hsa_agent_get_info(agent, HSA_AGENT_INFO_ISA, &agent_isa); if (HSA_STATUS_SUCCESS != status) { return status; } @@ -108,7 +110,7 @@ hsa_status_t BlitKernel::BuildBlitCode( bool isa_compatible = false; hsa_isa_t code_isa = {pair.first}; - status = hsa_isa_compatible(code_isa, agent_isa, &isa_compatible); + status = HSA::hsa_isa_compatible(code_isa, agent_isa, &isa_compatible); if (HSA_STATUS_SUCCESS != status) { return status; } @@ -123,7 +125,7 @@ hsa_status_t BlitKernel::BuildBlitCode( // Get the target name char agent_name[64] = {0}; - status = hsa_agent_get_info(agent, HSA_AGENT_INFO_NAME, &agent_name); + status = HSA::hsa_agent_get_info(agent, HSA_AGENT_INFO_NAME, &agent_name); if (HSA_STATUS_SUCCESS != status) { return status; } @@ -142,8 +144,8 @@ hsa_status_t BlitKernel::BuildBlitCode( // Create executable. hsa_executable_t executable = {0}; - status = hsa_executable_create( - HSA_PROFILE_FULL, HSA_EXECUTABLE_STATE_UNFROZEN, "", &executable); + status = + HSA::hsa_executable_create(HSA_PROFILE_FULL, HSA_EXECUTABLE_STATE_UNFROZEN, "", &executable); if (HSA_STATUS_SUCCESS != status) { return status; } @@ -151,13 +153,13 @@ hsa_status_t BlitKernel::BuildBlitCode( code_executable_map_[agent_isa.handle] = executable; // Load code object. - status = hsa_executable_load_code_object(executable, agent, code_object, ""); + status = HSA::hsa_executable_load_code_object(executable, agent, code_object, ""); if (HSA_STATUS_SUCCESS != status) { return status; } // Freeze executable. - status = hsa_executable_freeze(executable, ""); + status = HSA::hsa_executable_freeze(executable, ""); if (HSA_STATUS_SUCCESS != status) { return status; } @@ -170,8 +172,7 @@ hsa_status_t BlitKernel::CopyBufferToImage( const void* src_memory, size_t src_row_pitch, size_t src_slice_pitch, const Image& dst_image, const hsa_ext_image_region_t& image_region) { if (dst_image.desc.geometry == HSA_EXT_IMAGE_GEOMETRY_1DB) { - ImageManager* manager = - ext_image::ImageRuntime::instance()->image_manager(dst_image.component); + ImageManager* manager = ImageRuntime::instance()->image_manager(dst_image.component); const uint32_t element_size = manager->GetImageProperty(dst_image.component, dst_image.desc.format, @@ -181,7 +182,7 @@ hsa_status_t BlitKernel::CopyBufferToImage( char* dst_memory = reinterpret_cast(dst_image.data) + dst_origin; const size_t size = image_region.range.x * element_size; - return hsa_memory_copy(dst_memory, src_memory, size); + return HSA::hsa_memory_copy(dst_memory, src_memory, size); } const Image* dst_image_view = NULL; @@ -230,8 +231,7 @@ hsa_status_t BlitKernel::CopyBufferToImage( args->pixelOrigin[1] = image_region.offset.y; args->pixelOrigin[2] = image_region.offset.z; - ImageManager* manager = ext_image::ImageRuntime::instance()->image_manager( - dst_image_view->component); + ImageManager* manager = ImageRuntime::instance()->image_manager(dst_image_view->component); const uint32_t element_size = manager->GetImageProperty(dst_image_view->component, @@ -269,7 +269,7 @@ hsa_status_t BlitKernel::CopyBufferToImage( if (&dst_image != dst_image_view) { Image::Destroy(dst_image_view); } - hsa_amd_memory_pool_free(args); + AMD::hsa_amd_memory_pool_free(args); return status; } @@ -279,8 +279,7 @@ hsa_status_t BlitKernel::CopyImageToBuffer( const Image& src_image, void* dst_memory, size_t dst_row_pitch, size_t dst_slice_pitch, const hsa_ext_image_region_t& image_region) { if (src_image.desc.geometry == HSA_EXT_IMAGE_GEOMETRY_1DB) { - ImageManager* manager = - ext_image::ImageRuntime::instance()->image_manager(src_image.component); + ImageManager* manager = ImageRuntime::instance()->image_manager(src_image.component); const uint32_t element_size = manager->GetImageProperty(src_image.component, src_image.desc.format, @@ -291,7 +290,7 @@ hsa_status_t BlitKernel::CopyImageToBuffer( reinterpret_cast(src_image.data) + src_origin; const size_t size = image_region.range.x * element_size; - return hsa_memory_copy(dst_memory, src_memory, size); + return HSA::hsa_memory_copy(dst_memory, src_memory, size); } const Image* src_image_view = NULL; @@ -340,8 +339,7 @@ hsa_status_t BlitKernel::CopyImageToBuffer( args->pixelOrigin[1] = image_region.offset.y; args->pixelOrigin[2] = image_region.offset.z; - ImageManager* manager = ext_image::ImageRuntime::instance()->image_manager( - src_image_view->component); + ImageManager* manager = ImageRuntime::instance()->image_manager(src_image_view->component); const uint32_t element_size = manager->GetImageProperty(src_image_view->component, @@ -379,7 +377,7 @@ hsa_status_t BlitKernel::CopyImageToBuffer( if (&src_image != src_image_view) { Image::Destroy(src_image_view); } - hsa_amd_memory_pool_free(args); + AMD::hsa_amd_memory_pool_free(args); return status; } @@ -481,7 +479,7 @@ hsa_status_t BlitKernel::CopyImage( Image::Destroy(dst_image_view); } - hsa_amd_memory_pool_free(args); + AMD::hsa_amd_memory_pool_free(args); return status; } @@ -531,7 +529,7 @@ hsa_status_t BlitKernel::FillImage( hsa_status_t status = LaunchKernel(blit_queue, packet); - hsa_amd_memory_pool_free(args); + AMD::hsa_amd_memory_pool_free(args); return status; } @@ -569,7 +567,8 @@ hsa_status_t BlitKernel::PopulateKernelCode( // Get symbol handle. hsa_executable_symbol_t kernel_symbol = {0}; - hsa_status_t status = hsa_executable_get_symbol_by_name(executable, ocl_kernel_name_[i], &agent, &kernel_symbol); + hsa_status_t status = HSA::hsa_executable_get_symbol_by_name(executable, ocl_kernel_name_[i], + &agent, &kernel_symbol); if (HSA_STATUS_SUCCESS != status) { blit_code_catalog.clear(); return status; @@ -577,15 +576,14 @@ hsa_status_t BlitKernel::PopulateKernelCode( // Get code handle. BlitCodeInfo blit_code = {0}; - status = hsa_executable_symbol_get_info( - kernel_symbol, HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_OBJECT, - &blit_code.code_handle_); + status = HSA::hsa_executable_symbol_get_info( + kernel_symbol, HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_OBJECT, &blit_code.code_handle_); if (HSA_STATUS_SUCCESS != status) { blit_code_catalog.clear(); return status; } - status = hsa_executable_symbol_get_info( + status = HSA::hsa_executable_symbol_get_info( kernel_symbol, HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_GROUP_SEGMENT_SIZE, &blit_code.group_segment_size_); if (HSA_STATUS_SUCCESS != status) { @@ -593,7 +591,7 @@ hsa_status_t BlitKernel::PopulateKernelCode( return status; } - status = hsa_executable_symbol_get_info( + status = HSA::hsa_executable_symbol_get_info( kernel_symbol, HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_PRIVATE_SEGMENT_SIZE, &blit_code.private_segment_size_); if (HSA_STATUS_SUCCESS != status) { @@ -830,11 +828,11 @@ hsa_status_t BlitKernel::ConvertImage(const Image& original_image, static_cast(converted_type), static_cast(converted_order)}; - amd::Image* new_image_handle = amd::Image::Create(original_image.component); + Image* new_image_handle = Image::Create(original_image.component); *new_image_handle=original_image; new_image_handle->desc.geometry = converted_geometry; - hsa_status_t status = ext_image::ImageRuntime::instance() + hsa_status_t status = ImageRuntime::instance() ->image_manager(new_image_handle->component) ->ModifyImageSrd(*new_image_handle, new_format); if (status != HSA_STATUS_SUCCESS) { @@ -864,7 +862,7 @@ hsa_status_t BlitKernel::LaunchKernel(BlitQueue& blit_queue, // Setup completion signal. hsa_signal_t kernel_signal = {0}; - hsa_status_t status = hsa_signal_create(1, 0, NULL, &kernel_signal); + hsa_status_t status = HSA::hsa_signal_create(1, 0, NULL, &kernel_signal); if (HSA_STATUS_SUCCESS != status) { return status; } @@ -875,11 +873,11 @@ hsa_status_t BlitKernel::LaunchKernel(BlitQueue& blit_queue, const uint32_t bitmask = queue->size - 1; // Reserve write index. - uint64_t write_index = hsa_queue_add_write_index_acq_rel(queue, 1); + uint64_t write_index = HSA::hsa_queue_add_write_index_scacq_screl(queue, 1); while (true) { // Wait until we have room in the queue; - const uint64_t read_index = hsa_queue_load_read_index_relaxed(queue); + const uint64_t read_index = HSA::hsa_queue_load_read_index_relaxed(queue); if ((write_index - read_index) < queue->size) { break; } @@ -896,19 +894,19 @@ hsa_status_t BlitKernel::LaunchKernel(BlitQueue& blit_queue, queue_buffer[write_index & bitmask].header = kDispatchPacketHeader; // Update doorbel register. - hsa_signal_store_release(queue->doorbell_signal, write_index); + HSA::hsa_signal_store_screlease(queue->doorbell_signal, write_index); // Wait for the packet to finish. - if (hsa_signal_wait_acquire(kernel_signal, HSA_SIGNAL_CONDITION_LT, 1, - uint64_t(-1), HSA_WAIT_STATE_ACTIVE) != 0) { - status = hsa_signal_destroy(kernel_signal); + if (HSA::hsa_signal_wait_scacquire(kernel_signal, HSA_SIGNAL_CONDITION_LT, 1, uint64_t(-1), + HSA_WAIT_STATE_ACTIVE) != 0) { + status = HSA::hsa_signal_destroy(kernel_signal); assert(status == HSA_STATUS_SUCCESS); // Signal wait returned unexpected value. return HSA_STATUS_ERROR; } // Cleanup - status = hsa_signal_destroy(kernel_signal); + status = HSA::hsa_signal_destroy(kernel_signal); assert(status == HSA_STATUS_SUCCESS); return HSA_STATUS_SUCCESS; @@ -971,5 +969,7 @@ hsa_status_t BlitKernel::GetPatchedBlitObject(const char* agent_name, return HSA_STATUS_SUCCESS; } -} // namespace amd + +} // namespace image +} // namespace rocr #undef HSA_ARGUMENT_ALIGN_BYTES diff --git a/runtime/hsa-runtime/image/blit_kernel.h b/runtime/hsa-runtime/image/blit_kernel.h index 364cc47dae..cd6d730466 100644 --- a/runtime/hsa-runtime/image/blit_kernel.h +++ b/runtime/hsa-runtime/image/blit_kernel.h @@ -9,7 +9,9 @@ #include "inc/hsa.h" #include "resource.h" -namespace amd { +namespace rocr { +namespace image { + typedef struct BlitQueue { hsa_queue_t* queue_; volatile std::atomic cached_index_; @@ -118,6 +120,8 @@ class BlitKernel { // Get the patched code object hsa_status_t GetPatchedBlitObject(const char* agent_name, uint8_t** code_object_handle); }; -} // namespace amd + +} // namespace image +} // namespace rocr #endif // HSA_RUNTIME_EXT_IMAGE_BLIT_KERNEL_H diff --git a/runtime/hsa-runtime/image/blit_object_gfx7xx.cpp b/runtime/hsa-runtime/image/blit_object_gfx7xx.cpp index c1e00a9b60..e2eadb567c 100644 --- a/runtime/hsa-runtime/image/blit_object_gfx7xx.cpp +++ b/runtime/hsa-runtime/image/blit_object_gfx7xx.cpp @@ -1,2 +1,6 @@ #include +namespace rocr { +namespace image { uint8_t blit_object_gfx7xx[] = {127, 69, 76, 70, 2, 1, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 224, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 56, 0, 2, 0, 64, 0, 8, 0, 1, 0, 2, 0, 0, 96, 6, 0, 0, 0, 184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 10, 0, 0, 0, 0, 0, 0, 24, 10, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 96, 5, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 37, 0, 0, 0, 0, 0, 0, 220, 37, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 46, 115, 104, 115, 116, 114, 116, 97, 98, 0, 46, 115, 116, 114, 116, 97, 98, 0, 46, 110, 111, 116, 101, 0, 46, 104, 115, 97, 100, 97, 116, 97, 95, 114, 101, 97, 100, 111, 110, 108, 121, 95, 97, 103, 101, 110, 116, 0, 46, 104, 115, 97, 116, 101, 120, 116, 0, 46, 115, 121, 109, 116, 97, 98, 0, 46, 115, 121, 109, 116, 97, 98, 0, 46, 114, 101, 108, 97, 46, 104, 115, 97, 116, 101, 120, 116, 0, 0, 0, 38, 104, 115, 97, 95, 101, 120, 116, 95, 105, 109, 97, 103, 101, 58, 58, 38, 95, 95, 111, 99, 109, 108, 116, 98, 108, 95, 77, 51, 50, 95, 69, 88, 80, 95, 69, 80, 0, 38, 104, 115, 97, 95, 101, 120, 116, 95, 105, 109, 97, 103, 101, 58, 58, 38, 95, 95, 111, 99, 109, 108, 116, 98, 108, 95, 77, 51, 50, 95, 76, 79, 71, 69, 0, 38, 104, 115, 97, 95, 101, 120, 116, 95, 105, 109, 97, 103, 101, 58, 58, 38, 95, 95, 111, 99, 109, 108, 116, 98, 108, 95, 77, 51, 50, 95, 76, 79, 71, 95, 73, 78, 86, 95, 69, 80, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 116, 111, 95, 98, 117, 102, 102, 101, 114, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 98, 117, 102, 102, 101, 114, 95, 116, 111, 95, 105, 109, 97, 103, 101, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 100, 101, 102, 97, 117, 108, 116, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 108, 105, 110, 101, 97, 114, 95, 116, 111, 95, 115, 116, 97, 110, 100, 97, 114, 100, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 115, 116, 97, 110, 100, 97, 114, 100, 95, 116, 111, 95, 108, 105, 110, 101, 97, 114, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 49, 100, 98, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 49, 100, 98, 95, 116, 111, 95, 114, 101, 103, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 114, 101, 103, 95, 116, 111, 95, 49, 100, 98, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 108, 101, 97, 114, 95, 105, 109, 97, 103, 101, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 108, 101, 97, 114, 95, 105, 109, 97, 103, 101, 95, 49, 100, 98, 95, 107, 101, 114, 110, 101, 108, 0, 95, 95, 104, 115, 97, 95, 115, 101, 99, 116, 105, 111, 110, 46, 104, 115, 97, 100, 97, 116, 97, 95, 114, 101, 97, 100, 111, 110, 108, 121, 95, 97, 103, 101, 110, 116, 0, 95, 95, 104, 115, 97, 95, 115, 101, 99, 116, 105, 111, 110, 46, 104, 115, 97, 116, 101, 120, 116, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 65, 77, 68, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 65, 77, 68, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 0, 4, 0, 0, 0, 26, 0, 0, 0, 3, 0, 0, 0, 65, 77, 68, 0, 4, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 77, 68, 0, 65, 77, 68, 71, 80, 85, 0, 0, 4, 0, 0, 0, 41, 0, 0, 0, 4, 0, 0, 0, 65, 77, 68, 0, 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 65, 77, 68, 32, 72, 83, 65, 32, 82, 117, 110, 116, 105, 109, 101, 32, 70, 105, 110, 97, 108, 105, 122, 101, 114, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 26, 0, 0, 0, 5, 0, 0, 0, 65, 77, 68, 0, 22, 0, 45, 104, 115, 97, 95, 99, 97, 108, 108, 95, 99, 111, 110, 118, 101, 110, 116, 105, 111, 110, 61, 48, 0, 37, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 96, 129, 63, 119, 62, 26, 57, 0, 192, 130, 63, 138, 105, 216, 57, 0, 32, 132, 63, 29, 70, 81, 58, 0, 160, 133, 63, 124, 54, 172, 57, 0, 0, 135, 63, 180, 12, 123, 58, 0, 128, 136, 63, 4, 116, 64, 58, 0, 0, 138, 63, 170, 171, 38, 58, 0, 128, 139, 63, 31, 15, 46, 58, 0, 0, 141, 63, 219, 250, 86, 58, 0, 160, 142, 63, 104, 49, 7, 57, 0, 32, 144, 63, 24, 226, 14, 58, 0, 192, 145, 63, 234, 220, 244, 56, 0, 64, 147, 63, 120, 89, 81, 58, 0, 224, 148, 63, 71, 125, 39, 58, 0, 128, 150, 63, 185, 105, 33, 58, 0, 32, 152, 63, 140, 130, 63, 58, 0, 224, 153, 63, 65, 38, 11, 55, 0, 128, 155, 63, 157, 155, 211, 57, 0, 32, 157, 63, 57, 205, 118, 58, 0, 224, 158, 63, 4, 147, 41, 58, 0, 160, 160, 63, 125, 136, 2, 58, 0, 96, 162, 63, 24, 24, 2, 58, 0, 32, 164, 63, 112, 173, 40, 58, 0, 224, 165, 63, 77, 181, 118, 58, 0, 192, 167, 63, 78, 59, 217, 57, 0, 160, 169, 63, 117, 90, 45, 56, 0, 96, 171, 63, 173, 205, 81, 58, 0, 64, 173, 63, 82, 247, 65, 58, 0, 32, 175, 63, 107, 197, 91, 58, 0, 32, 177, 63, 116, 96, 253, 56, 0, 0, 179, 63, 149, 32, 14, 58, 0, 0, 181, 63, 127, 102, 30, 57, 0, 224, 182, 63, 25, 143, 108, 58, 0, 224, 184, 63, 59, 122, 93, 58, 0, 224, 186, 63, 144, 213, 122, 58, 0, 0, 189, 63, 245, 57, 138, 57, 0, 0, 191, 63, 179, 205, 60, 58, 0, 32, 193, 63, 166, 204, 196, 57, 0, 64, 195, 63, 68, 155, 89, 57, 0, 96, 197, 63, 42, 66, 101, 57, 0, 128, 199, 63, 138, 76, 215, 57, 0, 160, 201, 63, 51, 236, 77, 58, 0, 224, 203, 63, 239, 79, 193, 57, 0, 32, 206, 63, 163, 130, 17, 57, 0, 96, 208, 63, 187, 246, 204, 56, 0, 160, 210, 63, 31, 217, 129, 57, 0, 224, 212, 63, 94, 213, 26, 58, 0, 64, 215, 63, 90, 153, 31, 57, 0, 128, 217, 63, 19, 174, 104, 58, 0, 224, 219, 63, 190, 188, 93, 58, 0, 96, 222, 63, 94, 130, 244, 55, 0, 192, 224, 63, 194, 238, 205, 57, 0, 32, 227, 63, 149, 75, 124, 58, 0, 160, 229, 63, 59, 55, 72, 58, 0, 32, 232, 63, 129, 82, 75, 58, 0, 192, 234, 63, 221, 231, 198, 55, 0, 64, 237, 63, 237, 1, 243, 57, 0, 224, 239, 63, 123, 51, 23, 57, 0, 128, 242, 63, 44, 158, 59, 56, 0, 32, 245, 63, 164, 162, 47, 57, 0, 192, 247, 63, 152, 251, 6, 58, 0, 128, 250, 63, 220, 182, 236, 56, 0, 32, 253, 63, 103, 96, 112, 58, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 59, 65, 172, 41, 52, 0, 0, 126, 60, 252, 176, 168, 53, 0, 192, 189, 60, 234, 131, 141, 54, 0, 16, 252, 60, 120, 14, 27, 54, 0, 240, 28, 61, 254, 185, 135, 54, 0, 160, 59, 61, 101, 236, 49, 54, 0, 16, 90, 61, 25, 113, 221, 54, 0, 80, 120, 61, 69, 0, 195, 53, 0, 32, 139, 61, 81, 119, 155, 55, 0, 0, 154, 61, 13, 203, 235, 55, 0, 208, 168, 61, 131, 159, 131, 55, 0, 128, 183, 61, 229, 138, 82, 55, 0, 16, 198, 61, 24, 235, 162, 55, 0, 144, 212, 61, 149, 116, 218, 54, 0, 240, 226, 61, 183, 30, 169, 54, 0, 48, 241, 61, 21, 183, 131, 55, 0, 96, 255, 61, 219, 49, 17, 55, 0, 176, 6, 62, 104, 62, 63, 56, 0, 176, 13, 62, 151, 106, 21, 56, 0, 160, 20, 62, 15, 124, 41, 56, 0, 128, 27, 62, 15, 16, 126, 56, 0, 96, 34, 62, 101, 182, 21, 56, 0, 48, 41, 62, 161, 227, 229, 55, 0, 240, 47, 62, 83, 56, 24, 56, 0, 176, 54, 62, 157, 113, 254, 53, 0, 80, 61, 62, 8, 129, 68, 56, 0, 240, 67, 62, 144, 50, 80, 56, 0, 144, 74, 62, 232, 57, 53, 55, 0, 16, 81, 62, 241, 15, 94, 56, 0, 144, 87, 62, 64, 167, 100, 56, 0, 16, 94, 62, 45, 116, 134, 55, 0, 112, 100, 62, 205, 227, 123, 56, 0, 224, 106, 62, 62, 173, 133, 54, 0, 48, 113, 62, 21, 183, 3, 56, 0, 128, 119, 62, 220, 203, 173, 55, 0, 192, 125, 62, 175, 54, 12, 56, 0, 0, 130, 62, 211, 82, 22, 55, 0, 16, 133, 62, 57, 113, 146, 56, 0, 32, 136, 62, 215, 252, 197, 56, 0, 48, 139, 62, 213, 85, 174, 56, 0, 64, 142, 62, 105, 193, 24, 56, 0, 64, 145, 62, 231, 253, 160, 56, 0, 64, 148, 62, 239, 9, 173, 56, 0, 64, 151, 62, 225, 186, 98, 56, 0, 48, 154, 62, 76, 205, 238, 56, 0, 48, 157, 62, 210, 170, 152, 55, 0, 32, 160, 62, 26, 26, 66, 55, 0, 0, 163, 62, 14, 225, 197, 56, 0, 240, 165, 62, 238, 42, 191, 55, 0, 208, 168, 62, 45, 135, 45, 56, 0, 176, 171, 62, 138, 46, 238, 55, 0, 128, 174, 62, 172, 223, 222, 56, 0, 96, 177, 62, 185, 242, 2, 56, 0, 48, 180, 62, 155, 30, 72, 56, 0, 0, 183, 62, 43, 170, 14, 56, 0, 192, 185, 62, 93, 251, 235, 56, 0, 144, 188, 62, 221, 95, 37, 56, 0, 80, 191, 62, 130, 59, 120, 56, 0, 16, 194, 62, 30, 218, 81, 56, 0, 208, 196, 62, 5, 27, 78, 55, 0, 128, 199, 62, 155, 67, 143, 56, 0, 48, 202, 62, 16, 14, 202, 56, 0, 224, 204, 62, 139, 192, 202, 56, 0, 144, 207, 62, 95, 246, 145, 56, 0, 64, 210, 62, 203, 33, 129, 55, 0, 224, 212, 62, 154, 154, 108, 56, 0, 128, 215, 62, 35, 153, 148, 56, 0, 32, 218, 62, 204, 123, 119, 56, 0, 192, 220, 62, 38, 45, 177, 55, 0, 80, 223, 62, 211, 206, 166, 56, 0, 224, 225, 62, 230, 211, 235, 56, 0, 112, 228, 62, 205, 227, 251, 56, 0, 0, 231, 62, 194, 133, 215, 56, 0, 144, 233, 62, 0, 126, 126, 56, 0, 16, 236, 62, 197, 146, 243, 56, 0, 160, 238, 62, 131, 9, 212, 55, 0, 32, 241, 62, 124, 26, 8, 56, 0, 160, 243, 62, 173, 195, 132, 55, 0, 16, 246, 62, 35, 233, 204, 56, 0, 144, 248, 62, 175, 95, 15, 56, 0, 0, 251, 62, 56, 253, 145, 56, 0, 112, 253, 62, 188, 71, 172, 56, 0, 224, 255, 62, 43, 4, 151, 56, 0, 32, 1, 63, 210, 82, 41, 57, 0, 80, 2, 63, 212, 206, 111, 57, 0, 144, 3, 63, 115, 112, 249, 55, 0, 192, 4, 63, 174, 158, 94, 56, 0, 240, 5, 63, 74, 200, 101, 56, 0, 32, 7, 63, 163, 11, 19, 56, 0, 64, 8, 63, 22, 207, 121, 57, 0, 112, 9, 63, 201, 202, 56, 57, 0, 160, 10, 63, 244, 210, 195, 56, 0, 192, 11, 63, 236, 93, 117, 57, 0, 240, 12, 63, 103, 180, 230, 56, 0, 16, 14, 63, 184, 15, 92, 57, 0, 64, 15, 63, 224, 188, 62, 56, 0, 96, 16, 63, 146, 209, 220, 56, 0, 128, 17, 63, 223, 107, 24, 57, 0, 160, 18, 63, 76, 231, 45, 57, 0, 192, 19, 63, 68, 9, 47, 57, 0, 224, 20, 63, 97, 255, 27, 57, 0, 0, 22, 63, 68, 237, 233, 56, 0, 32, 23, 63, 200, 109, 104, 56, 0, 48, 24, 63, 167, 153, 107, 57, 0, 80, 25, 63, 137, 156, 9, 57, 0, 112, 26, 63, 115, 118, 162, 55, 0, 128, 27, 63, 163, 218, 11, 57, 0, 144, 28, 63, 171, 105, 112, 57, 0, 176, 29, 63, 255, 73, 132, 56, 0, 192, 30, 63, 56, 53, 1, 57, 0, 208, 31, 63, 104, 194, 45, 57, 0, 224, 32, 63, 35, 244, 71, 57, 0, 240, 33, 63, 124, 241, 79, 57, 0, 0, 35, 63, 14, 225, 69, 57, 0, 16, 36, 63, 245, 232, 41, 57, 0, 32, 37, 63, 176, 93, 248, 56, 0, 48, 38, 63, 153, 95, 115, 56, 0, 48, 39, 63, 219, 8, 108, 57, 0, 64, 40, 63, 0, 230, 9, 57, 0, 80, 41, 63, 111, 153, 180, 55, 0, 80, 42, 63, 204, 51, 18, 57, 0, 80, 43, 63, 217, 234, 124, 57, 0, 96, 44, 63, 205, 181, 173, 56, 0, 96, 45, 63, 26, 38, 32, 57, 0, 96, 46, 63, 54, 238, 88, 57, 0, 112, 47, 63, 5, 73, 170, 53, 0, 112, 48, 63, 30, 209, 203, 55, 0, 112, 49, 63, 244, 253, 5, 56, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 254, 63, 248, 3, 254, 56, 0, 0, 252, 63, 193, 15, 252, 57, 0, 0, 250, 63, 201, 179, 140, 58, 0, 0, 248, 63, 16, 62, 248, 58, 0, 0, 246, 63, 48, 123, 64, 59, 0, 0, 244, 63, 96, 141, 137, 59, 0, 0, 242, 63, 72, 214, 185, 59, 0, 0, 240, 63, 241, 240, 240, 59, 0, 0, 239, 63, 127, 220, 186, 58, 0, 0, 237, 63, 108, 7, 102, 59, 0, 0, 235, 63, 166, 178, 189, 59, 0, 0, 234, 63, 161, 14, 234, 57, 0, 0, 232, 63, 247, 88, 75, 59, 0, 0, 230, 63, 72, 180, 194, 59, 0, 0, 229, 63, 172, 96, 150, 58, 0, 0, 227, 63, 228, 56, 142, 59, 0, 0, 225, 63, 14, 120, 252, 59, 0, 0, 224, 63, 56, 112, 96, 59, 0, 0, 222, 63, 77, 92, 233, 59, 0, 0, 221, 63, 76, 145, 79, 59, 0, 0, 219, 63, 239, 97, 235, 59, 0, 0, 218, 63, 79, 27, 104, 59, 0, 0, 217, 63, 178, 1, 89, 56, 0, 0, 215, 63, 229, 53, 148, 59, 0, 0, 214, 63, 89, 3, 174, 58, 0, 0, 212, 63, 3, 123, 199, 59, 0, 0, 211, 63, 109, 26, 80, 59, 0, 0, 210, 63, 33, 13, 210, 57, 0, 0, 208, 63, 204, 159, 182, 59, 0, 0, 207, 63, 81, 233, 72, 59, 0, 0, 206, 63, 185, 83, 52, 58, 0, 0, 204, 63, 205, 204, 204, 59, 0, 0, 203, 63, 192, 39, 135, 59, 0, 0, 202, 63, 205, 15, 11, 59, 0, 0, 201, 63, 209, 73, 123, 57, 0, 0, 199, 63, 125, 12, 206, 59, 0, 0, 198, 63, 106, 12, 152, 59, 0, 0, 197, 63, 247, 144, 75, 59, 0, 0, 196, 63, 21, 190, 220, 58, 0, 0, 195, 63, 49, 12, 195, 57, 0, 0, 193, 63, 214, 187, 228, 59, 0, 0, 192, 63, 193, 192, 192, 59, 0, 0, 191, 63, 232, 47, 160, 59, 0, 0, 190, 63, 12, 250, 130, 59, 0, 0, 189, 63, 142, 32, 82, 59, 0, 0, 188, 63, 24, 200, 36, 59, 0, 0, 187, 63, 135, 156, 251, 58, 0, 0, 186, 63, 140, 46, 186, 58, 0, 0, 185, 63, 233, 15, 133, 58, 0, 0, 184, 63, 3, 23, 56, 58, 0, 0, 183, 63, 162, 181, 251, 57, 0, 0, 182, 63, 97, 11, 182, 57, 0, 0, 181, 63, 170, 104, 158, 57, 0, 0, 180, 63, 65, 11, 180, 57, 0, 0, 179, 63, 41, 53, 246, 57, 0, 0, 178, 63, 67, 22, 50, 58, 0, 0, 177, 63, 192, 157, 126, 58, 0, 0, 176, 63, 11, 44, 176, 58, 0, 0, 175, 63, 26, 119, 235, 58, 0, 0, 174, 63, 185, 130, 24, 59, 0, 0, 173, 63, 176, 86, 64, 59, 0, 0, 172, 63, 8, 35, 109, 59, 0, 0, 171, 63, 227, 105, 143, 59, 0, 0, 170, 63, 171, 170, 170, 59, 0, 0, 169, 63, 72, 74, 200, 59, 0, 0, 168, 63, 87, 63, 232, 59, 0, 0, 168, 63, 129, 10, 168, 57, 0, 0, 167, 63, 230, 20, 188, 58, 0, 0, 166, 63, 114, 136, 43, 59, 0, 0, 165, 63, 5, 106, 125, 59, 0, 0, 164, 63, 30, 207, 169, 59, 0, 0, 163, 63, 61, 10, 215, 59, 0, 0, 163, 63, 246, 199, 75, 57, 0, 0, 162, 63, 172, 12, 223, 58, 0, 0, 161, 63, 93, 98, 86, 59, 0, 0, 160, 63, 161, 160, 160, 59, 0, 0, 159, 63, 254, 9, 216, 59, 0, 0, 159, 63, 57, 47, 11, 58, 0, 0, 158, 63, 72, 90, 25, 59, 0, 0, 157, 63, 158, 216, 137, 59, 0, 0, 156, 63, 97, 225, 200, 59, 0, 0, 156, 63, 193, 9, 156, 57, 0, 0, 155, 63, 62, 223, 24, 59, 0, 0, 154, 63, 217, 231, 144, 59, 0, 0, 153, 63, 219, 34, 215, 59, 0, 0, 153, 63, 139, 210, 120, 58, 0, 0, 152, 63, 19, 144, 81, 59, 0, 0, 151, 63, 237, 37, 180, 59, 0, 0, 151, 63, 46, 1, 23, 56, 0, 0, 150, 63, 216, 180, 31, 59, 0, 0, 149, 63, 104, 37, 160, 59, 0, 0, 148, 63, 79, 9, 242, 59, 0, 0, 148, 63, 41, 1, 11, 59, 0, 0, 147, 63, 196, 133, 154, 59, 0, 0, 146, 63, 132, 19, 241, 59, 0, 0, 146, 63, 37, 73, 18, 59, 0, 0, 145, 63, 197, 179, 162, 59, 0, 0, 144, 63, 9, 188, 253, 59, 0, 0, 144, 63, 198, 112, 52, 59, 0, 0, 143, 63, 238, 35, 184, 59, 0, 0, 143, 63, 208, 206, 59, 58, 0, 0, 142, 63, 218, 106, 112, 59, 0, 0, 141, 63, 2, 82, 218, 59, 0, 0, 141, 63, 35, 44, 247, 58, 0, 0, 140, 63, 4, 156, 162, 59, 0, 0, 140, 63, 193, 8, 140, 57, 0, 0, 139, 63, 148, 104, 96, 59, 0, 0, 138, 63, 252, 242, 216, 59, 0, 0, 138, 63, 225, 240, 5, 59, 0, 0, 137, 63, 138, 64, 174, 59, 0, 0, 137, 63, 215, 57, 86, 58, 0, 0, 136, 63, 137, 136, 136, 59, 0, 0, 135, 63, 136, 128, 247, 59, 0, 0, 135, 63, 190, 86, 79, 59, 0, 0, 134, 63, 68, 5, 217, 59, 0, 0, 134, 63, 252, 20, 23, 59, 0, 0, 133, 63, 97, 55, 191, 59, 0, 0, 133, 63, 77, 33, 208, 58, 0, 0, 132, 63, 200, 249, 169, 59, 0, 0, 132, 63, 8, 33, 132, 58, 0, 0, 131, 63, 82, 48, 153, 59, 0, 0, 131, 63, 188, 116, 19, 58, 0, 0, 130, 63, 191, 191, 140, 59, 0, 0, 130, 63, 33, 8, 130, 57, 0, 0, 129, 63, 169, 141, 132, 59, 0, 0, 129, 63, 4, 2, 129, 56, 0, 0, 128, 63, 129, 128, 128, 59, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 11, 0, 11, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 64, 192, 127, 0, 140, 191, 0, 255, 2, 135, 255, 255, 0, 0, 0, 255, 128, 147, 16, 0, 16, 0, 1, 255, 1, 135, 255, 255, 0, 0, 2, 8, 2, 147, 0, 9, 0, 147, 1, 10, 1, 147, 0, 7, 132, 192, 4, 7, 66, 192, 26, 7, 70, 192, 28, 135, 1, 192, 127, 0, 140, 191, 2, 8, 2, 128, 0, 10, 0, 128, 2, 0, 0, 74, 0, 2, 2, 74, 1, 4, 0, 128, 4, 0, 2, 209, 1, 27, 0, 0, 8, 0, 2, 209, 0, 25, 0, 0, 0, 4, 4, 74, 8, 4, 128, 135, 3, 4, 8, 125, 0, 106, 128, 135, 0, 36, 128, 190, 188, 0, 136, 191, 6, 7, 65, 192, 14, 7, 66, 192, 16, 7, 4, 192, 18, 7, 69, 192, 32, 135, 4, 192, 34, 7, 134, 192, 159, 0, 6, 48, 159, 2, 8, 48, 127, 0, 140, 191, 5, 0, 212, 210, 1, 25, 0, 0, 4, 0, 210, 210, 4, 25, 0, 0, 4, 11, 8, 74, 5, 0, 210, 210, 1, 27, 0, 0, 5, 9, 8, 74, 5, 0, 210, 210, 1, 25, 0, 0, 5, 106, 74, 210, 5, 1, 2, 0, 4, 7, 6, 80, 4, 0, 14, 74, 5, 2, 16, 74, 8, 4, 18, 74, 159, 4, 12, 48, 0, 3, 200, 192, 128, 2, 20, 126, 127, 0, 140, 191, 0, 95, 0, 240, 7, 7, 4, 0, 0, 0, 212, 210, 2, 29, 0, 0, 1, 0, 210, 210, 6, 29, 0, 0, 1, 1, 0, 74, 1, 0, 210, 210, 2, 31, 0, 0, 1, 1, 0, 74, 1, 0, 210, 210, 2, 29, 0, 0, 1, 106, 74, 210, 1, 11, 2, 0, 0, 7, 0, 80, 2, 0, 212, 210, 1, 19, 0, 0, 0, 0, 210, 210, 0, 19, 0, 0, 0, 5, 0, 74, 1, 0, 210, 210, 1, 19, 0, 0, 3, 106, 74, 210, 1, 21, 0, 0, 11, 2, 4, 126, 0, 5, 8, 80, 30, 7, 65, 192, 8, 7, 66, 192, 127, 0, 140, 191, 2, 132, 0, 191, 83, 0, 133, 191, 10, 7, 68, 192, 2, 130, 0, 191, 41, 0, 132, 191, 3, 132, 0, 191, 29, 0, 133, 191, 3, 130, 0, 191, 12, 0, 132, 191, 0, 0, 194, 210, 3, 5, 1, 0, 112, 15, 140, 191, 144, 16, 4, 52, 0, 106, 74, 210, 4, 0, 2, 0, 5, 2, 6, 126, 3, 3, 2, 80, 2, 15, 4, 56, 0, 0, 112, 220, 0, 2, 0, 0, 109, 0, 130, 191, 3, 129, 0, 191, 107, 0, 132, 191, 0, 0, 194, 210, 3, 3, 1, 0, 112, 15, 140, 191, 136, 16, 4, 52, 127, 0, 140, 191, 0, 106, 74, 210, 8, 0, 2, 0, 9, 2, 6, 126, 3, 3, 2, 80, 2, 15, 4, 56, 0, 0, 104, 220, 0, 2, 0, 0, 94, 0, 130, 191, 0, 0, 194, 210, 3, 5, 1, 0, 0, 106, 74, 210, 4, 0, 2, 0, 5, 2, 4, 126, 2, 3, 2, 80, 112, 15, 140, 191, 0, 0, 116, 220, 0, 7, 0, 0, 84, 0, 130, 191, 2, 129, 0, 191, 82, 0, 132, 191, 3, 132, 0, 191, 25, 0, 133, 191, 3, 130, 0, 191, 11, 0, 132, 191, 0, 0, 194, 210, 3, 3, 1, 0, 127, 0, 140, 191, 0, 106, 74, 210, 8, 0, 2, 0, 9, 2, 4, 126, 2, 3, 2, 80, 112, 15, 140, 191, 0, 0, 104, 220, 0, 7, 0, 0, 67, 0, 130, 191, 3, 129, 0, 191, 65, 0, 132, 191, 12, 7, 65, 192, 127, 0, 140, 191, 0, 106, 74, 210, 2, 6, 2, 0, 3, 2, 4, 126, 2, 9, 2, 80, 112, 15, 140, 191, 0, 0, 96, 220, 0, 7, 0, 0, 55, 0, 130, 191, 0, 0, 194, 210, 3, 5, 1, 0, 0, 106, 74, 210, 4, 0, 2, 0, 5, 2, 4, 126, 2, 3, 2, 80, 112, 15, 140, 191, 0, 0, 112, 220, 0, 7, 0, 0, 45, 0, 130, 191, 3, 132, 0, 191, 34, 0, 133, 191, 3, 130, 0, 191, 14, 0, 132, 191, 112, 15, 140, 191, 144, 16, 0, 52, 0, 15, 10, 56, 1, 0, 194, 210, 3, 5, 1, 0, 1, 106, 74, 210, 4, 2, 2, 0, 5, 2, 6, 126, 3, 5, 4, 80, 144, 20, 6, 52, 3, 19, 12, 56, 0, 0, 116, 220, 1, 5, 0, 0, 27, 0, 130, 191, 3, 129, 0, 191, 25, 0, 132, 191, 112, 15, 140, 191, 136, 16, 0, 52, 1, 0, 194, 210, 3, 5, 1, 0, 0, 15, 0, 56, 144, 18, 6, 52, 0, 7, 0, 56, 152, 20, 6, 52, 1, 106, 74, 210, 4, 2, 2, 0, 5, 2, 8, 126, 4, 5, 4, 80, 0, 7, 0, 56, 0, 0, 112, 220, 1, 0, 0, 0, 9, 0, 130, 191, 0, 0, 194, 210, 3, 5, 1, 0, 0, 106, 74, 210, 4, 0, 2, 0, 5, 2, 4, 126, 2, 3, 2, 80, 112, 15, 140, 191, 0, 0, 120, 220, 0, 7, 0, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 19, 0, 19, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 64, 192, 127, 0, 140, 191, 0, 255, 2, 135, 255, 255, 0, 0, 0, 255, 128, 147, 16, 0, 16, 0, 1, 255, 1, 135, 255, 255, 0, 0, 2, 8, 2, 147, 0, 9, 0, 147, 1, 10, 1, 147, 0, 7, 132, 192, 4, 7, 66, 192, 22, 7, 70, 192, 24, 135, 1, 192, 127, 0, 140, 191, 2, 8, 2, 128, 0, 10, 0, 128, 2, 0, 0, 74, 0, 2, 2, 74, 1, 4, 0, 128, 4, 0, 2, 209, 1, 27, 0, 0, 8, 0, 2, 209, 0, 25, 0, 0, 0, 4, 4, 74, 8, 4, 128, 135, 3, 4, 8, 125, 0, 106, 128, 135, 0, 36, 128, 190, 193, 0, 136, 191, 10, 7, 65, 192, 18, 7, 66, 192, 20, 7, 4, 192, 28, 135, 4, 192, 30, 7, 134, 192, 159, 0, 6, 48, 159, 2, 8, 48, 127, 0, 140, 191, 5, 0, 212, 210, 1, 25, 0, 0, 4, 0, 210, 210, 4, 25, 0, 0, 4, 11, 8, 74, 5, 0, 210, 210, 1, 27, 0, 0, 5, 9, 8, 74, 5, 0, 210, 210, 1, 25, 0, 0, 5, 106, 74, 210, 5, 1, 2, 0, 4, 7, 6, 80, 159, 4, 8, 48, 6, 0, 212, 210, 2, 29, 0, 0, 4, 0, 210, 210, 4, 29, 0, 0, 4, 13, 8, 74, 6, 0, 210, 210, 2, 31, 0, 0, 6, 9, 8, 74, 6, 0, 210, 210, 2, 29, 0, 0, 5, 106, 74, 210, 6, 11, 2, 0, 4, 7, 6, 80, 4, 0, 212, 210, 5, 19, 0, 0, 3, 0, 210, 210, 3, 19, 0, 0, 3, 9, 6, 74, 4, 0, 210, 210, 5, 19, 0, 0, 6, 106, 74, 210, 4, 5, 0, 0, 3, 2, 10, 126, 3, 11, 14, 80, 4, 0, 30, 74, 5, 2, 32, 74, 8, 4, 34, 74, 26, 7, 65, 192, 6, 7, 68, 192, 127, 0, 140, 191, 2, 132, 0, 191, 77, 0, 133, 191, 2, 130, 0, 191, 39, 0, 132, 191, 3, 130, 0, 191, 13, 0, 132, 191, 3, 0, 194, 210, 6, 5, 1, 0, 3, 106, 74, 210, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 80, 0, 0, 48, 220, 3, 0, 0, 3, 112, 0, 140, 191, 144, 6, 12, 44, 5, 0, 144, 210, 3, 1, 65, 2, 57, 0, 130, 191, 3, 129, 0, 191, 13, 0, 132, 191, 3, 0, 194, 210, 6, 3, 1, 0, 3, 106, 74, 210, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 80, 0, 0, 40, 220, 3, 0, 0, 3, 112, 0, 140, 191, 136, 6, 12, 44, 5, 0, 144, 210, 3, 1, 33, 2, 42, 0, 130, 191, 3, 0, 194, 210, 6, 5, 1, 0, 3, 106, 74, 210, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 80, 0, 0, 52, 220, 3, 0, 0, 5, 33, 0, 130, 191, 2, 129, 0, 191, 29, 0, 132, 191, 3, 130, 0, 191, 9, 0, 132, 191, 3, 0, 194, 210, 6, 3, 1, 0, 3, 106, 74, 210, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 80, 0, 0, 40, 220, 3, 0, 0, 5, 19, 0, 130, 191, 3, 129, 0, 191, 7, 0, 132, 191, 3, 106, 74, 210, 8, 12, 2, 0, 9, 2, 10, 126, 5, 15, 8, 80, 0, 0, 32, 220, 3, 0, 0, 5, 10, 0, 130, 191, 3, 0, 194, 210, 6, 5, 1, 0, 3, 106, 74, 210, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 80, 0, 0, 48, 220, 3, 0, 0, 5, 1, 0, 130, 191, 2, 2, 10, 126, 3, 2, 12, 126, 5, 2, 16, 126, 4, 2, 14, 126, 55, 0, 130, 191, 3, 129, 0, 191, 17, 0, 132, 191, 3, 0, 194, 210, 6, 5, 1, 0, 3, 106, 74, 210, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 80, 0, 0, 48, 220, 3, 0, 0, 3, 112, 0, 140, 191, 152, 6, 16, 44, 7, 0, 144, 210, 3, 33, 33, 2, 6, 0, 144, 210, 3, 17, 33, 2, 5, 0, 144, 210, 3, 1, 33, 2, 36, 0, 130, 191, 3, 0, 194, 210, 6, 5, 1, 0, 3, 106, 74, 210, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 80, 0, 0, 48, 220, 3, 0, 0, 5, 3, 130, 0, 191, 14, 0, 132, 191, 3, 106, 74, 210, 3, 9, 1, 0, 4, 106, 80, 210, 4, 1, 169, 1, 0, 0, 48, 220, 3, 0, 0, 3, 112, 0, 140, 191, 144, 6, 16, 44, 7, 0, 144, 210, 3, 1, 65, 2, 144, 10, 12, 44, 5, 0, 144, 210, 5, 1, 65, 2, 12, 0, 130, 191, 6, 106, 74, 210, 3, 25, 1, 0, 7, 106, 80, 210, 4, 1, 169, 1, 0, 0, 48, 220, 6, 0, 0, 8, 3, 106, 74, 210, 3, 9, 1, 0, 4, 106, 80, 210, 4, 1, 169, 1, 0, 0, 52, 220, 3, 0, 0, 6, 8, 7, 65, 192, 127, 0, 140, 191, 0, 3, 194, 192, 128, 2, 36, 126, 112, 0, 140, 191, 0, 95, 32, 240, 15, 5, 1, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 11, 0, 11, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 64, 192, 127, 0, 140, 191, 0, 255, 2, 135, 255, 255, 0, 0, 0, 255, 128, 147, 16, 0, 16, 0, 1, 255, 1, 135, 255, 255, 0, 0, 2, 8, 2, 147, 0, 9, 0, 147, 1, 10, 1, 147, 0, 7, 132, 192, 4, 7, 66, 192, 18, 7, 70, 192, 20, 135, 1, 192, 127, 0, 140, 191, 2, 8, 2, 128, 0, 10, 0, 128, 2, 0, 0, 74, 0, 2, 2, 74, 1, 4, 0, 128, 4, 0, 12, 209, 1, 27, 0, 0, 8, 0, 12, 209, 0, 25, 0, 0, 0, 4, 4, 74, 8, 4, 128, 136, 3, 4, 6, 125, 0, 106, 234, 136, 126, 4, 128, 190, 0, 106, 254, 138, 22, 0, 136, 191, 6, 7, 132, 192, 10, 7, 65, 192, 12, 7, 2, 192, 127, 0, 140, 191, 0, 9, 198, 192, 2, 0, 6, 74, 3, 2, 8, 74, 4, 4, 10, 74, 128, 2, 12, 126, 127, 0, 140, 191, 0, 95, 0, 240, 3, 3, 3, 0, 14, 7, 130, 192, 0, 11, 196, 192, 127, 0, 140, 191, 4, 0, 14, 74, 5, 2, 16, 74, 6, 4, 18, 74, 128, 2, 20, 126, 112, 15, 140, 191, 0, 95, 32, 240, 7, 3, 2, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 0, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 21, 0, 21, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 64, 192, 127, 0, 140, 191, 0, 255, 2, 135, 255, 255, 0, 0, 0, 255, 128, 147, 16, 0, 16, 0, 1, 255, 1, 135, 255, 255, 0, 0, 2, 8, 2, 147, 0, 9, 0, 147, 1, 10, 1, 147, 0, 7, 132, 192, 4, 7, 66, 192, 18, 7, 70, 192, 20, 135, 1, 192, 127, 0, 140, 191, 2, 8, 2, 128, 0, 10, 0, 128, 2, 0, 0, 74, 0, 2, 2, 74, 1, 4, 0, 128, 4, 0, 12, 209, 1, 27, 0, 0, 8, 0, 12, 209, 0, 25, 0, 0, 0, 4, 4, 74, 8, 4, 128, 136, 3, 4, 6, 125, 0, 106, 234, 136, 126, 4, 128, 190, 0, 106, 254, 138, 212, 2, 136, 191, 6, 7, 65, 192, 10, 7, 66, 192, 12, 7, 4, 192, 127, 0, 140, 191, 0, 3, 198, 192, 4, 0, 6, 74, 5, 2, 8, 74, 8, 4, 10, 74, 128, 2, 12, 126, 127, 0, 140, 191, 0, 95, 0, 240, 3, 3, 3, 0, 112, 15, 140, 191, 106, 0, 16, 209, 3, 7, 1, 0, 3, 0, 0, 210, 3, 1, 169, 1, 242, 6, 28, 124, 106, 36, 130, 190, 223, 0, 136, 191, 128, 6, 8, 124, 106, 36, 132, 190, 128, 2, 6, 126, 4, 126, 254, 138, 217, 0, 136, 191, 255, 3, 136, 190, 28, 46, 77, 59, 8, 6, 8, 124, 106, 36, 136, 190, 255, 6, 6, 16, 82, 184, 78, 65, 8, 126, 254, 138, 242, 6, 6, 16, 208, 0, 136, 191, 255, 6, 14, 54, 255, 255, 255, 127, 242, 14, 16, 8, 255, 3, 138, 190, 0, 0, 128, 61, 106, 1, 22, 208, 8, 21, 0, 0, 126, 4, 138, 190, 10, 106, 254, 138, 7, 129, 16, 126, 69, 0, 136, 191, 129, 16, 18, 52, 255, 16, 16, 74, 0, 0, 128, 0, 255, 18, 18, 74, 0, 0, 0, 1, 255, 16, 20, 54, 0, 0, 127, 0, 255, 18, 18, 54, 0, 0, 1, 0, 9, 21, 18, 74, 144, 18, 20, 44, 128, 2, 22, 126, 10, 0, 194, 210, 10, 7, 1, 0, 255, 3, 141, 190, 85, 85, 85, 85, 255, 3, 140, 190, 85, 85, 85, 85, 12, 106, 74, 210, 12, 20, 2, 0, 13, 2, 26, 126, 13, 23, 26, 80, 0, 0, 52, 220, 12, 0, 0, 12, 255, 3, 141, 190, 85, 85, 85, 85, 255, 3, 140, 190, 85, 85, 85, 85, 10, 106, 74, 210, 12, 20, 2, 0, 13, 2, 28, 126, 14, 23, 22, 80, 0, 0, 52, 220, 10, 0, 0, 10, 255, 16, 16, 54, 255, 255, 127, 0, 240, 18, 18, 56, 240, 16, 16, 56, 9, 17, 16, 8, 113, 1, 140, 191, 13, 17, 18, 16, 12, 17, 18, 62, 255, 2, 28, 126, 171, 170, 170, 62, 255, 3, 140, 190, 0, 0, 128, 62, 7, 127, 30, 126, 12, 18, 28, 62, 12, 0, 130, 210, 12, 17, 38, 132, 193, 30, 30, 74, 14, 0, 130, 210, 9, 29, 194, 3, 9, 19, 32, 16, 13, 17, 24, 62, 15, 11, 16, 126, 14, 33, 24, 62, 255, 3, 140, 190, 244, 253, 5, 56, 12, 0, 130, 210, 8, 25, 48, 132, 112, 0, 140, 191, 12, 23, 24, 6, 8, 21, 16, 64, 0, 112, 49, 63, 12, 19, 30, 8, 255, 18, 28, 58, 0, 0, 0, 128, 8, 31, 26, 6, 10, 126, 254, 138, 8, 17, 18, 16, 21, 0, 136, 191, 8, 19, 20, 16, 255, 2, 22, 126, 171, 170, 42, 62, 255, 3, 140, 190, 37, 73, 18, 62, 12, 16, 22, 62, 8, 23, 22, 66, 205, 204, 76, 62, 8, 23, 22, 66, 0, 0, 128, 62, 8, 23, 22, 66, 171, 170, 170, 62, 10, 23, 20, 16, 241, 18, 28, 16, 15, 0, 130, 210, 9, 227, 41, 132, 15, 17, 26, 8, 255, 20, 24, 58, 0, 0, 0, 128, 255, 16, 16, 58, 0, 0, 0, 128, 10, 4, 254, 190, 8, 27, 20, 8, 15, 29, 18, 8, 15, 21, 20, 6, 12, 19, 18, 8, 255, 26, 22, 54, 0, 240, 255, 255, 9, 21, 18, 6, 13, 23, 16, 8, 9, 17, 16, 6, 255, 16, 18, 16, 0, 160, 42, 56, 11, 19, 18, 64, 0, 160, 42, 56, 8, 19, 16, 64, 0, 80, 213, 62, 11, 17, 18, 64, 0, 80, 213, 62, 255, 18, 20, 16, 59, 170, 184, 66, 10, 17, 20, 126, 191, 20, 24, 54, 131, 24, 24, 52, 255, 3, 139, 190, 85, 85, 85, 85, 255, 3, 138, 190, 85, 85, 85, 85, 12, 106, 74, 210, 10, 24, 2, 0, 11, 2, 26, 126, 13, 106, 80, 210, 13, 1, 169, 1, 0, 0, 52, 220, 12, 0, 0, 12, 255, 3, 138, 190, 0, 80, 213, 62, 10, 11, 28, 126, 11, 0, 130, 210, 10, 22, 38, 132, 14, 19, 30, 64, 0, 0, 49, 188, 8, 23, 16, 6, 14, 31, 22, 64, 239, 47, 228, 183, 8, 23, 22, 6, 255, 2, 28, 126, 171, 170, 42, 62, 255, 3, 138, 190, 171, 170, 42, 61, 10, 22, 28, 62, 14, 0, 130, 210, 14, 23, 194, 3, 11, 23, 30, 16, 14, 31, 22, 62, 255, 3, 138, 190, 8, 227, 130, 180, 255, 3, 139, 190, 24, 114, 177, 66, 112, 0, 140, 191, 13, 23, 26, 62, 12, 0, 8, 208, 8, 21, 0, 0, 11, 18, 4, 124, 12, 23, 26, 62, 106, 12, 140, 135, 11, 18, 2, 124, 134, 20, 16, 48, 12, 27, 20, 6, 106, 12, 234, 136, 10, 17, 16, 86, 255, 2, 20, 126, 0, 0, 128, 127, 255, 3, 138, 190, 208, 142, 206, 194, 8, 21, 16, 0, 10, 18, 22, 124, 128, 16, 16, 0, 3, 15, 10, 125, 242, 16, 16, 16, 255, 2, 18, 126, 0, 0, 192, 127, 255, 3, 138, 190, 0, 0, 128, 255, 8, 19, 16, 0, 128, 14, 10, 125, 10, 0, 4, 209, 3, 21, 0, 0, 128, 16, 16, 0, 255, 2, 18, 126, 0, 0, 128, 127, 8, 0, 0, 210, 8, 19, 42, 0, 3, 19, 4, 125, 8, 19, 16, 0, 7, 19, 136, 125, 8, 7, 14, 0, 242, 6, 10, 125, 242, 14, 6, 0, 255, 2, 14, 126, 174, 71, 97, 189, 255, 3, 138, 190, 61, 10, 135, 63, 3, 0, 130, 210, 3, 21, 28, 4, 4, 4, 254, 190, 2, 126, 254, 138, 242, 2, 6, 126, 2, 4, 254, 190, 106, 0, 16, 209, 4, 7, 1, 0, 4, 0, 0, 210, 4, 1, 169, 1, 242, 8, 28, 124, 2, 106, 254, 135, 223, 0, 136, 191, 128, 8, 8, 124, 106, 36, 132, 190, 128, 2, 8, 126, 4, 126, 254, 138, 217, 0, 136, 191, 255, 3, 136, 190, 28, 46, 77, 59, 8, 8, 8, 124, 106, 36, 136, 190, 255, 8, 8, 16, 82, 184, 78, 65, 8, 126, 254, 138, 242, 8, 8, 16, 208, 0, 136, 191, 255, 8, 14, 54, 255, 255, 255, 127, 242, 14, 16, 8, 255, 3, 138, 190, 0, 0, 128, 61, 106, 1, 22, 208, 8, 21, 0, 0, 126, 4, 138, 190, 10, 106, 254, 138, 7, 129, 16, 126, 69, 0, 136, 191, 129, 16, 18, 52, 255, 16, 16, 74, 0, 0, 128, 0, 255, 18, 18, 74, 0, 0, 0, 1, 255, 16, 20, 54, 0, 0, 127, 0, 255, 18, 18, 54, 0, 0, 1, 0, 9, 21, 18, 74, 144, 18, 20, 44, 128, 2, 22, 126, 10, 0, 194, 210, 10, 7, 1, 0, 255, 3, 141, 190, 85, 85, 85, 85, 255, 3, 140, 190, 85, 85, 85, 85, 12, 106, 74, 210, 12, 20, 2, 0, 13, 2, 26, 126, 13, 23, 26, 80, 0, 0, 52, 220, 12, 0, 0, 12, 255, 3, 141, 190, 85, 85, 85, 85, 255, 3, 140, 190, 85, 85, 85, 85, 10, 106, 74, 210, 12, 20, 2, 0, 13, 2, 28, 126, 14, 23, 22, 80, 0, 0, 52, 220, 10, 0, 0, 10, 255, 16, 16, 54, 255, 255, 127, 0, 240, 18, 18, 56, 240, 16, 16, 56, 9, 17, 16, 8, 113, 1, 140, 191, 13, 17, 18, 16, 12, 17, 18, 62, 255, 2, 28, 126, 171, 170, 170, 62, 255, 3, 140, 190, 0, 0, 128, 62, 7, 127, 30, 126, 12, 18, 28, 62, 12, 0, 130, 210, 12, 17, 38, 132, 193, 30, 30, 74, 14, 0, 130, 210, 9, 29, 194, 3, 9, 19, 32, 16, 13, 17, 24, 62, 15, 11, 16, 126, 14, 33, 24, 62, 255, 3, 140, 190, 244, 253, 5, 56, 12, 0, 130, 210, 8, 25, 48, 132, 112, 0, 140, 191, 12, 23, 24, 6, 8, 21, 16, 64, 0, 112, 49, 63, 12, 19, 30, 8, 255, 18, 28, 58, 0, 0, 0, 128, 8, 31, 26, 6, 10, 126, 254, 138, 8, 17, 18, 16, 21, 0, 136, 191, 8, 19, 20, 16, 255, 2, 22, 126, 171, 170, 42, 62, 255, 3, 140, 190, 37, 73, 18, 62, 12, 16, 22, 62, 8, 23, 22, 66, 205, 204, 76, 62, 8, 23, 22, 66, 0, 0, 128, 62, 8, 23, 22, 66, 171, 170, 170, 62, 10, 23, 20, 16, 241, 18, 28, 16, 15, 0, 130, 210, 9, 227, 41, 132, 15, 17, 26, 8, 255, 20, 24, 58, 0, 0, 0, 128, 255, 16, 16, 58, 0, 0, 0, 128, 10, 4, 254, 190, 8, 27, 20, 8, 15, 29, 18, 8, 15, 21, 20, 6, 12, 19, 18, 8, 255, 26, 22, 54, 0, 240, 255, 255, 9, 21, 18, 6, 13, 23, 16, 8, 9, 17, 16, 6, 255, 16, 18, 16, 0, 160, 42, 56, 11, 19, 18, 64, 0, 160, 42, 56, 8, 19, 16, 64, 0, 80, 213, 62, 11, 17, 18, 64, 0, 80, 213, 62, 255, 18, 20, 16, 59, 170, 184, 66, 10, 17, 20, 126, 191, 20, 24, 54, 131, 24, 24, 52, 255, 3, 139, 190, 85, 85, 85, 85, 255, 3, 138, 190, 85, 85, 85, 85, 12, 106, 74, 210, 10, 24, 2, 0, 11, 2, 26, 126, 13, 106, 80, 210, 13, 1, 169, 1, 0, 0, 52, 220, 12, 0, 0, 12, 255, 3, 138, 190, 0, 80, 213, 62, 10, 11, 28, 126, 11, 0, 130, 210, 10, 22, 38, 132, 14, 19, 30, 64, 0, 0, 49, 188, 8, 23, 16, 6, 14, 31, 22, 64, 239, 47, 228, 183, 8, 23, 22, 6, 255, 2, 28, 126, 171, 170, 42, 62, 255, 3, 138, 190, 171, 170, 42, 61, 10, 22, 28, 62, 14, 0, 130, 210, 14, 23, 194, 3, 11, 23, 30, 16, 14, 31, 22, 62, 255, 3, 138, 190, 8, 227, 130, 180, 255, 3, 139, 190, 24, 114, 177, 66, 112, 0, 140, 191, 13, 23, 26, 62, 12, 0, 8, 208, 8, 21, 0, 0, 11, 18, 4, 124, 12, 23, 26, 62, 106, 12, 140, 135, 11, 18, 2, 124, 134, 20, 16, 48, 12, 27, 20, 6, 106, 12, 234, 136, 10, 17, 16, 86, 255, 2, 20, 126, 0, 0, 128, 127, 255, 3, 138, 190, 208, 142, 206, 194, 8, 21, 16, 0, 10, 18, 22, 124, 128, 16, 16, 0, 4, 15, 10, 125, 242, 16, 16, 16, 255, 2, 18, 126, 0, 0, 192, 127, 255, 3, 138, 190, 0, 0, 128, 255, 8, 19, 16, 0, 128, 14, 10, 125, 10, 0, 4, 209, 4, 21, 0, 0, 128, 16, 16, 0, 255, 2, 18, 126, 0, 0, 128, 127, 8, 0, 0, 210, 8, 19, 42, 0, 4, 19, 4, 125, 8, 19, 16, 0, 7, 19, 136, 125, 8, 9, 14, 0, 242, 8, 10, 125, 242, 14, 8, 0, 255, 2, 14, 126, 174, 71, 97, 189, 255, 3, 138, 190, 61, 10, 135, 63, 4, 0, 130, 210, 4, 21, 28, 4, 4, 4, 254, 190, 2, 126, 254, 138, 242, 2, 8, 126, 2, 4, 254, 190, 14, 7, 132, 192, 106, 0, 16, 209, 5, 7, 1, 0, 5, 0, 0, 210, 5, 1, 169, 1, 127, 0, 140, 191, 8, 0, 34, 74, 9, 2, 36, 74, 10, 4, 38, 74, 242, 10, 28, 124, 106, 36, 130, 190, 223, 0, 136, 191, 128, 10, 8, 124, 106, 36, 132, 190, 128, 2, 10, 126, 4, 126, 254, 138, 217, 0, 136, 191, 255, 3, 136, 190, 28, 46, 77, 59, 8, 10, 8, 124, 106, 36, 136, 190, 255, 10, 10, 16, 82, 184, 78, 65, 8, 126, 254, 138, 242, 10, 10, 16, 208, 0, 136, 191, 255, 10, 14, 54, 255, 255, 255, 127, 242, 14, 16, 8, 255, 3, 138, 190, 0, 0, 128, 61, 106, 1, 22, 208, 8, 21, 0, 0, 126, 4, 138, 190, 10, 106, 254, 138, 7, 129, 16, 126, 69, 0, 136, 191, 129, 16, 18, 52, 255, 16, 16, 74, 0, 0, 128, 0, 255, 18, 18, 74, 0, 0, 0, 1, 255, 16, 20, 54, 0, 0, 127, 0, 255, 18, 18, 54, 0, 0, 1, 0, 9, 21, 18, 74, 144, 18, 20, 44, 128, 2, 22, 126, 10, 0, 194, 210, 10, 7, 1, 0, 255, 3, 141, 190, 85, 85, 85, 85, 255, 3, 140, 190, 85, 85, 85, 85, 12, 106, 74, 210, 12, 20, 2, 0, 13, 2, 26, 126, 13, 23, 26, 80, 0, 0, 52, 220, 12, 0, 0, 12, 255, 3, 141, 190, 85, 85, 85, 85, 255, 3, 140, 190, 85, 85, 85, 85, 10, 106, 74, 210, 12, 20, 2, 0, 13, 2, 28, 126, 14, 23, 22, 80, 0, 0, 52, 220, 10, 0, 0, 10, 255, 16, 16, 54, 255, 255, 127, 0, 240, 18, 18, 56, 240, 16, 16, 56, 9, 17, 16, 8, 113, 1, 140, 191, 13, 17, 18, 16, 12, 17, 18, 62, 255, 2, 28, 126, 171, 170, 170, 62, 255, 3, 140, 190, 0, 0, 128, 62, 7, 127, 30, 126, 12, 18, 28, 62, 12, 0, 130, 210, 12, 17, 38, 132, 193, 30, 30, 74, 14, 0, 130, 210, 9, 29, 194, 3, 9, 19, 32, 16, 13, 17, 24, 62, 15, 11, 16, 126, 14, 33, 24, 62, 255, 3, 140, 190, 244, 253, 5, 56, 12, 0, 130, 210, 8, 25, 48, 132, 112, 0, 140, 191, 12, 23, 24, 6, 8, 21, 16, 64, 0, 112, 49, 63, 12, 19, 26, 8, 255, 18, 28, 58, 0, 0, 0, 128, 8, 27, 30, 6, 10, 126, 254, 138, 8, 17, 18, 16, 21, 0, 136, 191, 8, 19, 20, 16, 255, 2, 22, 126, 171, 170, 42, 62, 255, 3, 140, 190, 37, 73, 18, 62, 12, 16, 22, 62, 8, 23, 22, 66, 205, 204, 76, 62, 8, 23, 22, 66, 0, 0, 128, 62, 8, 23, 22, 66, 171, 170, 170, 62, 10, 23, 20, 16, 241, 18, 28, 16, 13, 0, 130, 210, 9, 227, 41, 132, 13, 17, 30, 8, 255, 20, 24, 58, 0, 0, 0, 128, 255, 16, 16, 58, 0, 0, 0, 128, 10, 4, 254, 190, 8, 31, 16, 8, 13, 29, 20, 8, 13, 17, 16, 6, 12, 21, 18, 8, 255, 30, 20, 54, 0, 240, 255, 255, 9, 17, 16, 6, 15, 21, 18, 8, 8, 19, 16, 6, 255, 16, 18, 16, 0, 160, 42, 56, 10, 19, 18, 64, 0, 160, 42, 56, 8, 19, 16, 64, 0, 80, 213, 62, 10, 17, 18, 64, 0, 80, 213, 62, 255, 18, 22, 16, 59, 170, 184, 66, 11, 17, 22, 126, 191, 22, 24, 54, 131, 24, 24, 52, 255, 3, 139, 190, 85, 85, 85, 85, 255, 3, 138, 190, 85, 85, 85, 85, 12, 106, 74, 210, 10, 24, 2, 0, 11, 2, 26, 126, 13, 106, 80, 210, 13, 1, 169, 1, 0, 0, 52, 220, 12, 0, 0, 12, 255, 3, 138, 190, 0, 80, 213, 62, 11, 11, 28, 126, 10, 0, 130, 210, 10, 20, 38, 132, 14, 19, 30, 64, 0, 0, 49, 188, 8, 21, 16, 6, 14, 31, 20, 64, 239, 47, 228, 183, 8, 21, 20, 6, 255, 2, 28, 126, 171, 170, 42, 62, 255, 3, 138, 190, 171, 170, 42, 61, 10, 20, 28, 62, 14, 0, 130, 210, 14, 21, 194, 3, 10, 21, 30, 16, 14, 31, 20, 62, 255, 3, 138, 190, 8, 227, 130, 180, 255, 3, 139, 190, 24, 114, 177, 66, 112, 0, 140, 191, 13, 21, 26, 62, 12, 0, 8, 208, 8, 21, 0, 0, 11, 18, 4, 124, 12, 21, 26, 62, 106, 12, 140, 135, 11, 18, 2, 124, 134, 22, 16, 48, 12, 27, 20, 6, 106, 12, 234, 136, 10, 17, 16, 86, 255, 2, 20, 126, 0, 0, 128, 127, 255, 3, 138, 190, 208, 142, 206, 194, 8, 21, 16, 0, 10, 18, 22, 124, 128, 16, 16, 0, 5, 15, 10, 125, 242, 16, 16, 16, 255, 2, 18, 126, 0, 0, 192, 127, 255, 3, 138, 190, 0, 0, 128, 255, 8, 19, 16, 0, 128, 14, 10, 125, 10, 0, 4, 209, 5, 21, 0, 0, 128, 16, 16, 0, 255, 2, 18, 126, 0, 0, 128, 127, 8, 0, 0, 210, 8, 19, 42, 0, 5, 19, 4, 125, 8, 19, 16, 0, 7, 19, 136, 125, 8, 11, 14, 0, 242, 10, 10, 125, 242, 14, 10, 0, 255, 2, 14, 126, 174, 71, 97, 189, 255, 3, 138, 190, 61, 10, 135, 63, 5, 0, 130, 210, 5, 21, 28, 4, 4, 4, 254, 190, 2, 126, 254, 138, 242, 2, 10, 126, 2, 4, 254, 190, 8, 7, 65, 192, 127, 0, 140, 191, 0, 3, 194, 192, 128, 2, 40, 126, 127, 0, 140, 191, 0, 95, 32, 240, 17, 3, 1, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 11, 0, 11, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 64, 192, 127, 0, 140, 191, 0, 255, 2, 135, 255, 255, 0, 0, 0, 255, 128, 147, 16, 0, 16, 0, 1, 255, 1, 135, 255, 255, 0, 0, 2, 8, 2, 147, 0, 9, 0, 147, 1, 10, 1, 147, 0, 7, 132, 192, 4, 7, 66, 192, 18, 7, 70, 192, 20, 135, 1, 192, 127, 0, 140, 191, 2, 8, 2, 128, 0, 10, 0, 128, 2, 0, 0, 74, 0, 2, 2, 74, 1, 4, 0, 128, 4, 0, 12, 209, 1, 27, 0, 0, 8, 0, 12, 209, 0, 25, 0, 0, 0, 4, 4, 74, 8, 4, 128, 136, 3, 4, 6, 125, 0, 106, 234, 136, 126, 4, 128, 190, 0, 106, 254, 138, 22, 0, 136, 191, 6, 7, 132, 192, 10, 7, 65, 192, 12, 7, 2, 192, 127, 0, 140, 191, 0, 9, 198, 192, 2, 0, 6, 74, 3, 2, 8, 74, 4, 4, 10, 74, 128, 2, 12, 126, 127, 0, 140, 191, 0, 95, 0, 240, 3, 3, 3, 0, 14, 7, 130, 192, 0, 11, 196, 192, 127, 0, 140, 191, 4, 0, 14, 74, 5, 2, 16, 74, 6, 4, 18, 74, 128, 2, 20, 126, 112, 15, 140, 191, 0, 95, 32, 240, 7, 3, 2, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 172, 0, 144, 0, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 5, 0, 5, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 192, 127, 0, 140, 191, 0, 255, 0, 135, 255, 255, 0, 0, 0, 8, 0, 147, 0, 7, 65, 192, 18, 135, 0, 192, 127, 0, 140, 191, 0, 2, 0, 128, 0, 0, 0, 74, 1, 0, 8, 125, 106, 36, 128, 190, 15, 0, 136, 191, 6, 7, 132, 192, 10, 7, 1, 192, 127, 0, 140, 191, 0, 9, 134, 192, 2, 0, 2, 74, 127, 0, 140, 191, 0, 32, 12, 224, 1, 1, 3, 128, 14, 7, 1, 192, 0, 11, 130, 192, 127, 0, 140, 191, 2, 0, 0, 74, 112, 15, 140, 191, 0, 32, 28, 224, 0, 1, 1, 128, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 11, 0, 11, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 64, 192, 127, 0, 140, 191, 0, 255, 2, 135, 255, 255, 0, 0, 0, 255, 128, 147, 16, 0, 16, 0, 1, 255, 1, 135, 255, 255, 0, 0, 2, 8, 2, 147, 0, 9, 0, 147, 1, 10, 1, 147, 0, 7, 66, 192, 18, 135, 1, 192, 127, 0, 140, 191, 2, 4, 2, 128, 2, 0, 0, 74, 3, 0, 8, 125, 106, 36, 130, 190, 22, 0, 136, 191, 2, 7, 196, 192, 10, 7, 2, 192, 127, 0, 140, 191, 0, 13, 136, 192, 4, 0, 6, 74, 127, 0, 140, 191, 0, 32, 12, 224, 3, 3, 4, 128, 14, 7, 130, 192, 0, 15, 198, 192, 1, 10, 1, 128, 0, 8, 0, 128, 127, 0, 140, 191, 1, 6, 1, 128, 0, 5, 0, 128, 4, 0, 14, 74, 1, 4, 18, 74, 0, 2, 16, 74, 128, 2, 20, 126, 112, 15, 140, 191, 0, 95, 32, 240, 7, 3, 3, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 0, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 7, 0, 7, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 64, 192, 127, 0, 140, 191, 0, 255, 2, 135, 255, 255, 0, 0, 0, 255, 128, 147, 16, 0, 16, 0, 1, 255, 1, 135, 255, 255, 0, 0, 2, 8, 2, 147, 0, 9, 0, 147, 1, 10, 1, 147, 0, 7, 66, 192, 18, 135, 1, 192, 127, 0, 140, 191, 2, 4, 2, 128, 2, 0, 0, 74, 3, 0, 8, 125, 106, 36, 130, 190, 23, 0, 136, 191, 2, 7, 196, 192, 10, 7, 66, 192, 127, 0, 140, 191, 12, 135, 4, 192, 0, 13, 200, 192, 1, 10, 1, 128, 0, 8, 0, 128, 127, 0, 140, 191, 1, 9, 1, 128, 0, 5, 0, 128, 4, 0, 6, 74, 1, 4, 10, 74, 0, 2, 8, 74, 128, 2, 12, 126, 0, 95, 0, 240, 3, 1, 4, 0, 14, 7, 0, 192, 0, 15, 130, 192, 127, 0, 140, 191, 0, 0, 0, 74, 112, 15, 140, 191, 0, 32, 28, 224, 0, 1, 1, 128, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 11, 0, 11, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 64, 192, 127, 0, 140, 191, 0, 255, 2, 135, 255, 255, 0, 0, 0, 255, 128, 147, 16, 0, 16, 0, 1, 255, 1, 135, 255, 255, 0, 0, 2, 8, 2, 147, 0, 9, 0, 147, 1, 10, 1, 147, 0, 7, 132, 192, 4, 7, 66, 192, 24, 7, 70, 192, 26, 135, 1, 192, 127, 0, 140, 191, 2, 8, 2, 128, 0, 10, 0, 128, 2, 0, 0, 74, 0, 2, 2, 74, 1, 4, 0, 128, 4, 0, 2, 209, 1, 27, 0, 0, 8, 0, 2, 209, 0, 25, 0, 0, 0, 4, 4, 74, 8, 4, 128, 135, 3, 4, 8, 125, 0, 106, 128, 135, 0, 36, 128, 190, 46, 0, 136, 191, 20, 7, 132, 192, 127, 0, 140, 191, 8, 0, 14, 74, 9, 2, 16, 74, 10, 4, 18, 74, 28, 7, 1, 192, 6, 7, 66, 192, 127, 0, 140, 191, 2, 130, 0, 191, 26, 0, 133, 191, 2, 129, 0, 191, 11, 0, 132, 191, 12, 7, 132, 192, 0, 5, 198, 192, 127, 0, 140, 191, 8, 2, 0, 126, 9, 2, 2, 126, 10, 2, 4, 126, 11, 2, 6, 126, 128, 2, 20, 126, 0, 95, 32, 240, 7, 0, 3, 0, 23, 0, 130, 191, 2, 128, 0, 191, 21, 0, 132, 191, 8, 7, 132, 192, 0, 5, 198, 192, 127, 0, 140, 191, 8, 2, 0, 126, 9, 2, 2, 126, 10, 2, 4, 126, 11, 2, 6, 126, 128, 2, 20, 126, 0, 95, 32, 240, 7, 0, 3, 0, 10, 0, 130, 191, 16, 7, 132, 192, 0, 5, 198, 192, 127, 0, 140, 191, 8, 2, 0, 126, 9, 2, 2, 126, 10, 2, 4, 126, 11, 2, 6, 126, 128, 2, 20, 126, 0, 95, 32, 240, 7, 0, 3, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 172, 0, 144, 0, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 5, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 192, 127, 0, 140, 191, 0, 255, 0, 135, 255, 255, 0, 0, 0, 8, 0, 147, 0, 7, 65, 192, 24, 135, 0, 192, 127, 0, 140, 191, 0, 2, 0, 128, 0, 0, 0, 74, 1, 0, 8, 125, 106, 36, 128, 190, 41, 0, 136, 191, 20, 7, 1, 192, 127, 0, 140, 191, 2, 0, 0, 74, 28, 7, 1, 192, 6, 7, 66, 192, 127, 0, 140, 191, 2, 130, 0, 191, 24, 0, 133, 191, 2, 129, 0, 191, 10, 0, 132, 191, 12, 7, 132, 192, 0, 5, 130, 192, 127, 0, 140, 191, 8, 2, 2, 126, 9, 2, 4, 126, 10, 2, 6, 126, 11, 2, 8, 126, 0, 32, 28, 224, 0, 1, 1, 128, 21, 0, 130, 191, 2, 128, 0, 191, 19, 0, 132, 191, 8, 7, 132, 192, 0, 5, 130, 192, 127, 0, 140, 191, 8, 2, 2, 126, 9, 2, 4, 126, 10, 2, 6, 126, 11, 2, 8, 126, 0, 32, 28, 224, 0, 1, 1, 128, 9, 0, 130, 191, 16, 7, 132, 192, 0, 5, 130, 192, 127, 0, 140, 191, 8, 2, 2, 126, 9, 2, 4, 126, 10, 2, 6, 126, 11, 2, 8, 126, 0, 32, 28, 224, 0, 1, 1, 128, 0, 0, 129, 191, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 1, 0, 4, 0, 8, 2, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 1, 0, 4, 0, 16, 6, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 26, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 4, 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 26, 0, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 132, 4, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 26, 0, 5, 0, 0, 10, 0, 0, 0, 0, 0, 0, 220, 1, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 26, 0, 5, 0, 0, 12, 0, 0, 0, 0, 0, 0, 212, 12, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 26, 0, 5, 0, 0, 25, 0, 0, 0, 0, 0, 0, 220, 1, 0, 0, 0, 0, 0, 0, 33, 1, 0, 0, 26, 0, 5, 0, 0, 27, 0, 0, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 0, 0, 58, 1, 0, 0, 26, 0, 5, 0, 0, 29, 0, 0, 0, 0, 0, 0, 168, 1, 0, 0, 0, 0, 0, 0, 90, 1, 0, 0, 26, 0, 5, 0, 0, 31, 0, 0, 0, 0, 0, 0, 172, 1, 0, 0, 0, 0, 0, 0, 122, 1, 0, 0, 26, 0, 5, 0, 0, 33, 0, 0, 0, 0, 0, 0, 56, 2, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 26, 0, 5, 0, 0, 36, 0, 0, 0, 0, 0, 0, 220, 1, 0, 0, 0, 0, 0, 0, 170, 1, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 1, 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 14, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 14, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 14, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 16, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 18, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 18, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 18, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 18, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 19, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 19, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 21, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 21, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 23, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 23, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 3, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 2, 0, 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 3, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 3, 0, 0, 0, 0, 0, 0, 24, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 1, 0, 0, 0, 7, 0, 192, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 220, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 51, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 53, 0, 0, 0, 0, 0, 0, 176, 1, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0}; +} +} diff --git a/runtime/hsa-runtime/image/blit_object_gfx8xx.cpp b/runtime/hsa-runtime/image/blit_object_gfx8xx.cpp index f1b232b0e4..fec8761e23 100644 --- a/runtime/hsa-runtime/image/blit_object_gfx8xx.cpp +++ b/runtime/hsa-runtime/image/blit_object_gfx8xx.cpp @@ -1,2 +1,6 @@ #include +namespace rocr { +namespace image { uint8_t blit_object_gfx8xx[] = {127, 69, 76, 70, 2, 1, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 224, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 56, 0, 2, 0, 64, 0, 8, 0, 1, 0, 2, 0, 0, 96, 6, 0, 0, 0, 184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 10, 0, 0, 0, 0, 0, 0, 24, 10, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 96, 5, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 41, 0, 0, 0, 0, 0, 0, 12, 41, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 46, 115, 104, 115, 116, 114, 116, 97, 98, 0, 46, 115, 116, 114, 116, 97, 98, 0, 46, 110, 111, 116, 101, 0, 46, 104, 115, 97, 100, 97, 116, 97, 95, 114, 101, 97, 100, 111, 110, 108, 121, 95, 97, 103, 101, 110, 116, 0, 46, 104, 115, 97, 116, 101, 120, 116, 0, 46, 115, 121, 109, 116, 97, 98, 0, 46, 115, 121, 109, 116, 97, 98, 0, 46, 114, 101, 108, 97, 46, 104, 115, 97, 116, 101, 120, 116, 0, 0, 0, 38, 104, 115, 97, 95, 101, 120, 116, 95, 105, 109, 97, 103, 101, 58, 58, 38, 95, 95, 111, 99, 109, 108, 116, 98, 108, 95, 77, 51, 50, 95, 69, 88, 80, 95, 69, 80, 0, 38, 104, 115, 97, 95, 101, 120, 116, 95, 105, 109, 97, 103, 101, 58, 58, 38, 95, 95, 111, 99, 109, 108, 116, 98, 108, 95, 77, 51, 50, 95, 76, 79, 71, 69, 0, 38, 104, 115, 97, 95, 101, 120, 116, 95, 105, 109, 97, 103, 101, 58, 58, 38, 95, 95, 111, 99, 109, 108, 116, 98, 108, 95, 77, 51, 50, 95, 76, 79, 71, 95, 73, 78, 86, 95, 69, 80, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 116, 111, 95, 98, 117, 102, 102, 101, 114, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 98, 117, 102, 102, 101, 114, 95, 116, 111, 95, 105, 109, 97, 103, 101, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 100, 101, 102, 97, 117, 108, 116, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 108, 105, 110, 101, 97, 114, 95, 116, 111, 95, 115, 116, 97, 110, 100, 97, 114, 100, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 115, 116, 97, 110, 100, 97, 114, 100, 95, 116, 111, 95, 108, 105, 110, 101, 97, 114, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 49, 100, 98, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 49, 100, 98, 95, 116, 111, 95, 114, 101, 103, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 114, 101, 103, 95, 116, 111, 95, 49, 100, 98, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 108, 101, 97, 114, 95, 105, 109, 97, 103, 101, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 108, 101, 97, 114, 95, 105, 109, 97, 103, 101, 95, 49, 100, 98, 95, 107, 101, 114, 110, 101, 108, 0, 95, 95, 104, 115, 97, 95, 115, 101, 99, 116, 105, 111, 110, 46, 104, 115, 97, 100, 97, 116, 97, 95, 114, 101, 97, 100, 111, 110, 108, 121, 95, 97, 103, 101, 110, 116, 0, 95, 95, 104, 115, 97, 95, 115, 101, 99, 116, 105, 111, 110, 46, 104, 115, 97, 116, 101, 120, 116, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 65, 77, 68, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 65, 77, 68, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 0, 4, 0, 0, 0, 26, 0, 0, 0, 3, 0, 0, 0, 65, 77, 68, 0, 4, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 77, 68, 0, 65, 77, 68, 71, 80, 85, 0, 0, 4, 0, 0, 0, 41, 0, 0, 0, 4, 0, 0, 0, 65, 77, 68, 0, 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 65, 77, 68, 32, 72, 83, 65, 32, 82, 117, 110, 116, 105, 109, 101, 32, 70, 105, 110, 97, 108, 105, 122, 101, 114, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 26, 0, 0, 0, 5, 0, 0, 0, 65, 77, 68, 0, 22, 0, 45, 104, 115, 97, 95, 99, 97, 108, 108, 95, 99, 111, 110, 118, 101, 110, 116, 105, 111, 110, 61, 48, 0, 197, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 96, 129, 63, 119, 62, 26, 57, 0, 192, 130, 63, 138, 105, 216, 57, 0, 32, 132, 63, 29, 70, 81, 58, 0, 160, 133, 63, 124, 54, 172, 57, 0, 0, 135, 63, 180, 12, 123, 58, 0, 128, 136, 63, 4, 116, 64, 58, 0, 0, 138, 63, 170, 171, 38, 58, 0, 128, 139, 63, 31, 15, 46, 58, 0, 0, 141, 63, 219, 250, 86, 58, 0, 160, 142, 63, 104, 49, 7, 57, 0, 32, 144, 63, 24, 226, 14, 58, 0, 192, 145, 63, 234, 220, 244, 56, 0, 64, 147, 63, 120, 89, 81, 58, 0, 224, 148, 63, 71, 125, 39, 58, 0, 128, 150, 63, 185, 105, 33, 58, 0, 32, 152, 63, 140, 130, 63, 58, 0, 224, 153, 63, 65, 38, 11, 55, 0, 128, 155, 63, 157, 155, 211, 57, 0, 32, 157, 63, 57, 205, 118, 58, 0, 224, 158, 63, 4, 147, 41, 58, 0, 160, 160, 63, 125, 136, 2, 58, 0, 96, 162, 63, 24, 24, 2, 58, 0, 32, 164, 63, 112, 173, 40, 58, 0, 224, 165, 63, 77, 181, 118, 58, 0, 192, 167, 63, 78, 59, 217, 57, 0, 160, 169, 63, 117, 90, 45, 56, 0, 96, 171, 63, 173, 205, 81, 58, 0, 64, 173, 63, 82, 247, 65, 58, 0, 32, 175, 63, 107, 197, 91, 58, 0, 32, 177, 63, 116, 96, 253, 56, 0, 0, 179, 63, 149, 32, 14, 58, 0, 0, 181, 63, 127, 102, 30, 57, 0, 224, 182, 63, 25, 143, 108, 58, 0, 224, 184, 63, 59, 122, 93, 58, 0, 224, 186, 63, 144, 213, 122, 58, 0, 0, 189, 63, 245, 57, 138, 57, 0, 0, 191, 63, 179, 205, 60, 58, 0, 32, 193, 63, 166, 204, 196, 57, 0, 64, 195, 63, 68, 155, 89, 57, 0, 96, 197, 63, 42, 66, 101, 57, 0, 128, 199, 63, 138, 76, 215, 57, 0, 160, 201, 63, 51, 236, 77, 58, 0, 224, 203, 63, 239, 79, 193, 57, 0, 32, 206, 63, 163, 130, 17, 57, 0, 96, 208, 63, 187, 246, 204, 56, 0, 160, 210, 63, 31, 217, 129, 57, 0, 224, 212, 63, 94, 213, 26, 58, 0, 64, 215, 63, 90, 153, 31, 57, 0, 128, 217, 63, 19, 174, 104, 58, 0, 224, 219, 63, 190, 188, 93, 58, 0, 96, 222, 63, 94, 130, 244, 55, 0, 192, 224, 63, 194, 238, 205, 57, 0, 32, 227, 63, 149, 75, 124, 58, 0, 160, 229, 63, 59, 55, 72, 58, 0, 32, 232, 63, 129, 82, 75, 58, 0, 192, 234, 63, 221, 231, 198, 55, 0, 64, 237, 63, 237, 1, 243, 57, 0, 224, 239, 63, 123, 51, 23, 57, 0, 128, 242, 63, 44, 158, 59, 56, 0, 32, 245, 63, 164, 162, 47, 57, 0, 192, 247, 63, 152, 251, 6, 58, 0, 128, 250, 63, 220, 182, 236, 56, 0, 32, 253, 63, 103, 96, 112, 58, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 59, 65, 172, 41, 52, 0, 0, 126, 60, 252, 176, 168, 53, 0, 192, 189, 60, 234, 131, 141, 54, 0, 16, 252, 60, 120, 14, 27, 54, 0, 240, 28, 61, 254, 185, 135, 54, 0, 160, 59, 61, 101, 236, 49, 54, 0, 16, 90, 61, 25, 113, 221, 54, 0, 80, 120, 61, 69, 0, 195, 53, 0, 32, 139, 61, 81, 119, 155, 55, 0, 0, 154, 61, 13, 203, 235, 55, 0, 208, 168, 61, 131, 159, 131, 55, 0, 128, 183, 61, 229, 138, 82, 55, 0, 16, 198, 61, 24, 235, 162, 55, 0, 144, 212, 61, 149, 116, 218, 54, 0, 240, 226, 61, 183, 30, 169, 54, 0, 48, 241, 61, 21, 183, 131, 55, 0, 96, 255, 61, 219, 49, 17, 55, 0, 176, 6, 62, 104, 62, 63, 56, 0, 176, 13, 62, 151, 106, 21, 56, 0, 160, 20, 62, 15, 124, 41, 56, 0, 128, 27, 62, 15, 16, 126, 56, 0, 96, 34, 62, 101, 182, 21, 56, 0, 48, 41, 62, 161, 227, 229, 55, 0, 240, 47, 62, 83, 56, 24, 56, 0, 176, 54, 62, 157, 113, 254, 53, 0, 80, 61, 62, 8, 129, 68, 56, 0, 240, 67, 62, 144, 50, 80, 56, 0, 144, 74, 62, 232, 57, 53, 55, 0, 16, 81, 62, 241, 15, 94, 56, 0, 144, 87, 62, 64, 167, 100, 56, 0, 16, 94, 62, 45, 116, 134, 55, 0, 112, 100, 62, 205, 227, 123, 56, 0, 224, 106, 62, 62, 173, 133, 54, 0, 48, 113, 62, 21, 183, 3, 56, 0, 128, 119, 62, 220, 203, 173, 55, 0, 192, 125, 62, 175, 54, 12, 56, 0, 0, 130, 62, 211, 82, 22, 55, 0, 16, 133, 62, 57, 113, 146, 56, 0, 32, 136, 62, 215, 252, 197, 56, 0, 48, 139, 62, 213, 85, 174, 56, 0, 64, 142, 62, 105, 193, 24, 56, 0, 64, 145, 62, 231, 253, 160, 56, 0, 64, 148, 62, 239, 9, 173, 56, 0, 64, 151, 62, 225, 186, 98, 56, 0, 48, 154, 62, 76, 205, 238, 56, 0, 48, 157, 62, 210, 170, 152, 55, 0, 32, 160, 62, 26, 26, 66, 55, 0, 0, 163, 62, 14, 225, 197, 56, 0, 240, 165, 62, 238, 42, 191, 55, 0, 208, 168, 62, 45, 135, 45, 56, 0, 176, 171, 62, 138, 46, 238, 55, 0, 128, 174, 62, 172, 223, 222, 56, 0, 96, 177, 62, 185, 242, 2, 56, 0, 48, 180, 62, 155, 30, 72, 56, 0, 0, 183, 62, 43, 170, 14, 56, 0, 192, 185, 62, 93, 251, 235, 56, 0, 144, 188, 62, 221, 95, 37, 56, 0, 80, 191, 62, 130, 59, 120, 56, 0, 16, 194, 62, 30, 218, 81, 56, 0, 208, 196, 62, 5, 27, 78, 55, 0, 128, 199, 62, 155, 67, 143, 56, 0, 48, 202, 62, 16, 14, 202, 56, 0, 224, 204, 62, 139, 192, 202, 56, 0, 144, 207, 62, 95, 246, 145, 56, 0, 64, 210, 62, 203, 33, 129, 55, 0, 224, 212, 62, 154, 154, 108, 56, 0, 128, 215, 62, 35, 153, 148, 56, 0, 32, 218, 62, 204, 123, 119, 56, 0, 192, 220, 62, 38, 45, 177, 55, 0, 80, 223, 62, 211, 206, 166, 56, 0, 224, 225, 62, 230, 211, 235, 56, 0, 112, 228, 62, 205, 227, 251, 56, 0, 0, 231, 62, 194, 133, 215, 56, 0, 144, 233, 62, 0, 126, 126, 56, 0, 16, 236, 62, 197, 146, 243, 56, 0, 160, 238, 62, 131, 9, 212, 55, 0, 32, 241, 62, 124, 26, 8, 56, 0, 160, 243, 62, 173, 195, 132, 55, 0, 16, 246, 62, 35, 233, 204, 56, 0, 144, 248, 62, 175, 95, 15, 56, 0, 0, 251, 62, 56, 253, 145, 56, 0, 112, 253, 62, 188, 71, 172, 56, 0, 224, 255, 62, 43, 4, 151, 56, 0, 32, 1, 63, 210, 82, 41, 57, 0, 80, 2, 63, 212, 206, 111, 57, 0, 144, 3, 63, 115, 112, 249, 55, 0, 192, 4, 63, 174, 158, 94, 56, 0, 240, 5, 63, 74, 200, 101, 56, 0, 32, 7, 63, 163, 11, 19, 56, 0, 64, 8, 63, 22, 207, 121, 57, 0, 112, 9, 63, 201, 202, 56, 57, 0, 160, 10, 63, 244, 210, 195, 56, 0, 192, 11, 63, 236, 93, 117, 57, 0, 240, 12, 63, 103, 180, 230, 56, 0, 16, 14, 63, 184, 15, 92, 57, 0, 64, 15, 63, 224, 188, 62, 56, 0, 96, 16, 63, 146, 209, 220, 56, 0, 128, 17, 63, 223, 107, 24, 57, 0, 160, 18, 63, 76, 231, 45, 57, 0, 192, 19, 63, 68, 9, 47, 57, 0, 224, 20, 63, 97, 255, 27, 57, 0, 0, 22, 63, 68, 237, 233, 56, 0, 32, 23, 63, 200, 109, 104, 56, 0, 48, 24, 63, 167, 153, 107, 57, 0, 80, 25, 63, 137, 156, 9, 57, 0, 112, 26, 63, 115, 118, 162, 55, 0, 128, 27, 63, 163, 218, 11, 57, 0, 144, 28, 63, 171, 105, 112, 57, 0, 176, 29, 63, 255, 73, 132, 56, 0, 192, 30, 63, 56, 53, 1, 57, 0, 208, 31, 63, 104, 194, 45, 57, 0, 224, 32, 63, 35, 244, 71, 57, 0, 240, 33, 63, 124, 241, 79, 57, 0, 0, 35, 63, 14, 225, 69, 57, 0, 16, 36, 63, 245, 232, 41, 57, 0, 32, 37, 63, 176, 93, 248, 56, 0, 48, 38, 63, 153, 95, 115, 56, 0, 48, 39, 63, 219, 8, 108, 57, 0, 64, 40, 63, 0, 230, 9, 57, 0, 80, 41, 63, 111, 153, 180, 55, 0, 80, 42, 63, 204, 51, 18, 57, 0, 80, 43, 63, 217, 234, 124, 57, 0, 96, 44, 63, 205, 181, 173, 56, 0, 96, 45, 63, 26, 38, 32, 57, 0, 96, 46, 63, 54, 238, 88, 57, 0, 112, 47, 63, 5, 73, 170, 53, 0, 112, 48, 63, 30, 209, 203, 55, 0, 112, 49, 63, 244, 253, 5, 56, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 254, 63, 248, 3, 254, 56, 0, 0, 252, 63, 193, 15, 252, 57, 0, 0, 250, 63, 201, 179, 140, 58, 0, 0, 248, 63, 16, 62, 248, 58, 0, 0, 246, 63, 48, 123, 64, 59, 0, 0, 244, 63, 96, 141, 137, 59, 0, 0, 242, 63, 72, 214, 185, 59, 0, 0, 240, 63, 241, 240, 240, 59, 0, 0, 239, 63, 127, 220, 186, 58, 0, 0, 237, 63, 108, 7, 102, 59, 0, 0, 235, 63, 166, 178, 189, 59, 0, 0, 234, 63, 161, 14, 234, 57, 0, 0, 232, 63, 247, 88, 75, 59, 0, 0, 230, 63, 72, 180, 194, 59, 0, 0, 229, 63, 172, 96, 150, 58, 0, 0, 227, 63, 228, 56, 142, 59, 0, 0, 225, 63, 14, 120, 252, 59, 0, 0, 224, 63, 56, 112, 96, 59, 0, 0, 222, 63, 77, 92, 233, 59, 0, 0, 221, 63, 76, 145, 79, 59, 0, 0, 219, 63, 239, 97, 235, 59, 0, 0, 218, 63, 79, 27, 104, 59, 0, 0, 217, 63, 178, 1, 89, 56, 0, 0, 215, 63, 229, 53, 148, 59, 0, 0, 214, 63, 89, 3, 174, 58, 0, 0, 212, 63, 3, 123, 199, 59, 0, 0, 211, 63, 109, 26, 80, 59, 0, 0, 210, 63, 33, 13, 210, 57, 0, 0, 208, 63, 204, 159, 182, 59, 0, 0, 207, 63, 81, 233, 72, 59, 0, 0, 206, 63, 185, 83, 52, 58, 0, 0, 204, 63, 205, 204, 204, 59, 0, 0, 203, 63, 192, 39, 135, 59, 0, 0, 202, 63, 205, 15, 11, 59, 0, 0, 201, 63, 209, 73, 123, 57, 0, 0, 199, 63, 125, 12, 206, 59, 0, 0, 198, 63, 106, 12, 152, 59, 0, 0, 197, 63, 247, 144, 75, 59, 0, 0, 196, 63, 21, 190, 220, 58, 0, 0, 195, 63, 49, 12, 195, 57, 0, 0, 193, 63, 214, 187, 228, 59, 0, 0, 192, 63, 193, 192, 192, 59, 0, 0, 191, 63, 232, 47, 160, 59, 0, 0, 190, 63, 12, 250, 130, 59, 0, 0, 189, 63, 142, 32, 82, 59, 0, 0, 188, 63, 24, 200, 36, 59, 0, 0, 187, 63, 135, 156, 251, 58, 0, 0, 186, 63, 140, 46, 186, 58, 0, 0, 185, 63, 233, 15, 133, 58, 0, 0, 184, 63, 3, 23, 56, 58, 0, 0, 183, 63, 162, 181, 251, 57, 0, 0, 182, 63, 97, 11, 182, 57, 0, 0, 181, 63, 170, 104, 158, 57, 0, 0, 180, 63, 65, 11, 180, 57, 0, 0, 179, 63, 41, 53, 246, 57, 0, 0, 178, 63, 67, 22, 50, 58, 0, 0, 177, 63, 192, 157, 126, 58, 0, 0, 176, 63, 11, 44, 176, 58, 0, 0, 175, 63, 26, 119, 235, 58, 0, 0, 174, 63, 185, 130, 24, 59, 0, 0, 173, 63, 176, 86, 64, 59, 0, 0, 172, 63, 8, 35, 109, 59, 0, 0, 171, 63, 227, 105, 143, 59, 0, 0, 170, 63, 171, 170, 170, 59, 0, 0, 169, 63, 72, 74, 200, 59, 0, 0, 168, 63, 87, 63, 232, 59, 0, 0, 168, 63, 129, 10, 168, 57, 0, 0, 167, 63, 230, 20, 188, 58, 0, 0, 166, 63, 114, 136, 43, 59, 0, 0, 165, 63, 5, 106, 125, 59, 0, 0, 164, 63, 30, 207, 169, 59, 0, 0, 163, 63, 61, 10, 215, 59, 0, 0, 163, 63, 246, 199, 75, 57, 0, 0, 162, 63, 172, 12, 223, 58, 0, 0, 161, 63, 93, 98, 86, 59, 0, 0, 160, 63, 161, 160, 160, 59, 0, 0, 159, 63, 254, 9, 216, 59, 0, 0, 159, 63, 57, 47, 11, 58, 0, 0, 158, 63, 72, 90, 25, 59, 0, 0, 157, 63, 158, 216, 137, 59, 0, 0, 156, 63, 97, 225, 200, 59, 0, 0, 156, 63, 193, 9, 156, 57, 0, 0, 155, 63, 62, 223, 24, 59, 0, 0, 154, 63, 217, 231, 144, 59, 0, 0, 153, 63, 219, 34, 215, 59, 0, 0, 153, 63, 139, 210, 120, 58, 0, 0, 152, 63, 19, 144, 81, 59, 0, 0, 151, 63, 237, 37, 180, 59, 0, 0, 151, 63, 46, 1, 23, 56, 0, 0, 150, 63, 216, 180, 31, 59, 0, 0, 149, 63, 104, 37, 160, 59, 0, 0, 148, 63, 79, 9, 242, 59, 0, 0, 148, 63, 41, 1, 11, 59, 0, 0, 147, 63, 196, 133, 154, 59, 0, 0, 146, 63, 132, 19, 241, 59, 0, 0, 146, 63, 37, 73, 18, 59, 0, 0, 145, 63, 197, 179, 162, 59, 0, 0, 144, 63, 9, 188, 253, 59, 0, 0, 144, 63, 198, 112, 52, 59, 0, 0, 143, 63, 238, 35, 184, 59, 0, 0, 143, 63, 208, 206, 59, 58, 0, 0, 142, 63, 218, 106, 112, 59, 0, 0, 141, 63, 2, 82, 218, 59, 0, 0, 141, 63, 35, 44, 247, 58, 0, 0, 140, 63, 4, 156, 162, 59, 0, 0, 140, 63, 193, 8, 140, 57, 0, 0, 139, 63, 148, 104, 96, 59, 0, 0, 138, 63, 252, 242, 216, 59, 0, 0, 138, 63, 225, 240, 5, 59, 0, 0, 137, 63, 138, 64, 174, 59, 0, 0, 137, 63, 215, 57, 86, 58, 0, 0, 136, 63, 137, 136, 136, 59, 0, 0, 135, 63, 136, 128, 247, 59, 0, 0, 135, 63, 190, 86, 79, 59, 0, 0, 134, 63, 68, 5, 217, 59, 0, 0, 134, 63, 252, 20, 23, 59, 0, 0, 133, 63, 97, 55, 191, 59, 0, 0, 133, 63, 77, 33, 208, 58, 0, 0, 132, 63, 200, 249, 169, 59, 0, 0, 132, 63, 8, 33, 132, 58, 0, 0, 131, 63, 82, 48, 153, 59, 0, 0, 131, 63, 188, 116, 19, 58, 0, 0, 130, 63, 191, 191, 140, 59, 0, 0, 130, 63, 33, 8, 130, 57, 0, 0, 129, 63, 169, 141, 132, 59, 0, 0, 129, 63, 4, 2, 129, 56, 0, 0, 128, 63, 129, 128, 128, 59, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 2, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 11, 0, 11, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 6, 192, 4, 0, 0, 0, 127, 0, 140, 191, 0, 255, 2, 134, 255, 255, 0, 0, 0, 255, 128, 146, 16, 0, 16, 0, 1, 255, 1, 134, 255, 255, 0, 0, 2, 8, 2, 146, 0, 9, 0, 146, 1, 10, 1, 146, 3, 2, 10, 192, 0, 0, 0, 0, 3, 1, 6, 192, 16, 0, 0, 0, 3, 3, 6, 192, 104, 0, 0, 0, 195, 0, 2, 192, 112, 0, 0, 0, 127, 0, 140, 191, 2, 8, 2, 128, 0, 10, 0, 128, 2, 0, 0, 50, 0, 2, 2, 50, 1, 4, 0, 128, 4, 0, 193, 208, 1, 27, 0, 0, 8, 0, 193, 208, 0, 25, 0, 0, 0, 4, 4, 50, 8, 4, 128, 134, 3, 4, 136, 125, 0, 106, 128, 134, 0, 32, 128, 190, 199, 0, 136, 191, 131, 0, 6, 192, 24, 0, 0, 0, 3, 1, 6, 192, 56, 0, 0, 0, 3, 2, 2, 192, 64, 0, 0, 0, 131, 2, 6, 192, 72, 0, 0, 0, 67, 2, 2, 192, 128, 0, 0, 0, 3, 3, 10, 192, 136, 0, 0, 0, 159, 0, 6, 34, 159, 2, 8, 34, 127, 0, 140, 191, 5, 0, 134, 210, 1, 25, 0, 0, 4, 0, 133, 210, 4, 25, 0, 0, 4, 11, 8, 50, 5, 0, 133, 210, 1, 27, 0, 0, 5, 9, 8, 50, 5, 0, 133, 210, 1, 25, 0, 0, 5, 106, 25, 209, 5, 1, 2, 0, 4, 7, 6, 56, 4, 0, 14, 50, 5, 2, 16, 50, 8, 4, 18, 50, 159, 4, 12, 34, 1, 4, 14, 192, 0, 0, 0, 0, 128, 2, 20, 126, 127, 0, 140, 191, 0, 95, 0, 240, 7, 7, 4, 0, 0, 0, 134, 210, 2, 29, 0, 0, 1, 0, 133, 210, 6, 29, 0, 0, 1, 1, 0, 50, 1, 0, 133, 210, 2, 31, 0, 0, 1, 1, 0, 50, 1, 0, 133, 210, 2, 29, 0, 0, 1, 106, 25, 209, 1, 11, 2, 0, 0, 7, 0, 56, 2, 0, 134, 210, 1, 19, 0, 0, 0, 0, 133, 210, 0, 19, 0, 0, 0, 5, 0, 50, 1, 0, 133, 210, 1, 19, 0, 0, 3, 106, 25, 209, 1, 21, 0, 0, 11, 2, 4, 126, 0, 5, 8, 56, 131, 0, 6, 192, 120, 0, 0, 0, 3, 1, 6, 192, 32, 0, 0, 0, 127, 0, 140, 191, 2, 132, 0, 191, 85, 0, 133, 191, 3, 2, 6, 192, 40, 0, 0, 0, 2, 130, 0, 191, 41, 0, 132, 191, 3, 132, 0, 191, 29, 0, 133, 191, 3, 130, 0, 191, 12, 0, 132, 191, 0, 0, 143, 210, 130, 6, 2, 0, 112, 15, 140, 191, 144, 16, 4, 36, 0, 106, 25, 209, 4, 0, 2, 0, 5, 2, 6, 126, 3, 3, 2, 56, 2, 15, 4, 40, 0, 0, 112, 220, 0, 2, 0, 0, 110, 0, 130, 191, 3, 129, 0, 191, 108, 0, 132, 191, 0, 0, 143, 210, 129, 6, 2, 0, 112, 15, 140, 191, 136, 16, 4, 36, 127, 0, 140, 191, 0, 106, 25, 209, 8, 0, 2, 0, 9, 2, 6, 126, 3, 3, 2, 56, 2, 15, 4, 40, 0, 0, 104, 220, 0, 2, 0, 0, 95, 0, 130, 191, 0, 0, 143, 210, 130, 6, 2, 0, 0, 106, 25, 209, 4, 0, 2, 0, 5, 2, 4, 126, 2, 3, 2, 56, 112, 15, 140, 191, 0, 0, 116, 220, 0, 7, 0, 0, 85, 0, 130, 191, 2, 129, 0, 191, 83, 0, 132, 191, 3, 132, 0, 191, 26, 0, 133, 191, 3, 130, 0, 191, 11, 0, 132, 191, 0, 0, 143, 210, 129, 6, 2, 0, 127, 0, 140, 191, 0, 106, 25, 209, 8, 0, 2, 0, 9, 2, 4, 126, 2, 3, 2, 56, 112, 15, 140, 191, 0, 0, 104, 220, 0, 7, 0, 0, 68, 0, 130, 191, 3, 129, 0, 191, 66, 0, 132, 191, 131, 0, 6, 192, 48, 0, 0, 0, 127, 0, 140, 191, 0, 106, 25, 209, 2, 6, 2, 0, 3, 2, 4, 126, 2, 9, 2, 56, 112, 15, 140, 191, 0, 0, 96, 220, 0, 7, 0, 0, 55, 0, 130, 191, 0, 0, 143, 210, 130, 6, 2, 0, 0, 106, 25, 209, 4, 0, 2, 0, 5, 2, 4, 126, 2, 3, 2, 56, 112, 15, 140, 191, 0, 0, 112, 220, 0, 7, 0, 0, 45, 0, 130, 191, 3, 132, 0, 191, 34, 0, 133, 191, 3, 130, 0, 191, 14, 0, 132, 191, 112, 15, 140, 191, 144, 16, 0, 36, 0, 15, 10, 40, 1, 0, 143, 210, 130, 6, 2, 0, 1, 106, 25, 209, 4, 2, 2, 0, 5, 2, 6, 126, 3, 5, 4, 56, 144, 20, 6, 36, 3, 19, 12, 40, 0, 0, 116, 220, 1, 5, 0, 0, 27, 0, 130, 191, 3, 129, 0, 191, 25, 0, 132, 191, 112, 15, 140, 191, 136, 16, 0, 36, 0, 15, 0, 40, 144, 18, 2, 36, 2, 0, 143, 210, 130, 6, 2, 0, 0, 3, 0, 40, 152, 20, 2, 36, 2, 106, 25, 209, 4, 4, 2, 0, 5, 2, 8, 126, 4, 7, 6, 56, 0, 3, 0, 40, 0, 0, 112, 220, 2, 0, 0, 0, 9, 0, 130, 191, 0, 0, 143, 210, 130, 6, 2, 0, 0, 106, 25, 209, 4, 0, 2, 0, 5, 2, 4, 126, 2, 3, 2, 56, 112, 15, 140, 191, 0, 0, 124, 220, 0, 7, 0, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 2, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 19, 0, 19, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 6, 192, 4, 0, 0, 0, 127, 0, 140, 191, 0, 255, 2, 134, 255, 255, 0, 0, 0, 255, 128, 146, 16, 0, 16, 0, 1, 255, 1, 134, 255, 255, 0, 0, 2, 8, 2, 146, 0, 9, 0, 146, 1, 10, 1, 146, 3, 2, 10, 192, 0, 0, 0, 0, 3, 1, 6, 192, 16, 0, 0, 0, 3, 3, 6, 192, 88, 0, 0, 0, 195, 0, 2, 192, 96, 0, 0, 0, 127, 0, 140, 191, 2, 8, 2, 128, 0, 10, 0, 128, 2, 0, 0, 50, 0, 2, 2, 50, 1, 4, 0, 128, 4, 0, 193, 208, 1, 27, 0, 0, 8, 0, 193, 208, 0, 25, 0, 0, 0, 4, 4, 50, 8, 4, 128, 134, 3, 4, 136, 125, 0, 106, 128, 134, 0, 32, 128, 190, 206, 0, 136, 191, 131, 0, 6, 192, 40, 0, 0, 0, 3, 1, 6, 192, 72, 0, 0, 0, 3, 2, 2, 192, 80, 0, 0, 0, 67, 2, 2, 192, 112, 0, 0, 0, 3, 3, 10, 192, 120, 0, 0, 0, 159, 0, 6, 34, 159, 2, 8, 34, 127, 0, 140, 191, 5, 0, 134, 210, 1, 25, 0, 0, 4, 0, 133, 210, 4, 25, 0, 0, 4, 11, 8, 50, 5, 0, 133, 210, 1, 27, 0, 0, 5, 9, 8, 50, 5, 0, 133, 210, 1, 25, 0, 0, 5, 106, 25, 209, 5, 1, 2, 0, 4, 7, 6, 56, 159, 4, 8, 34, 6, 0, 134, 210, 2, 29, 0, 0, 4, 0, 133, 210, 4, 29, 0, 0, 4, 13, 8, 50, 6, 0, 133, 210, 2, 31, 0, 0, 6, 9, 8, 50, 6, 0, 133, 210, 2, 29, 0, 0, 5, 106, 25, 209, 6, 11, 2, 0, 4, 7, 6, 56, 4, 0, 134, 210, 5, 19, 0, 0, 3, 0, 133, 210, 3, 19, 0, 0, 3, 9, 6, 50, 4, 0, 133, 210, 5, 19, 0, 0, 6, 106, 25, 209, 4, 5, 0, 0, 3, 2, 10, 126, 3, 11, 14, 56, 4, 0, 30, 50, 5, 2, 32, 50, 8, 4, 34, 50, 131, 0, 6, 192, 104, 0, 0, 0, 3, 2, 6, 192, 24, 0, 0, 0, 127, 0, 140, 191, 2, 132, 0, 191, 78, 0, 133, 191, 2, 130, 0, 191, 40, 0, 132, 191, 3, 130, 0, 191, 14, 0, 132, 191, 3, 0, 143, 210, 130, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 0, 80, 220, 3, 0, 0, 3, 112, 0, 140, 191, 249, 2, 12, 126, 3, 6, 5, 0, 249, 2, 10, 126, 3, 6, 4, 0, 57, 0, 130, 191, 3, 129, 0, 191, 13, 0, 132, 191, 3, 0, 143, 210, 129, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 0, 72, 220, 3, 0, 0, 3, 112, 0, 140, 191, 136, 6, 12, 32, 249, 2, 10, 126, 3, 6, 0, 0, 42, 0, 130, 191, 3, 0, 143, 210, 130, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 0, 84, 220, 3, 0, 0, 5, 33, 0, 130, 191, 2, 129, 0, 191, 29, 0, 132, 191, 3, 130, 0, 191, 9, 0, 132, 191, 3, 0, 143, 210, 129, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 0, 72, 220, 3, 0, 0, 5, 19, 0, 130, 191, 3, 129, 0, 191, 7, 0, 132, 191, 3, 106, 25, 209, 8, 12, 2, 0, 9, 2, 10, 126, 5, 15, 8, 56, 0, 0, 64, 220, 3, 0, 0, 5, 10, 0, 130, 191, 3, 0, 143, 210, 130, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 0, 80, 220, 3, 0, 0, 5, 1, 0, 130, 191, 2, 2, 10, 126, 3, 2, 12, 126, 5, 2, 16, 126, 4, 2, 14, 126, 58, 0, 130, 191, 3, 129, 0, 191, 18, 0, 132, 191, 3, 0, 143, 210, 130, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 0, 80, 220, 3, 0, 0, 3, 112, 0, 140, 191, 249, 2, 16, 126, 3, 6, 3, 0, 249, 2, 14, 126, 3, 6, 2, 0, 249, 2, 12, 126, 3, 6, 1, 0, 249, 2, 10, 126, 3, 6, 0, 0, 38, 0, 130, 191, 3, 0, 143, 210, 130, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 0, 80, 220, 3, 0, 0, 5, 3, 130, 0, 191, 16, 0, 132, 191, 3, 106, 25, 209, 3, 9, 1, 0, 4, 106, 28, 209, 4, 1, 169, 1, 0, 0, 80, 220, 3, 0, 0, 3, 112, 0, 140, 191, 249, 2, 16, 126, 3, 6, 5, 0, 249, 2, 14, 126, 3, 6, 4, 0, 249, 2, 12, 126, 5, 6, 5, 0, 249, 2, 10, 126, 5, 6, 4, 0, 12, 0, 130, 191, 6, 106, 25, 209, 3, 25, 1, 0, 7, 106, 28, 209, 4, 1, 169, 1, 0, 0, 80, 220, 6, 0, 0, 8, 3, 106, 25, 209, 3, 9, 1, 0, 4, 106, 28, 209, 4, 1, 169, 1, 0, 0, 84, 220, 3, 0, 0, 6, 131, 0, 6, 192, 32, 0, 0, 0, 127, 0, 140, 191, 1, 1, 14, 192, 0, 0, 0, 0, 128, 2, 36, 126, 112, 0, 140, 191, 0, 95, 32, 240, 15, 5, 1, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 2, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 11, 0, 11, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 6, 192, 4, 0, 0, 0, 127, 0, 140, 191, 0, 255, 2, 134, 255, 255, 0, 0, 0, 255, 128, 146, 16, 0, 16, 0, 1, 255, 1, 134, 255, 255, 0, 0, 2, 8, 2, 146, 0, 9, 0, 146, 1, 10, 1, 146, 3, 2, 10, 192, 0, 0, 0, 0, 3, 1, 6, 192, 16, 0, 0, 0, 3, 3, 6, 192, 72, 0, 0, 0, 195, 0, 2, 192, 80, 0, 0, 0, 127, 0, 140, 191, 2, 8, 2, 128, 0, 10, 0, 128, 2, 0, 0, 50, 0, 2, 2, 50, 1, 4, 0, 128, 4, 0, 198, 208, 1, 27, 0, 0, 8, 0, 198, 208, 0, 25, 0, 0, 0, 4, 4, 50, 8, 4, 128, 135, 3, 4, 134, 125, 0, 106, 234, 135, 126, 1, 128, 190, 0, 106, 254, 137, 28, 0, 136, 191, 3, 2, 10, 192, 24, 0, 0, 0, 131, 0, 6, 192, 40, 0, 0, 0, 3, 1, 2, 192, 48, 0, 0, 0, 127, 0, 140, 191, 4, 3, 14, 192, 0, 0, 0, 0, 2, 0, 6, 50, 3, 2, 8, 50, 4, 4, 10, 50, 128, 2, 12, 126, 127, 0, 140, 191, 0, 95, 0, 240, 3, 3, 3, 0, 3, 1, 10, 192, 56, 0, 0, 0, 5, 2, 14, 192, 0, 0, 0, 0, 127, 0, 140, 191, 4, 0, 14, 50, 5, 2, 16, 50, 6, 4, 18, 50, 128, 2, 20, 126, 112, 15, 140, 191, 0, 95, 32, 240, 7, 3, 2, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 2, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 21, 0, 21, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 6, 192, 4, 0, 0, 0, 127, 0, 140, 191, 0, 255, 2, 134, 255, 255, 0, 0, 0, 255, 128, 146, 16, 0, 16, 0, 1, 255, 1, 134, 255, 255, 0, 0, 2, 8, 2, 146, 0, 9, 0, 146, 1, 10, 1, 146, 3, 2, 10, 192, 0, 0, 0, 0, 3, 1, 6, 192, 16, 0, 0, 0, 3, 3, 6, 192, 72, 0, 0, 0, 195, 0, 2, 192, 80, 0, 0, 0, 127, 0, 140, 191, 2, 8, 2, 128, 0, 10, 0, 128, 2, 0, 0, 50, 0, 2, 2, 50, 1, 4, 0, 128, 4, 0, 198, 208, 1, 27, 0, 0, 8, 0, 198, 208, 0, 25, 0, 0, 0, 4, 4, 50, 8, 4, 128, 135, 3, 4, 134, 125, 0, 106, 234, 135, 126, 1, 128, 190, 0, 106, 254, 137, 225, 2, 136, 191, 131, 0, 6, 192, 24, 0, 0, 0, 3, 1, 6, 192, 40, 0, 0, 0, 3, 2, 2, 192, 48, 0, 0, 0, 127, 0, 140, 191, 1, 3, 14, 192, 0, 0, 0, 0, 4, 0, 6, 50, 5, 2, 8, 50, 8, 4, 10, 50, 128, 2, 12, 126, 127, 0, 140, 191, 0, 95, 0, 240, 3, 3, 3, 0, 112, 15, 140, 191, 106, 0, 16, 208, 3, 7, 1, 0, 3, 0, 0, 209, 3, 1, 169, 1, 242, 6, 156, 124, 106, 32, 130, 190, 225, 0, 136, 191, 128, 6, 136, 124, 106, 32, 132, 190, 128, 2, 6, 126, 4, 126, 254, 137, 219, 0, 136, 191, 255, 0, 136, 190, 28, 46, 77, 59, 8, 6, 136, 124, 106, 32, 136, 190, 255, 6, 6, 10, 82, 184, 78, 65, 8, 126, 254, 137, 242, 6, 6, 10, 210, 0, 136, 191, 255, 6, 14, 38, 255, 255, 255, 127, 242, 14, 16, 4, 255, 0, 138, 190, 0, 0, 128, 61, 106, 1, 75, 208, 8, 21, 0, 0, 126, 1, 138, 190, 10, 106, 254, 137, 7, 105, 16, 126, 70, 0, 136, 191, 129, 16, 18, 36, 255, 16, 16, 50, 0, 0, 128, 0, 255, 18, 18, 50, 0, 0, 0, 1, 255, 16, 20, 38, 0, 0, 127, 0, 255, 18, 18, 38, 0, 0, 1, 0, 9, 21, 18, 50, 249, 2, 20, 126, 9, 6, 5, 0, 128, 2, 22, 126, 10, 0, 143, 210, 131, 20, 2, 0, 255, 0, 141, 190, 85, 85, 85, 85, 255, 0, 140, 190, 85, 85, 85, 85, 12, 106, 25, 209, 12, 20, 2, 0, 13, 2, 26, 126, 13, 23, 26, 56, 0, 0, 84, 220, 12, 0, 0, 12, 255, 0, 141, 190, 85, 85, 85, 85, 255, 0, 140, 190, 85, 85, 85, 85, 10, 106, 25, 209, 12, 20, 2, 0, 13, 2, 28, 126, 14, 23, 22, 56, 0, 0, 84, 220, 10, 0, 0, 10, 255, 16, 16, 38, 255, 255, 127, 0, 240, 18, 18, 40, 240, 16, 16, 40, 9, 17, 16, 4, 113, 1, 140, 191, 13, 17, 18, 10, 12, 17, 18, 44, 255, 2, 28, 126, 171, 170, 170, 62, 255, 0, 140, 190, 0, 0, 128, 62, 7, 103, 30, 126, 12, 18, 28, 44, 12, 0, 193, 209, 12, 17, 38, 132, 193, 30, 30, 50, 14, 0, 193, 209, 9, 29, 194, 3, 9, 19, 32, 10, 13, 17, 24, 44, 15, 11, 16, 126, 14, 33, 24, 44, 255, 0, 140, 190, 244, 253, 5, 56, 12, 0, 193, 209, 8, 25, 48, 132, 112, 0, 140, 191, 12, 23, 24, 2, 8, 21, 16, 46, 0, 112, 49, 63, 12, 19, 30, 4, 255, 18, 28, 42, 0, 0, 0, 128, 8, 31, 26, 2, 10, 126, 254, 137, 8, 17, 18, 10, 21, 0, 136, 191, 8, 19, 20, 10, 255, 2, 22, 126, 171, 170, 42, 62, 255, 0, 140, 190, 37, 73, 18, 62, 12, 16, 22, 44, 8, 23, 22, 48, 205, 204, 76, 62, 8, 23, 22, 48, 0, 0, 128, 62, 8, 23, 22, 48, 171, 170, 170, 62, 10, 23, 20, 10, 241, 18, 28, 10, 15, 0, 193, 209, 9, 227, 41, 132, 15, 17, 26, 4, 255, 20, 24, 42, 0, 0, 0, 128, 255, 16, 16, 42, 0, 0, 0, 128, 10, 1, 254, 190, 8, 27, 20, 4, 15, 29, 18, 4, 15, 21, 20, 2, 12, 19, 18, 4, 255, 26, 22, 38, 0, 240, 255, 255, 9, 21, 18, 2, 13, 23, 16, 4, 9, 17, 16, 2, 255, 16, 18, 10, 0, 160, 42, 56, 11, 19, 18, 46, 0, 160, 42, 56, 8, 19, 16, 46, 0, 80, 213, 62, 11, 17, 18, 46, 0, 80, 213, 62, 255, 18, 20, 10, 59, 170, 184, 66, 10, 17, 20, 126, 191, 20, 24, 38, 131, 24, 24, 36, 255, 0, 139, 190, 85, 85, 85, 85, 255, 0, 138, 190, 85, 85, 85, 85, 12, 106, 25, 209, 10, 24, 2, 0, 11, 2, 26, 126, 13, 106, 28, 209, 13, 1, 169, 1, 0, 0, 84, 220, 12, 0, 0, 12, 255, 0, 138, 190, 0, 80, 213, 62, 10, 11, 28, 126, 11, 0, 193, 209, 10, 22, 38, 132, 14, 19, 30, 46, 0, 0, 49, 188, 8, 23, 16, 2, 14, 31, 22, 46, 239, 47, 228, 183, 8, 23, 22, 2, 255, 2, 28, 126, 171, 170, 42, 62, 255, 0, 138, 190, 171, 170, 42, 61, 10, 22, 28, 44, 14, 0, 193, 209, 14, 23, 194, 3, 11, 23, 30, 10, 14, 31, 22, 44, 255, 0, 138, 190, 8, 227, 130, 180, 255, 0, 139, 190, 24, 114, 177, 66, 112, 0, 140, 191, 13, 23, 26, 44, 12, 0, 68, 208, 8, 21, 0, 0, 11, 18, 132, 124, 12, 23, 26, 44, 106, 12, 140, 134, 11, 18, 130, 124, 134, 20, 16, 34, 12, 27, 20, 2, 106, 12, 234, 135, 8, 0, 136, 210, 10, 17, 2, 0, 255, 2, 20, 126, 0, 0, 128, 127, 255, 0, 138, 190, 208, 142, 206, 194, 8, 21, 16, 0, 10, 18, 150, 124, 128, 16, 16, 0, 3, 15, 138, 125, 242, 16, 16, 10, 255, 2, 18, 126, 0, 0, 192, 127, 255, 0, 138, 190, 0, 0, 128, 255, 8, 19, 16, 0, 128, 14, 138, 125, 10, 0, 194, 208, 3, 21, 0, 0, 128, 16, 16, 0, 255, 2, 18, 126, 0, 0, 128, 127, 8, 0, 0, 209, 8, 19, 42, 0, 3, 19, 132, 125, 8, 19, 16, 0, 7, 19, 152, 125, 8, 7, 14, 0, 242, 6, 138, 125, 242, 14, 6, 0, 255, 2, 14, 126, 174, 71, 97, 189, 255, 0, 138, 190, 61, 10, 135, 63, 3, 0, 193, 209, 3, 21, 28, 4, 4, 1, 254, 190, 2, 126, 254, 137, 242, 2, 6, 126, 2, 1, 254, 190, 106, 0, 16, 208, 4, 7, 1, 0, 4, 0, 0, 209, 4, 1, 169, 1, 242, 8, 156, 124, 2, 106, 254, 134, 225, 0, 136, 191, 128, 8, 136, 124, 106, 32, 132, 190, 128, 2, 8, 126, 4, 126, 254, 137, 219, 0, 136, 191, 255, 0, 136, 190, 28, 46, 77, 59, 8, 8, 136, 124, 106, 32, 136, 190, 255, 8, 8, 10, 82, 184, 78, 65, 8, 126, 254, 137, 242, 8, 8, 10, 210, 0, 136, 191, 255, 8, 14, 38, 255, 255, 255, 127, 242, 14, 16, 4, 255, 0, 138, 190, 0, 0, 128, 61, 106, 1, 75, 208, 8, 21, 0, 0, 126, 1, 138, 190, 10, 106, 254, 137, 7, 105, 16, 126, 70, 0, 136, 191, 129, 16, 18, 36, 255, 16, 16, 50, 0, 0, 128, 0, 255, 18, 18, 50, 0, 0, 0, 1, 255, 16, 20, 38, 0, 0, 127, 0, 255, 18, 18, 38, 0, 0, 1, 0, 9, 21, 18, 50, 249, 2, 20, 126, 9, 6, 5, 0, 128, 2, 22, 126, 10, 0, 143, 210, 131, 20, 2, 0, 255, 0, 141, 190, 85, 85, 85, 85, 255, 0, 140, 190, 85, 85, 85, 85, 12, 106, 25, 209, 12, 20, 2, 0, 13, 2, 26, 126, 13, 23, 26, 56, 0, 0, 84, 220, 12, 0, 0, 12, 255, 0, 141, 190, 85, 85, 85, 85, 255, 0, 140, 190, 85, 85, 85, 85, 10, 106, 25, 209, 12, 20, 2, 0, 13, 2, 28, 126, 14, 23, 22, 56, 0, 0, 84, 220, 10, 0, 0, 10, 255, 16, 16, 38, 255, 255, 127, 0, 240, 18, 18, 40, 240, 16, 16, 40, 9, 17, 16, 4, 113, 1, 140, 191, 13, 17, 18, 10, 12, 17, 18, 44, 255, 2, 28, 126, 171, 170, 170, 62, 255, 0, 140, 190, 0, 0, 128, 62, 7, 103, 30, 126, 12, 18, 28, 44, 12, 0, 193, 209, 12, 17, 38, 132, 193, 30, 30, 50, 14, 0, 193, 209, 9, 29, 194, 3, 9, 19, 32, 10, 13, 17, 24, 44, 15, 11, 16, 126, 14, 33, 24, 44, 255, 0, 140, 190, 244, 253, 5, 56, 12, 0, 193, 209, 8, 25, 48, 132, 112, 0, 140, 191, 12, 23, 24, 2, 8, 21, 16, 46, 0, 112, 49, 63, 12, 19, 30, 4, 255, 18, 28, 42, 0, 0, 0, 128, 8, 31, 26, 2, 10, 126, 254, 137, 8, 17, 18, 10, 21, 0, 136, 191, 8, 19, 20, 10, 255, 2, 22, 126, 171, 170, 42, 62, 255, 0, 140, 190, 37, 73, 18, 62, 12, 16, 22, 44, 8, 23, 22, 48, 205, 204, 76, 62, 8, 23, 22, 48, 0, 0, 128, 62, 8, 23, 22, 48, 171, 170, 170, 62, 10, 23, 20, 10, 241, 18, 28, 10, 15, 0, 193, 209, 9, 227, 41, 132, 15, 17, 26, 4, 255, 20, 24, 42, 0, 0, 0, 128, 255, 16, 16, 42, 0, 0, 0, 128, 10, 1, 254, 190, 8, 27, 20, 4, 15, 29, 18, 4, 15, 21, 20, 2, 12, 19, 18, 4, 255, 26, 22, 38, 0, 240, 255, 255, 9, 21, 18, 2, 13, 23, 16, 4, 9, 17, 16, 2, 255, 16, 18, 10, 0, 160, 42, 56, 11, 19, 18, 46, 0, 160, 42, 56, 8, 19, 16, 46, 0, 80, 213, 62, 11, 17, 18, 46, 0, 80, 213, 62, 255, 18, 20, 10, 59, 170, 184, 66, 10, 17, 20, 126, 191, 20, 24, 38, 131, 24, 24, 36, 255, 0, 139, 190, 85, 85, 85, 85, 255, 0, 138, 190, 85, 85, 85, 85, 12, 106, 25, 209, 10, 24, 2, 0, 11, 2, 26, 126, 13, 106, 28, 209, 13, 1, 169, 1, 0, 0, 84, 220, 12, 0, 0, 12, 255, 0, 138, 190, 0, 80, 213, 62, 10, 11, 28, 126, 11, 0, 193, 209, 10, 22, 38, 132, 14, 19, 30, 46, 0, 0, 49, 188, 8, 23, 16, 2, 14, 31, 22, 46, 239, 47, 228, 183, 8, 23, 22, 2, 255, 2, 28, 126, 171, 170, 42, 62, 255, 0, 138, 190, 171, 170, 42, 61, 10, 22, 28, 44, 14, 0, 193, 209, 14, 23, 194, 3, 11, 23, 30, 10, 14, 31, 22, 44, 255, 0, 138, 190, 8, 227, 130, 180, 255, 0, 139, 190, 24, 114, 177, 66, 112, 0, 140, 191, 13, 23, 26, 44, 12, 0, 68, 208, 8, 21, 0, 0, 11, 18, 132, 124, 12, 23, 26, 44, 106, 12, 140, 134, 11, 18, 130, 124, 134, 20, 16, 34, 12, 27, 20, 2, 106, 12, 234, 135, 8, 0, 136, 210, 10, 17, 2, 0, 255, 2, 20, 126, 0, 0, 128, 127, 255, 0, 138, 190, 208, 142, 206, 194, 8, 21, 16, 0, 10, 18, 150, 124, 128, 16, 16, 0, 4, 15, 138, 125, 242, 16, 16, 10, 255, 2, 18, 126, 0, 0, 192, 127, 255, 0, 138, 190, 0, 0, 128, 255, 8, 19, 16, 0, 128, 14, 138, 125, 10, 0, 194, 208, 4, 21, 0, 0, 128, 16, 16, 0, 255, 2, 18, 126, 0, 0, 128, 127, 8, 0, 0, 209, 8, 19, 42, 0, 4, 19, 132, 125, 8, 19, 16, 0, 7, 19, 152, 125, 8, 9, 14, 0, 242, 8, 138, 125, 242, 14, 8, 0, 255, 2, 14, 126, 174, 71, 97, 189, 255, 0, 138, 190, 61, 10, 135, 63, 4, 0, 193, 209, 4, 21, 28, 4, 4, 1, 254, 190, 2, 126, 254, 137, 242, 2, 8, 126, 2, 1, 254, 190, 3, 2, 10, 192, 56, 0, 0, 0, 106, 0, 16, 208, 5, 7, 1, 0, 5, 0, 0, 209, 5, 1, 169, 1, 127, 0, 140, 191, 8, 0, 34, 50, 9, 2, 36, 50, 10, 4, 38, 50, 242, 10, 156, 124, 106, 32, 130, 190, 225, 0, 136, 191, 128, 10, 136, 124, 106, 32, 132, 190, 128, 2, 10, 126, 4, 126, 254, 137, 219, 0, 136, 191, 255, 0, 136, 190, 28, 46, 77, 59, 8, 10, 136, 124, 106, 32, 136, 190, 255, 10, 10, 10, 82, 184, 78, 65, 8, 126, 254, 137, 242, 10, 10, 10, 210, 0, 136, 191, 255, 10, 14, 38, 255, 255, 255, 127, 242, 14, 16, 4, 255, 0, 138, 190, 0, 0, 128, 61, 106, 1, 75, 208, 8, 21, 0, 0, 126, 1, 138, 190, 10, 106, 254, 137, 7, 105, 16, 126, 70, 0, 136, 191, 129, 16, 18, 36, 255, 16, 16, 50, 0, 0, 128, 0, 255, 18, 18, 50, 0, 0, 0, 1, 255, 16, 20, 38, 0, 0, 127, 0, 255, 18, 18, 38, 0, 0, 1, 0, 9, 21, 18, 50, 249, 2, 20, 126, 9, 6, 5, 0, 128, 2, 22, 126, 10, 0, 143, 210, 131, 20, 2, 0, 255, 0, 141, 190, 85, 85, 85, 85, 255, 0, 140, 190, 85, 85, 85, 85, 12, 106, 25, 209, 12, 20, 2, 0, 13, 2, 26, 126, 13, 23, 26, 56, 0, 0, 84, 220, 12, 0, 0, 12, 255, 0, 141, 190, 85, 85, 85, 85, 255, 0, 140, 190, 85, 85, 85, 85, 10, 106, 25, 209, 12, 20, 2, 0, 13, 2, 28, 126, 14, 23, 22, 56, 0, 0, 84, 220, 10, 0, 0, 10, 255, 16, 16, 38, 255, 255, 127, 0, 240, 18, 18, 40, 240, 16, 16, 40, 9, 17, 16, 4, 113, 1, 140, 191, 13, 17, 18, 10, 12, 17, 18, 44, 255, 2, 28, 126, 171, 170, 170, 62, 255, 0, 140, 190, 0, 0, 128, 62, 7, 103, 30, 126, 12, 18, 28, 44, 12, 0, 193, 209, 12, 17, 38, 132, 193, 30, 30, 50, 14, 0, 193, 209, 9, 29, 194, 3, 9, 19, 32, 10, 13, 17, 24, 44, 15, 11, 16, 126, 14, 33, 24, 44, 255, 0, 140, 190, 244, 253, 5, 56, 12, 0, 193, 209, 8, 25, 48, 132, 112, 0, 140, 191, 12, 23, 24, 2, 8, 21, 16, 46, 0, 112, 49, 63, 12, 19, 26, 4, 255, 18, 28, 42, 0, 0, 0, 128, 8, 27, 30, 2, 10, 126, 254, 137, 8, 17, 18, 10, 21, 0, 136, 191, 8, 19, 20, 10, 255, 2, 22, 126, 171, 170, 42, 62, 255, 0, 140, 190, 37, 73, 18, 62, 12, 16, 22, 44, 8, 23, 22, 48, 205, 204, 76, 62, 8, 23, 22, 48, 0, 0, 128, 62, 8, 23, 22, 48, 171, 170, 170, 62, 10, 23, 20, 10, 241, 18, 28, 10, 13, 0, 193, 209, 9, 227, 41, 132, 13, 17, 30, 4, 255, 20, 24, 42, 0, 0, 0, 128, 255, 16, 16, 42, 0, 0, 0, 128, 10, 1, 254, 190, 8, 31, 16, 4, 13, 29, 20, 4, 13, 17, 16, 2, 12, 21, 18, 4, 255, 30, 20, 38, 0, 240, 255, 255, 9, 17, 16, 2, 15, 21, 18, 4, 8, 19, 16, 2, 255, 16, 18, 10, 0, 160, 42, 56, 10, 19, 18, 46, 0, 160, 42, 56, 8, 19, 16, 46, 0, 80, 213, 62, 10, 17, 18, 46, 0, 80, 213, 62, 255, 18, 22, 10, 59, 170, 184, 66, 11, 17, 22, 126, 191, 22, 24, 38, 131, 24, 24, 36, 255, 0, 139, 190, 85, 85, 85, 85, 255, 0, 138, 190, 85, 85, 85, 85, 12, 106, 25, 209, 10, 24, 2, 0, 11, 2, 26, 126, 13, 106, 28, 209, 13, 1, 169, 1, 0, 0, 84, 220, 12, 0, 0, 12, 255, 0, 138, 190, 0, 80, 213, 62, 11, 11, 28, 126, 10, 0, 193, 209, 10, 20, 38, 132, 14, 19, 30, 46, 0, 0, 49, 188, 8, 21, 16, 2, 14, 31, 20, 46, 239, 47, 228, 183, 8, 21, 20, 2, 255, 2, 28, 126, 171, 170, 42, 62, 255, 0, 138, 190, 171, 170, 42, 61, 10, 20, 28, 44, 14, 0, 193, 209, 14, 21, 194, 3, 10, 21, 30, 10, 14, 31, 20, 44, 255, 0, 138, 190, 8, 227, 130, 180, 255, 0, 139, 190, 24, 114, 177, 66, 112, 0, 140, 191, 13, 21, 26, 44, 12, 0, 68, 208, 8, 21, 0, 0, 11, 18, 132, 124, 12, 21, 26, 44, 106, 12, 140, 134, 11, 18, 130, 124, 134, 22, 16, 34, 12, 27, 20, 2, 106, 12, 234, 135, 8, 0, 136, 210, 10, 17, 2, 0, 255, 2, 20, 126, 0, 0, 128, 127, 255, 0, 138, 190, 208, 142, 206, 194, 8, 21, 16, 0, 10, 18, 150, 124, 128, 16, 16, 0, 5, 15, 138, 125, 242, 16, 16, 10, 255, 2, 18, 126, 0, 0, 192, 127, 255, 0, 138, 190, 0, 0, 128, 255, 8, 19, 16, 0, 128, 14, 138, 125, 10, 0, 194, 208, 5, 21, 0, 0, 128, 16, 16, 0, 255, 2, 18, 126, 0, 0, 128, 127, 8, 0, 0, 209, 8, 19, 42, 0, 5, 19, 132, 125, 8, 19, 16, 0, 7, 19, 152, 125, 8, 11, 14, 0, 242, 10, 138, 125, 242, 14, 10, 0, 255, 2, 14, 126, 174, 71, 97, 189, 255, 0, 138, 190, 61, 10, 135, 63, 5, 0, 193, 209, 5, 21, 28, 4, 4, 1, 254, 190, 2, 126, 254, 137, 242, 2, 10, 126, 2, 1, 254, 190, 131, 0, 6, 192, 32, 0, 0, 0, 127, 0, 140, 191, 1, 1, 14, 192, 0, 0, 0, 0, 128, 2, 40, 126, 127, 0, 140, 191, 0, 95, 32, 240, 17, 3, 1, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 2, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 11, 0, 11, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 6, 192, 4, 0, 0, 0, 127, 0, 140, 191, 0, 255, 2, 134, 255, 255, 0, 0, 0, 255, 128, 146, 16, 0, 16, 0, 1, 255, 1, 134, 255, 255, 0, 0, 2, 8, 2, 146, 0, 9, 0, 146, 1, 10, 1, 146, 3, 2, 10, 192, 0, 0, 0, 0, 3, 1, 6, 192, 16, 0, 0, 0, 3, 3, 6, 192, 72, 0, 0, 0, 195, 0, 2, 192, 80, 0, 0, 0, 127, 0, 140, 191, 2, 8, 2, 128, 0, 10, 0, 128, 2, 0, 0, 50, 0, 2, 2, 50, 1, 4, 0, 128, 4, 0, 198, 208, 1, 27, 0, 0, 8, 0, 198, 208, 0, 25, 0, 0, 0, 4, 4, 50, 8, 4, 128, 135, 3, 4, 134, 125, 0, 106, 234, 135, 126, 1, 128, 190, 0, 106, 254, 137, 28, 0, 136, 191, 3, 2, 10, 192, 24, 0, 0, 0, 131, 0, 6, 192, 40, 0, 0, 0, 3, 1, 2, 192, 48, 0, 0, 0, 127, 0, 140, 191, 4, 3, 14, 192, 0, 0, 0, 0, 2, 0, 6, 50, 3, 2, 8, 50, 4, 4, 10, 50, 128, 2, 12, 126, 127, 0, 140, 191, 0, 95, 0, 240, 3, 3, 3, 0, 3, 1, 10, 192, 56, 0, 0, 0, 5, 2, 14, 192, 0, 0, 0, 0, 127, 0, 140, 191, 4, 0, 14, 50, 5, 2, 16, 50, 6, 4, 18, 50, 128, 2, 20, 126, 112, 15, 140, 191, 0, 95, 32, 240, 7, 3, 2, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 2, 172, 0, 144, 0, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 5, 0, 5, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 192, 4, 0, 0, 0, 127, 0, 140, 191, 0, 255, 0, 134, 255, 255, 0, 0, 0, 8, 0, 146, 131, 0, 6, 192, 0, 0, 0, 0, 67, 0, 2, 192, 72, 0, 0, 0, 127, 0, 140, 191, 0, 2, 0, 128, 0, 0, 0, 50, 1, 0, 136, 125, 106, 32, 128, 190, 20, 0, 136, 191, 3, 2, 10, 192, 24, 0, 0, 0, 131, 0, 2, 192, 40, 0, 0, 0, 127, 0, 140, 191, 4, 3, 10, 192, 0, 0, 0, 0, 2, 0, 2, 50, 127, 0, 140, 191, 0, 32, 12, 224, 1, 1, 3, 128, 131, 0, 2, 192, 56, 0, 0, 0, 5, 1, 10, 192, 0, 0, 0, 0, 127, 0, 140, 191, 2, 0, 0, 50, 112, 15, 140, 191, 0, 32, 28, 224, 0, 1, 1, 128, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 2, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 11, 0, 11, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 6, 192, 4, 0, 0, 0, 127, 0, 140, 191, 0, 255, 2, 134, 255, 255, 0, 0, 0, 255, 128, 146, 16, 0, 16, 0, 1, 255, 1, 134, 255, 255, 0, 0, 2, 8, 2, 146, 0, 9, 0, 146, 1, 10, 1, 146, 3, 1, 6, 192, 0, 0, 0, 0, 195, 0, 2, 192, 72, 0, 0, 0, 127, 0, 140, 191, 2, 4, 2, 128, 2, 0, 0, 50, 3, 0, 136, 125, 106, 32, 130, 190, 29, 0, 136, 191, 3, 2, 10, 192, 24, 0, 0, 0, 3, 1, 2, 192, 40, 0, 0, 0, 127, 0, 140, 191, 4, 3, 10, 192, 0, 0, 0, 0, 4, 0, 6, 50, 127, 0, 140, 191, 0, 32, 12, 224, 3, 3, 3, 128, 3, 3, 10, 192, 8, 0, 0, 0, 3, 1, 10, 192, 56, 0, 0, 0, 5, 4, 14, 192, 0, 0, 0, 0, 127, 0, 140, 191, 1, 14, 1, 128, 0, 12, 0, 128, 1, 6, 1, 128, 0, 5, 0, 128, 4, 0, 14, 50, 1, 4, 18, 50, 0, 2, 16, 50, 128, 2, 20, 126, 112, 15, 140, 191, 0, 95, 32, 240, 7, 3, 4, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 2, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 7, 0, 7, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 6, 192, 4, 0, 0, 0, 127, 0, 140, 191, 0, 255, 2, 134, 255, 255, 0, 0, 0, 255, 128, 146, 16, 0, 16, 0, 1, 255, 1, 134, 255, 255, 0, 0, 2, 8, 2, 146, 0, 9, 0, 146, 1, 10, 1, 146, 3, 1, 6, 192, 0, 0, 0, 0, 195, 0, 2, 192, 72, 0, 0, 0, 127, 0, 140, 191, 2, 4, 2, 128, 2, 0, 0, 50, 3, 0, 136, 125, 106, 32, 130, 190, 31, 0, 136, 191, 3, 2, 10, 192, 24, 0, 0, 0, 3, 3, 10, 192, 8, 0, 0, 0, 3, 1, 6, 192, 40, 0, 0, 0, 127, 0, 140, 191, 67, 3, 2, 192, 48, 0, 0, 0, 4, 4, 14, 192, 0, 0, 0, 0, 1, 14, 1, 128, 0, 12, 0, 128, 127, 0, 140, 191, 1, 13, 1, 128, 0, 5, 0, 128, 4, 0, 6, 50, 1, 4, 10, 50, 0, 2, 8, 50, 128, 2, 12, 126, 0, 95, 0, 240, 3, 1, 4, 0, 3, 0, 2, 192, 56, 0, 0, 0, 5, 1, 10, 192, 0, 0, 0, 0, 127, 0, 140, 191, 0, 0, 0, 50, 112, 15, 140, 191, 0, 32, 28, 224, 0, 1, 1, 128, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 2, 172, 0, 144, 19, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 11, 0, 11, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 6, 192, 4, 0, 0, 0, 127, 0, 140, 191, 0, 255, 2, 134, 255, 255, 0, 0, 0, 255, 128, 146, 16, 0, 16, 0, 1, 255, 1, 134, 255, 255, 0, 0, 2, 8, 2, 146, 0, 9, 0, 146, 1, 10, 1, 146, 3, 2, 10, 192, 0, 0, 0, 0, 3, 1, 6, 192, 16, 0, 0, 0, 3, 3, 6, 192, 96, 0, 0, 0, 195, 0, 2, 192, 104, 0, 0, 0, 127, 0, 140, 191, 2, 8, 2, 128, 0, 10, 0, 128, 2, 0, 0, 50, 0, 2, 2, 50, 1, 4, 0, 128, 4, 0, 193, 208, 1, 27, 0, 0, 8, 0, 193, 208, 0, 25, 0, 0, 0, 4, 4, 50, 8, 4, 128, 134, 3, 4, 136, 125, 0, 106, 128, 134, 0, 32, 128, 190, 55, 0, 136, 191, 3, 2, 10, 192, 80, 0, 0, 0, 127, 0, 140, 191, 8, 0, 14, 50, 9, 2, 16, 50, 10, 4, 18, 50, 131, 0, 2, 192, 112, 0, 0, 0, 3, 1, 6, 192, 24, 0, 0, 0, 127, 0, 140, 191, 2, 130, 0, 191, 30, 0, 133, 191, 2, 129, 0, 191, 13, 0, 132, 191, 3, 2, 10, 192, 48, 0, 0, 0, 2, 3, 14, 192, 0, 0, 0, 0, 127, 0, 140, 191, 8, 2, 0, 126, 9, 2, 2, 126, 10, 2, 4, 126, 11, 2, 6, 126, 128, 2, 20, 126, 0, 95, 32, 240, 7, 0, 3, 0, 27, 0, 130, 191, 2, 128, 0, 191, 25, 0, 132, 191, 3, 2, 10, 192, 32, 0, 0, 0, 2, 3, 14, 192, 0, 0, 0, 0, 127, 0, 140, 191, 8, 2, 0, 126, 9, 2, 2, 126, 10, 2, 4, 126, 11, 2, 6, 126, 128, 2, 20, 126, 0, 95, 32, 240, 7, 0, 3, 0, 12, 0, 130, 191, 3, 2, 10, 192, 64, 0, 0, 0, 2, 3, 14, 192, 0, 0, 0, 0, 127, 0, 140, 191, 8, 2, 0, 126, 9, 2, 2, 126, 10, 2, 4, 126, 11, 2, 6, 126, 128, 2, 20, 126, 0, 95, 32, 240, 7, 0, 3, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 2, 172, 0, 144, 0, 0, 0, 11, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 5, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 192, 4, 0, 0, 0, 127, 0, 140, 191, 0, 255, 0, 134, 255, 255, 0, 0, 0, 8, 0, 146, 131, 0, 6, 192, 0, 0, 0, 0, 67, 0, 2, 192, 96, 0, 0, 0, 127, 0, 140, 191, 0, 2, 0, 128, 0, 0, 0, 50, 1, 0, 136, 125, 106, 32, 128, 190, 50, 0, 136, 191, 131, 0, 2, 192, 80, 0, 0, 0, 127, 0, 140, 191, 2, 0, 0, 50, 131, 0, 2, 192, 112, 0, 0, 0, 3, 1, 6, 192, 24, 0, 0, 0, 127, 0, 140, 191, 2, 130, 0, 191, 28, 0, 133, 191, 2, 129, 0, 191, 12, 0, 132, 191, 3, 2, 10, 192, 48, 0, 0, 0, 2, 1, 10, 192, 0, 0, 0, 0, 127, 0, 140, 191, 8, 2, 2, 126, 9, 2, 4, 126, 10, 2, 6, 126, 11, 2, 8, 126, 0, 32, 28, 224, 0, 1, 1, 128, 25, 0, 130, 191, 2, 128, 0, 191, 23, 0, 132, 191, 3, 2, 10, 192, 32, 0, 0, 0, 2, 1, 10, 192, 0, 0, 0, 0, 127, 0, 140, 191, 8, 2, 2, 126, 9, 2, 4, 126, 10, 2, 6, 126, 11, 2, 8, 126, 0, 32, 28, 224, 0, 1, 1, 128, 11, 0, 130, 191, 3, 2, 10, 192, 64, 0, 0, 0, 2, 1, 10, 192, 0, 0, 0, 0, 127, 0, 140, 191, 8, 2, 2, 126, 9, 2, 4, 126, 10, 2, 6, 126, 11, 2, 8, 126, 0, 32, 28, 224, 0, 1, 1, 128, 0, 0, 129, 191, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 1, 0, 4, 0, 8, 2, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 1, 0, 4, 0, 16, 6, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 26, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 4, 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 26, 0, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 204, 4, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 26, 0, 5, 0, 0, 10, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 26, 0, 5, 0, 0, 13, 0, 0, 0, 0, 0, 0, 28, 13, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 26, 0, 5, 0, 0, 27, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 33, 1, 0, 0, 26, 0, 5, 0, 0, 30, 0, 0, 0, 0, 0, 0, 148, 1, 0, 0, 0, 0, 0, 0, 58, 1, 0, 0, 26, 0, 5, 0, 0, 32, 0, 0, 0, 0, 0, 0, 208, 1, 0, 0, 0, 0, 0, 0, 90, 1, 0, 0, 26, 0, 5, 0, 0, 34, 0, 0, 0, 0, 0, 0, 216, 1, 0, 0, 0, 0, 0, 0, 122, 1, 0, 0, 26, 0, 5, 0, 0, 36, 0, 0, 0, 0, 0, 0, 112, 2, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 26, 0, 5, 0, 0, 39, 0, 0, 0, 0, 0, 0, 12, 2, 0, 0, 0, 0, 0, 0, 170, 1, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 1, 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 15, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 15, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 17, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 17, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 19, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 19, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 19, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 19, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 20, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 20, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 23, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 23, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 23, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 23, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 24, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 24, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 3, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 2, 0, 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 3, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 3, 0, 0, 0, 0, 0, 0, 24, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 1, 0, 0, 0, 7, 0, 192, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 12, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 55, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 56, 0, 0, 0, 0, 0, 0, 176, 1, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0}; +} +} diff --git a/runtime/hsa-runtime/image/blit_object_gfx9xx.cpp b/runtime/hsa-runtime/image/blit_object_gfx9xx.cpp index 1c7683a4ec..e65c0dc4f3 100644 --- a/runtime/hsa-runtime/image/blit_object_gfx9xx.cpp +++ b/runtime/hsa-runtime/image/blit_object_gfx9xx.cpp @@ -1,2 +1,6 @@ #include +namespace rocr { +namespace image { uint8_t blit_object_gfx9xx[] = {127, 69, 76, 70, 2, 1, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 224, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 72, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 56, 0, 2, 0, 64, 0, 8, 0, 1, 0, 2, 0, 0, 96, 6, 0, 0, 0, 184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 10, 0, 0, 0, 0, 0, 0, 24, 10, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 96, 5, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 41, 0, 0, 0, 0, 0, 0, 24, 41, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 46, 115, 104, 115, 116, 114, 116, 97, 98, 0, 46, 115, 116, 114, 116, 97, 98, 0, 46, 110, 111, 116, 101, 0, 46, 104, 115, 97, 100, 97, 116, 97, 95, 114, 101, 97, 100, 111, 110, 108, 121, 95, 97, 103, 101, 110, 116, 0, 46, 104, 115, 97, 116, 101, 120, 116, 0, 46, 115, 121, 109, 116, 97, 98, 0, 46, 115, 121, 109, 116, 97, 98, 0, 46, 114, 101, 108, 97, 46, 104, 115, 97, 116, 101, 120, 116, 0, 0, 0, 38, 104, 115, 97, 95, 101, 120, 116, 95, 105, 109, 97, 103, 101, 58, 58, 38, 95, 95, 111, 99, 109, 108, 116, 98, 108, 95, 77, 51, 50, 95, 69, 88, 80, 95, 69, 80, 0, 38, 104, 115, 97, 95, 101, 120, 116, 95, 105, 109, 97, 103, 101, 58, 58, 38, 95, 95, 111, 99, 109, 108, 116, 98, 108, 95, 77, 51, 50, 95, 76, 79, 71, 69, 0, 38, 104, 115, 97, 95, 101, 120, 116, 95, 105, 109, 97, 103, 101, 58, 58, 38, 95, 95, 111, 99, 109, 108, 116, 98, 108, 95, 77, 51, 50, 95, 76, 79, 71, 95, 73, 78, 86, 95, 69, 80, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 116, 111, 95, 98, 117, 102, 102, 101, 114, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 98, 117, 102, 102, 101, 114, 95, 116, 111, 95, 105, 109, 97, 103, 101, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 100, 101, 102, 97, 117, 108, 116, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 108, 105, 110, 101, 97, 114, 95, 116, 111, 95, 115, 116, 97, 110, 100, 97, 114, 100, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 115, 116, 97, 110, 100, 97, 114, 100, 95, 116, 111, 95, 108, 105, 110, 101, 97, 114, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 49, 100, 98, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 49, 100, 98, 95, 116, 111, 95, 114, 101, 103, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 111, 112, 121, 95, 105, 109, 97, 103, 101, 95, 114, 101, 103, 95, 116, 111, 95, 49, 100, 98, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 108, 101, 97, 114, 95, 105, 109, 97, 103, 101, 95, 107, 101, 114, 110, 101, 108, 0, 38, 95, 95, 99, 108, 101, 97, 114, 95, 105, 109, 97, 103, 101, 95, 49, 100, 98, 95, 107, 101, 114, 110, 101, 108, 0, 95, 95, 104, 115, 97, 95, 115, 101, 99, 116, 105, 111, 110, 46, 104, 115, 97, 100, 97, 116, 97, 95, 114, 101, 97, 100, 111, 110, 108, 121, 95, 97, 103, 101, 110, 116, 0, 95, 95, 104, 115, 97, 95, 115, 101, 99, 116, 105, 111, 110, 46, 104, 115, 97, 116, 101, 120, 116, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 65, 77, 68, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 65, 77, 68, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 0, 4, 0, 0, 0, 26, 0, 0, 0, 3, 0, 0, 0, 65, 77, 68, 0, 4, 0, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 77, 68, 0, 65, 77, 68, 71, 80, 85, 0, 0, 4, 0, 0, 0, 41, 0, 0, 0, 4, 0, 0, 0, 65, 77, 68, 0, 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 65, 77, 68, 32, 72, 83, 65, 32, 82, 117, 110, 116, 105, 109, 101, 32, 70, 105, 110, 97, 108, 105, 122, 101, 114, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 26, 0, 0, 0, 5, 0, 0, 0, 65, 77, 68, 0, 22, 0, 45, 104, 115, 97, 95, 99, 97, 108, 108, 95, 99, 111, 110, 118, 101, 110, 116, 105, 111, 110, 61, 48, 0, 5, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 96, 129, 63, 119, 62, 26, 57, 0, 192, 130, 63, 138, 105, 216, 57, 0, 32, 132, 63, 29, 70, 81, 58, 0, 160, 133, 63, 124, 54, 172, 57, 0, 0, 135, 63, 180, 12, 123, 58, 0, 128, 136, 63, 4, 116, 64, 58, 0, 0, 138, 63, 170, 171, 38, 58, 0, 128, 139, 63, 31, 15, 46, 58, 0, 0, 141, 63, 219, 250, 86, 58, 0, 160, 142, 63, 104, 49, 7, 57, 0, 32, 144, 63, 24, 226, 14, 58, 0, 192, 145, 63, 234, 220, 244, 56, 0, 64, 147, 63, 120, 89, 81, 58, 0, 224, 148, 63, 71, 125, 39, 58, 0, 128, 150, 63, 185, 105, 33, 58, 0, 32, 152, 63, 140, 130, 63, 58, 0, 224, 153, 63, 65, 38, 11, 55, 0, 128, 155, 63, 157, 155, 211, 57, 0, 32, 157, 63, 57, 205, 118, 58, 0, 224, 158, 63, 4, 147, 41, 58, 0, 160, 160, 63, 125, 136, 2, 58, 0, 96, 162, 63, 24, 24, 2, 58, 0, 32, 164, 63, 112, 173, 40, 58, 0, 224, 165, 63, 77, 181, 118, 58, 0, 192, 167, 63, 78, 59, 217, 57, 0, 160, 169, 63, 117, 90, 45, 56, 0, 96, 171, 63, 173, 205, 81, 58, 0, 64, 173, 63, 82, 247, 65, 58, 0, 32, 175, 63, 107, 197, 91, 58, 0, 32, 177, 63, 116, 96, 253, 56, 0, 0, 179, 63, 149, 32, 14, 58, 0, 0, 181, 63, 127, 102, 30, 57, 0, 224, 182, 63, 25, 143, 108, 58, 0, 224, 184, 63, 59, 122, 93, 58, 0, 224, 186, 63, 144, 213, 122, 58, 0, 0, 189, 63, 245, 57, 138, 57, 0, 0, 191, 63, 179, 205, 60, 58, 0, 32, 193, 63, 166, 204, 196, 57, 0, 64, 195, 63, 68, 155, 89, 57, 0, 96, 197, 63, 42, 66, 101, 57, 0, 128, 199, 63, 138, 76, 215, 57, 0, 160, 201, 63, 51, 236, 77, 58, 0, 224, 203, 63, 239, 79, 193, 57, 0, 32, 206, 63, 163, 130, 17, 57, 0, 96, 208, 63, 187, 246, 204, 56, 0, 160, 210, 63, 31, 217, 129, 57, 0, 224, 212, 63, 94, 213, 26, 58, 0, 64, 215, 63, 90, 153, 31, 57, 0, 128, 217, 63, 19, 174, 104, 58, 0, 224, 219, 63, 190, 188, 93, 58, 0, 96, 222, 63, 94, 130, 244, 55, 0, 192, 224, 63, 194, 238, 205, 57, 0, 32, 227, 63, 149, 75, 124, 58, 0, 160, 229, 63, 59, 55, 72, 58, 0, 32, 232, 63, 129, 82, 75, 58, 0, 192, 234, 63, 221, 231, 198, 55, 0, 64, 237, 63, 237, 1, 243, 57, 0, 224, 239, 63, 123, 51, 23, 57, 0, 128, 242, 63, 44, 158, 59, 56, 0, 32, 245, 63, 164, 162, 47, 57, 0, 192, 247, 63, 152, 251, 6, 58, 0, 128, 250, 63, 220, 182, 236, 56, 0, 32, 253, 63, 103, 96, 112, 58, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 59, 65, 172, 41, 52, 0, 0, 126, 60, 252, 176, 168, 53, 0, 192, 189, 60, 234, 131, 141, 54, 0, 16, 252, 60, 120, 14, 27, 54, 0, 240, 28, 61, 254, 185, 135, 54, 0, 160, 59, 61, 101, 236, 49, 54, 0, 16, 90, 61, 25, 113, 221, 54, 0, 80, 120, 61, 69, 0, 195, 53, 0, 32, 139, 61, 81, 119, 155, 55, 0, 0, 154, 61, 13, 203, 235, 55, 0, 208, 168, 61, 131, 159, 131, 55, 0, 128, 183, 61, 229, 138, 82, 55, 0, 16, 198, 61, 24, 235, 162, 55, 0, 144, 212, 61, 149, 116, 218, 54, 0, 240, 226, 61, 183, 30, 169, 54, 0, 48, 241, 61, 21, 183, 131, 55, 0, 96, 255, 61, 219, 49, 17, 55, 0, 176, 6, 62, 104, 62, 63, 56, 0, 176, 13, 62, 151, 106, 21, 56, 0, 160, 20, 62, 15, 124, 41, 56, 0, 128, 27, 62, 15, 16, 126, 56, 0, 96, 34, 62, 101, 182, 21, 56, 0, 48, 41, 62, 161, 227, 229, 55, 0, 240, 47, 62, 83, 56, 24, 56, 0, 176, 54, 62, 157, 113, 254, 53, 0, 80, 61, 62, 8, 129, 68, 56, 0, 240, 67, 62, 144, 50, 80, 56, 0, 144, 74, 62, 232, 57, 53, 55, 0, 16, 81, 62, 241, 15, 94, 56, 0, 144, 87, 62, 64, 167, 100, 56, 0, 16, 94, 62, 45, 116, 134, 55, 0, 112, 100, 62, 205, 227, 123, 56, 0, 224, 106, 62, 62, 173, 133, 54, 0, 48, 113, 62, 21, 183, 3, 56, 0, 128, 119, 62, 220, 203, 173, 55, 0, 192, 125, 62, 175, 54, 12, 56, 0, 0, 130, 62, 211, 82, 22, 55, 0, 16, 133, 62, 57, 113, 146, 56, 0, 32, 136, 62, 215, 252, 197, 56, 0, 48, 139, 62, 213, 85, 174, 56, 0, 64, 142, 62, 105, 193, 24, 56, 0, 64, 145, 62, 231, 253, 160, 56, 0, 64, 148, 62, 239, 9, 173, 56, 0, 64, 151, 62, 225, 186, 98, 56, 0, 48, 154, 62, 76, 205, 238, 56, 0, 48, 157, 62, 210, 170, 152, 55, 0, 32, 160, 62, 26, 26, 66, 55, 0, 0, 163, 62, 14, 225, 197, 56, 0, 240, 165, 62, 238, 42, 191, 55, 0, 208, 168, 62, 45, 135, 45, 56, 0, 176, 171, 62, 138, 46, 238, 55, 0, 128, 174, 62, 172, 223, 222, 56, 0, 96, 177, 62, 185, 242, 2, 56, 0, 48, 180, 62, 155, 30, 72, 56, 0, 0, 183, 62, 43, 170, 14, 56, 0, 192, 185, 62, 93, 251, 235, 56, 0, 144, 188, 62, 221, 95, 37, 56, 0, 80, 191, 62, 130, 59, 120, 56, 0, 16, 194, 62, 30, 218, 81, 56, 0, 208, 196, 62, 5, 27, 78, 55, 0, 128, 199, 62, 155, 67, 143, 56, 0, 48, 202, 62, 16, 14, 202, 56, 0, 224, 204, 62, 139, 192, 202, 56, 0, 144, 207, 62, 95, 246, 145, 56, 0, 64, 210, 62, 203, 33, 129, 55, 0, 224, 212, 62, 154, 154, 108, 56, 0, 128, 215, 62, 35, 153, 148, 56, 0, 32, 218, 62, 204, 123, 119, 56, 0, 192, 220, 62, 38, 45, 177, 55, 0, 80, 223, 62, 211, 206, 166, 56, 0, 224, 225, 62, 230, 211, 235, 56, 0, 112, 228, 62, 205, 227, 251, 56, 0, 0, 231, 62, 194, 133, 215, 56, 0, 144, 233, 62, 0, 126, 126, 56, 0, 16, 236, 62, 197, 146, 243, 56, 0, 160, 238, 62, 131, 9, 212, 55, 0, 32, 241, 62, 124, 26, 8, 56, 0, 160, 243, 62, 173, 195, 132, 55, 0, 16, 246, 62, 35, 233, 204, 56, 0, 144, 248, 62, 175, 95, 15, 56, 0, 0, 251, 62, 56, 253, 145, 56, 0, 112, 253, 62, 188, 71, 172, 56, 0, 224, 255, 62, 43, 4, 151, 56, 0, 32, 1, 63, 210, 82, 41, 57, 0, 80, 2, 63, 212, 206, 111, 57, 0, 144, 3, 63, 115, 112, 249, 55, 0, 192, 4, 63, 174, 158, 94, 56, 0, 240, 5, 63, 74, 200, 101, 56, 0, 32, 7, 63, 163, 11, 19, 56, 0, 64, 8, 63, 22, 207, 121, 57, 0, 112, 9, 63, 201, 202, 56, 57, 0, 160, 10, 63, 244, 210, 195, 56, 0, 192, 11, 63, 236, 93, 117, 57, 0, 240, 12, 63, 103, 180, 230, 56, 0, 16, 14, 63, 184, 15, 92, 57, 0, 64, 15, 63, 224, 188, 62, 56, 0, 96, 16, 63, 146, 209, 220, 56, 0, 128, 17, 63, 223, 107, 24, 57, 0, 160, 18, 63, 76, 231, 45, 57, 0, 192, 19, 63, 68, 9, 47, 57, 0, 224, 20, 63, 97, 255, 27, 57, 0, 0, 22, 63, 68, 237, 233, 56, 0, 32, 23, 63, 200, 109, 104, 56, 0, 48, 24, 63, 167, 153, 107, 57, 0, 80, 25, 63, 137, 156, 9, 57, 0, 112, 26, 63, 115, 118, 162, 55, 0, 128, 27, 63, 163, 218, 11, 57, 0, 144, 28, 63, 171, 105, 112, 57, 0, 176, 29, 63, 255, 73, 132, 56, 0, 192, 30, 63, 56, 53, 1, 57, 0, 208, 31, 63, 104, 194, 45, 57, 0, 224, 32, 63, 35, 244, 71, 57, 0, 240, 33, 63, 124, 241, 79, 57, 0, 0, 35, 63, 14, 225, 69, 57, 0, 16, 36, 63, 245, 232, 41, 57, 0, 32, 37, 63, 176, 93, 248, 56, 0, 48, 38, 63, 153, 95, 115, 56, 0, 48, 39, 63, 219, 8, 108, 57, 0, 64, 40, 63, 0, 230, 9, 57, 0, 80, 41, 63, 111, 153, 180, 55, 0, 80, 42, 63, 204, 51, 18, 57, 0, 80, 43, 63, 217, 234, 124, 57, 0, 96, 44, 63, 205, 181, 173, 56, 0, 96, 45, 63, 26, 38, 32, 57, 0, 96, 46, 63, 54, 238, 88, 57, 0, 112, 47, 63, 5, 73, 170, 53, 0, 112, 48, 63, 30, 209, 203, 55, 0, 112, 49, 63, 244, 253, 5, 56, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 254, 63, 248, 3, 254, 56, 0, 0, 252, 63, 193, 15, 252, 57, 0, 0, 250, 63, 201, 179, 140, 58, 0, 0, 248, 63, 16, 62, 248, 58, 0, 0, 246, 63, 48, 123, 64, 59, 0, 0, 244, 63, 96, 141, 137, 59, 0, 0, 242, 63, 72, 214, 185, 59, 0, 0, 240, 63, 241, 240, 240, 59, 0, 0, 239, 63, 127, 220, 186, 58, 0, 0, 237, 63, 108, 7, 102, 59, 0, 0, 235, 63, 166, 178, 189, 59, 0, 0, 234, 63, 161, 14, 234, 57, 0, 0, 232, 63, 247, 88, 75, 59, 0, 0, 230, 63, 72, 180, 194, 59, 0, 0, 229, 63, 172, 96, 150, 58, 0, 0, 227, 63, 228, 56, 142, 59, 0, 0, 225, 63, 14, 120, 252, 59, 0, 0, 224, 63, 56, 112, 96, 59, 0, 0, 222, 63, 77, 92, 233, 59, 0, 0, 221, 63, 76, 145, 79, 59, 0, 0, 219, 63, 239, 97, 235, 59, 0, 0, 218, 63, 79, 27, 104, 59, 0, 0, 217, 63, 178, 1, 89, 56, 0, 0, 215, 63, 229, 53, 148, 59, 0, 0, 214, 63, 89, 3, 174, 58, 0, 0, 212, 63, 3, 123, 199, 59, 0, 0, 211, 63, 109, 26, 80, 59, 0, 0, 210, 63, 33, 13, 210, 57, 0, 0, 208, 63, 204, 159, 182, 59, 0, 0, 207, 63, 81, 233, 72, 59, 0, 0, 206, 63, 185, 83, 52, 58, 0, 0, 204, 63, 205, 204, 204, 59, 0, 0, 203, 63, 192, 39, 135, 59, 0, 0, 202, 63, 205, 15, 11, 59, 0, 0, 201, 63, 209, 73, 123, 57, 0, 0, 199, 63, 125, 12, 206, 59, 0, 0, 198, 63, 106, 12, 152, 59, 0, 0, 197, 63, 247, 144, 75, 59, 0, 0, 196, 63, 21, 190, 220, 58, 0, 0, 195, 63, 49, 12, 195, 57, 0, 0, 193, 63, 214, 187, 228, 59, 0, 0, 192, 63, 193, 192, 192, 59, 0, 0, 191, 63, 232, 47, 160, 59, 0, 0, 190, 63, 12, 250, 130, 59, 0, 0, 189, 63, 142, 32, 82, 59, 0, 0, 188, 63, 24, 200, 36, 59, 0, 0, 187, 63, 135, 156, 251, 58, 0, 0, 186, 63, 140, 46, 186, 58, 0, 0, 185, 63, 233, 15, 133, 58, 0, 0, 184, 63, 3, 23, 56, 58, 0, 0, 183, 63, 162, 181, 251, 57, 0, 0, 182, 63, 97, 11, 182, 57, 0, 0, 181, 63, 170, 104, 158, 57, 0, 0, 180, 63, 65, 11, 180, 57, 0, 0, 179, 63, 41, 53, 246, 57, 0, 0, 178, 63, 67, 22, 50, 58, 0, 0, 177, 63, 192, 157, 126, 58, 0, 0, 176, 63, 11, 44, 176, 58, 0, 0, 175, 63, 26, 119, 235, 58, 0, 0, 174, 63, 185, 130, 24, 59, 0, 0, 173, 63, 176, 86, 64, 59, 0, 0, 172, 63, 8, 35, 109, 59, 0, 0, 171, 63, 227, 105, 143, 59, 0, 0, 170, 63, 171, 170, 170, 59, 0, 0, 169, 63, 72, 74, 200, 59, 0, 0, 168, 63, 87, 63, 232, 59, 0, 0, 168, 63, 129, 10, 168, 57, 0, 0, 167, 63, 230, 20, 188, 58, 0, 0, 166, 63, 114, 136, 43, 59, 0, 0, 165, 63, 5, 106, 125, 59, 0, 0, 164, 63, 30, 207, 169, 59, 0, 0, 163, 63, 61, 10, 215, 59, 0, 0, 163, 63, 246, 199, 75, 57, 0, 0, 162, 63, 172, 12, 223, 58, 0, 0, 161, 63, 93, 98, 86, 59, 0, 0, 160, 63, 161, 160, 160, 59, 0, 0, 159, 63, 254, 9, 216, 59, 0, 0, 159, 63, 57, 47, 11, 58, 0, 0, 158, 63, 72, 90, 25, 59, 0, 0, 157, 63, 158, 216, 137, 59, 0, 0, 156, 63, 97, 225, 200, 59, 0, 0, 156, 63, 193, 9, 156, 57, 0, 0, 155, 63, 62, 223, 24, 59, 0, 0, 154, 63, 217, 231, 144, 59, 0, 0, 153, 63, 219, 34, 215, 59, 0, 0, 153, 63, 139, 210, 120, 58, 0, 0, 152, 63, 19, 144, 81, 59, 0, 0, 151, 63, 237, 37, 180, 59, 0, 0, 151, 63, 46, 1, 23, 56, 0, 0, 150, 63, 216, 180, 31, 59, 0, 0, 149, 63, 104, 37, 160, 59, 0, 0, 148, 63, 79, 9, 242, 59, 0, 0, 148, 63, 41, 1, 11, 59, 0, 0, 147, 63, 196, 133, 154, 59, 0, 0, 146, 63, 132, 19, 241, 59, 0, 0, 146, 63, 37, 73, 18, 59, 0, 0, 145, 63, 197, 179, 162, 59, 0, 0, 144, 63, 9, 188, 253, 59, 0, 0, 144, 63, 198, 112, 52, 59, 0, 0, 143, 63, 238, 35, 184, 59, 0, 0, 143, 63, 208, 206, 59, 58, 0, 0, 142, 63, 218, 106, 112, 59, 0, 0, 141, 63, 2, 82, 218, 59, 0, 0, 141, 63, 35, 44, 247, 58, 0, 0, 140, 63, 4, 156, 162, 59, 0, 0, 140, 63, 193, 8, 140, 57, 0, 0, 139, 63, 148, 104, 96, 59, 0, 0, 138, 63, 252, 242, 216, 59, 0, 0, 138, 63, 225, 240, 5, 59, 0, 0, 137, 63, 138, 64, 174, 59, 0, 0, 137, 63, 215, 57, 86, 58, 0, 0, 136, 63, 137, 136, 136, 59, 0, 0, 135, 63, 136, 128, 247, 59, 0, 0, 135, 63, 190, 86, 79, 59, 0, 0, 134, 63, 68, 5, 217, 59, 0, 0, 134, 63, 252, 20, 23, 59, 0, 0, 133, 63, 97, 55, 191, 59, 0, 0, 133, 63, 77, 33, 208, 58, 0, 0, 132, 63, 200, 249, 169, 59, 0, 0, 132, 63, 8, 33, 132, 58, 0, 0, 131, 63, 82, 48, 153, 59, 0, 0, 131, 63, 188, 116, 19, 58, 0, 0, 130, 63, 191, 191, 140, 59, 0, 0, 130, 63, 33, 8, 130, 57, 0, 0, 129, 63, 169, 141, 132, 59, 0, 0, 129, 63, 4, 2, 129, 56, 0, 0, 128, 63, 129, 128, 128, 59, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 172, 0, 148, 19, 0, 0, 43, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 11, 0, 11, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 6, 192, 4, 0, 0, 0, 127, 192, 140, 191, 4, 255, 8, 134, 255, 255, 0, 0, 4, 255, 132, 146, 16, 0, 16, 0, 5, 255, 5, 134, 255, 255, 0, 0, 8, 10, 8, 146, 4, 11, 4, 146, 5, 12, 5, 146, 3, 0, 10, 192, 0, 0, 0, 0, 131, 2, 6, 192, 16, 0, 0, 0, 3, 3, 6, 192, 104, 0, 0, 0, 127, 192, 140, 191, 67, 0, 2, 192, 112, 0, 0, 0, 0, 2, 6, 126, 2, 2, 8, 126, 0, 0, 255, 209, 8, 6, 2, 4, 1, 0, 255, 209, 4, 8, 6, 4, 10, 2, 6, 126, 2, 0, 193, 208, 1, 27, 0, 0, 12, 0, 136, 125, 2, 0, 255, 209, 5, 6, 10, 4, 106, 2, 130, 134, 127, 192, 140, 191, 1, 4, 136, 125, 2, 106, 128, 134, 0, 32, 128, 190, 199, 0, 136, 191, 131, 0, 6, 192, 24, 0, 0, 0, 3, 1, 6, 192, 56, 0, 0, 0, 3, 2, 2, 192, 64, 0, 0, 0, 131, 2, 6, 192, 72, 0, 0, 0, 67, 2, 2, 192, 128, 0, 0, 0, 3, 3, 10, 192, 136, 0, 0, 0, 159, 0, 6, 34, 159, 2, 8, 34, 127, 192, 140, 191, 5, 0, 134, 210, 1, 25, 0, 0, 4, 0, 133, 210, 4, 25, 0, 0, 6, 0, 133, 210, 1, 27, 0, 0, 4, 0, 255, 209, 4, 11, 26, 4, 5, 0, 133, 210, 1, 25, 0, 0, 5, 106, 25, 209, 5, 1, 2, 0, 4, 7, 6, 56, 4, 0, 14, 104, 5, 2, 16, 104, 8, 4, 18, 104, 159, 4, 12, 34, 1, 4, 14, 192, 0, 0, 0, 0, 128, 2, 20, 126, 127, 192, 140, 191, 0, 95, 0, 240, 7, 7, 4, 0, 0, 0, 134, 210, 2, 29, 0, 0, 1, 0, 133, 210, 6, 29, 0, 0, 4, 0, 133, 210, 2, 31, 0, 0, 0, 0, 255, 209, 1, 1, 18, 4, 1, 0, 133, 210, 2, 29, 0, 0, 1, 106, 25, 209, 1, 11, 2, 0, 0, 7, 0, 56, 2, 0, 134, 210, 1, 19, 0, 0, 0, 0, 133, 210, 0, 19, 0, 0, 0, 5, 0, 104, 1, 0, 133, 210, 1, 19, 0, 0, 3, 106, 25, 209, 1, 21, 0, 0, 11, 2, 4, 126, 0, 5, 8, 56, 131, 0, 6, 192, 120, 0, 0, 0, 3, 1, 6, 192, 32, 0, 0, 0, 127, 192, 140, 191, 2, 132, 0, 191, 85, 0, 133, 191, 3, 2, 6, 192, 40, 0, 0, 0, 2, 130, 0, 191, 41, 0, 132, 191, 3, 132, 0, 191, 29, 0, 133, 191, 3, 130, 0, 191, 12, 0, 132, 191, 0, 0, 143, 210, 130, 6, 2, 0, 0, 106, 25, 209, 4, 0, 2, 0, 5, 2, 4, 126, 2, 3, 2, 56, 112, 15, 140, 191, 2, 0, 0, 210, 8, 33, 29, 4, 0, 128, 112, 220, 0, 2, 127, 0, 110, 0, 130, 191, 3, 129, 0, 191, 108, 0, 132, 191, 0, 0, 143, 210, 129, 6, 2, 0, 127, 192, 140, 191, 0, 106, 25, 209, 8, 0, 2, 0, 9, 2, 4, 126, 2, 3, 2, 56, 112, 15, 140, 191, 2, 0, 0, 210, 8, 17, 29, 4, 0, 128, 104, 220, 0, 2, 127, 0, 95, 0, 130, 191, 0, 0, 143, 210, 130, 6, 2, 0, 0, 106, 25, 209, 4, 0, 2, 0, 5, 2, 4, 126, 2, 3, 2, 56, 112, 15, 140, 191, 0, 128, 116, 220, 0, 7, 127, 0, 85, 0, 130, 191, 2, 129, 0, 191, 83, 0, 132, 191, 3, 132, 0, 191, 26, 0, 133, 191, 3, 130, 0, 191, 11, 0, 132, 191, 0, 0, 143, 210, 129, 6, 2, 0, 127, 192, 140, 191, 0, 106, 25, 209, 8, 0, 2, 0, 9, 2, 4, 126, 2, 3, 2, 56, 112, 15, 140, 191, 0, 128, 104, 220, 0, 7, 127, 0, 68, 0, 130, 191, 3, 129, 0, 191, 66, 0, 132, 191, 131, 0, 6, 192, 48, 0, 0, 0, 127, 192, 140, 191, 0, 106, 25, 209, 2, 6, 2, 0, 3, 2, 4, 126, 2, 9, 2, 56, 112, 15, 140, 191, 0, 128, 96, 220, 0, 7, 127, 0, 55, 0, 130, 191, 0, 0, 143, 210, 130, 6, 2, 0, 0, 106, 25, 209, 4, 0, 2, 0, 5, 2, 4, 126, 2, 3, 2, 56, 112, 15, 140, 191, 0, 128, 112, 220, 0, 7, 127, 0, 45, 0, 130, 191, 3, 132, 0, 191, 34, 0, 133, 191, 3, 130, 0, 191, 14, 0, 132, 191, 112, 15, 140, 191, 5, 0, 0, 210, 8, 33, 29, 4, 1, 0, 143, 210, 130, 6, 2, 0, 1, 106, 25, 209, 4, 2, 2, 0, 5, 2, 6, 126, 3, 5, 4, 56, 6, 0, 0, 210, 10, 33, 37, 4, 0, 128, 116, 220, 1, 5, 127, 0, 27, 0, 130, 191, 3, 129, 0, 191, 25, 0, 132, 191, 112, 15, 140, 191, 0, 0, 0, 210, 8, 17, 29, 4, 1, 0, 143, 210, 130, 6, 2, 0, 0, 0, 0, 210, 9, 33, 1, 4, 1, 106, 25, 209, 4, 2, 2, 0, 5, 2, 6, 126, 3, 5, 4, 56, 0, 0, 0, 210, 10, 49, 1, 4, 0, 128, 112, 220, 1, 0, 127, 0, 9, 0, 130, 191, 0, 0, 143, 210, 130, 6, 2, 0, 0, 106, 25, 209, 4, 0, 2, 0, 5, 2, 4, 126, 2, 3, 2, 56, 112, 15, 140, 191, 0, 128, 124, 220, 0, 7, 127, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 172, 0, 148, 19, 0, 0, 43, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 19, 0, 19, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 6, 192, 4, 0, 0, 0, 127, 192, 140, 191, 4, 255, 8, 134, 255, 255, 0, 0, 4, 255, 132, 146, 16, 0, 16, 0, 5, 255, 5, 134, 255, 255, 0, 0, 8, 10, 8, 146, 4, 11, 4, 146, 5, 12, 5, 146, 3, 0, 10, 192, 0, 0, 0, 0, 131, 2, 6, 192, 16, 0, 0, 0, 3, 3, 6, 192, 88, 0, 0, 0, 127, 192, 140, 191, 67, 0, 2, 192, 96, 0, 0, 0, 0, 2, 6, 126, 2, 2, 8, 126, 0, 0, 255, 209, 8, 6, 2, 4, 1, 0, 255, 209, 4, 8, 6, 4, 10, 2, 6, 126, 2, 0, 193, 208, 1, 27, 0, 0, 12, 0, 136, 125, 2, 0, 255, 209, 5, 6, 10, 4, 106, 2, 130, 134, 127, 192, 140, 191, 1, 4, 136, 125, 2, 106, 128, 134, 0, 32, 128, 190, 194, 0, 136, 191, 131, 0, 6, 192, 40, 0, 0, 0, 3, 1, 6, 192, 72, 0, 0, 0, 3, 2, 2, 192, 80, 0, 0, 0, 67, 2, 2, 192, 112, 0, 0, 0, 3, 3, 10, 192, 120, 0, 0, 0, 159, 0, 6, 34, 159, 2, 8, 34, 127, 192, 140, 191, 5, 0, 134, 210, 1, 25, 0, 0, 4, 0, 133, 210, 4, 25, 0, 0, 6, 0, 133, 210, 1, 27, 0, 0, 4, 0, 255, 209, 4, 11, 26, 4, 5, 0, 133, 210, 1, 25, 0, 0, 5, 106, 25, 209, 5, 1, 2, 0, 4, 7, 6, 56, 159, 4, 8, 34, 6, 0, 134, 210, 2, 29, 0, 0, 4, 0, 133, 210, 4, 29, 0, 0, 7, 0, 133, 210, 2, 31, 0, 0, 4, 0, 255, 209, 4, 13, 30, 4, 6, 0, 133, 210, 2, 29, 0, 0, 5, 106, 25, 209, 6, 11, 2, 0, 4, 7, 6, 56, 4, 0, 134, 210, 5, 19, 0, 0, 3, 0, 133, 210, 3, 19, 0, 0, 3, 9, 6, 104, 4, 0, 133, 210, 5, 19, 0, 0, 6, 106, 25, 209, 4, 5, 0, 0, 3, 2, 10, 126, 3, 11, 14, 56, 4, 0, 30, 104, 5, 2, 32, 104, 8, 4, 34, 104, 131, 0, 6, 192, 104, 0, 0, 0, 3, 2, 6, 192, 24, 0, 0, 0, 127, 192, 140, 191, 2, 132, 0, 191, 78, 0, 133, 191, 2, 130, 0, 191, 40, 0, 132, 191, 3, 130, 0, 191, 14, 0, 132, 191, 3, 0, 143, 210, 130, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 128, 80, 220, 3, 0, 127, 3, 112, 15, 140, 191, 249, 2, 12, 126, 3, 6, 5, 0, 249, 2, 10, 126, 3, 6, 4, 0, 57, 0, 130, 191, 3, 129, 0, 191, 13, 0, 132, 191, 3, 0, 143, 210, 129, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 128, 72, 220, 3, 0, 127, 3, 112, 15, 140, 191, 136, 6, 12, 32, 249, 2, 10, 126, 3, 6, 0, 0, 42, 0, 130, 191, 3, 0, 143, 210, 130, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 128, 84, 220, 3, 0, 127, 5, 33, 0, 130, 191, 2, 129, 0, 191, 29, 0, 132, 191, 3, 130, 0, 191, 9, 0, 132, 191, 3, 0, 143, 210, 129, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 128, 72, 220, 3, 0, 127, 5, 19, 0, 130, 191, 3, 129, 0, 191, 7, 0, 132, 191, 3, 106, 25, 209, 8, 12, 2, 0, 9, 2, 10, 126, 5, 15, 8, 56, 0, 128, 64, 220, 3, 0, 127, 5, 10, 0, 130, 191, 3, 0, 143, 210, 130, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 128, 80, 220, 3, 0, 127, 5, 1, 0, 130, 191, 2, 2, 10, 126, 3, 2, 12, 126, 5, 2, 16, 126, 4, 2, 14, 126, 46, 0, 130, 191, 3, 129, 0, 191, 18, 0, 132, 191, 3, 0, 143, 210, 130, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 128, 80, 220, 3, 0, 127, 3, 112, 15, 140, 191, 249, 2, 16, 126, 3, 6, 3, 0, 249, 2, 14, 126, 3, 6, 2, 0, 249, 2, 12, 126, 3, 6, 1, 0, 249, 2, 10, 126, 3, 6, 0, 0, 26, 0, 130, 191, 3, 0, 143, 210, 130, 12, 2, 0, 3, 106, 25, 209, 8, 6, 2, 0, 9, 2, 10, 126, 5, 9, 8, 56, 0, 128, 80, 220, 3, 0, 127, 5, 3, 130, 0, 191, 12, 0, 132, 191, 4, 128, 80, 220, 3, 0, 127, 3, 112, 15, 140, 191, 249, 2, 16, 126, 3, 6, 5, 0, 249, 2, 14, 126, 3, 6, 4, 0, 249, 2, 12, 126, 5, 6, 5, 0, 249, 2, 10, 126, 5, 6, 4, 0, 4, 0, 130, 191, 12, 128, 80, 220, 3, 0, 127, 8, 4, 128, 84, 220, 3, 0, 127, 6, 131, 0, 6, 192, 32, 0, 0, 0, 127, 192, 140, 191, 1, 1, 14, 192, 0, 0, 0, 0, 128, 2, 36, 126, 112, 0, 140, 191, 0, 95, 32, 240, 15, 5, 1, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 172, 0, 148, 19, 0, 0, 43, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 11, 0, 11, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 6, 192, 4, 0, 0, 0, 127, 192, 140, 191, 4, 255, 8, 134, 255, 255, 0, 0, 4, 255, 132, 146, 16, 0, 16, 0, 5, 255, 5, 134, 255, 255, 0, 0, 8, 10, 8, 146, 4, 11, 4, 146, 5, 12, 5, 146, 3, 0, 10, 192, 0, 0, 0, 0, 131, 2, 6, 192, 16, 0, 0, 0, 3, 3, 6, 192, 72, 0, 0, 0, 127, 192, 140, 191, 67, 0, 2, 192, 80, 0, 0, 0, 0, 2, 6, 126, 2, 2, 8, 126, 0, 0, 255, 209, 8, 6, 2, 4, 1, 0, 255, 209, 4, 8, 6, 4, 10, 2, 6, 126, 2, 0, 198, 208, 1, 27, 0, 0, 12, 0, 134, 125, 2, 0, 255, 209, 5, 6, 10, 4, 106, 2, 130, 135, 127, 192, 140, 191, 1, 4, 134, 125, 2, 106, 234, 135, 126, 1, 128, 190, 0, 106, 254, 137, 28, 0, 136, 191, 3, 2, 10, 192, 24, 0, 0, 0, 131, 0, 6, 192, 40, 0, 0, 0, 3, 1, 2, 192, 48, 0, 0, 0, 127, 192, 140, 191, 4, 3, 14, 192, 0, 0, 0, 0, 2, 0, 6, 104, 3, 2, 8, 104, 4, 4, 10, 104, 128, 2, 12, 126, 127, 192, 140, 191, 0, 95, 0, 240, 3, 3, 3, 0, 3, 1, 10, 192, 56, 0, 0, 0, 5, 2, 14, 192, 0, 0, 0, 0, 127, 192, 140, 191, 4, 0, 14, 104, 5, 2, 16, 104, 6, 4, 18, 104, 128, 2, 20, 126, 112, 15, 140, 191, 0, 95, 32, 240, 7, 3, 2, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 0, 172, 0, 148, 19, 0, 0, 43, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 21, 0, 21, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 6, 192, 4, 0, 0, 0, 127, 192, 140, 191, 4, 255, 8, 134, 255, 255, 0, 0, 4, 255, 132, 146, 16, 0, 16, 0, 5, 255, 5, 134, 255, 255, 0, 0, 8, 10, 8, 146, 4, 11, 4, 146, 5, 12, 5, 146, 3, 0, 10, 192, 0, 0, 0, 0, 131, 2, 6, 192, 16, 0, 0, 0, 3, 3, 6, 192, 72, 0, 0, 0, 127, 192, 140, 191, 67, 0, 2, 192, 80, 0, 0, 0, 0, 2, 6, 126, 2, 2, 8, 126, 0, 0, 255, 209, 8, 6, 2, 4, 1, 0, 255, 209, 4, 8, 6, 4, 10, 2, 6, 126, 2, 0, 198, 208, 1, 27, 0, 0, 12, 0, 134, 125, 2, 0, 255, 209, 5, 6, 10, 4, 106, 2, 130, 135, 127, 192, 140, 191, 1, 4, 134, 125, 2, 106, 234, 135, 126, 1, 128, 190, 0, 106, 254, 137, 233, 2, 136, 191, 131, 0, 6, 192, 24, 0, 0, 0, 3, 1, 6, 192, 40, 0, 0, 0, 3, 2, 2, 192, 48, 0, 0, 0, 127, 192, 140, 191, 1, 3, 14, 192, 0, 0, 0, 0, 4, 0, 6, 104, 5, 2, 8, 104, 8, 4, 10, 104, 128, 2, 12, 126, 127, 192, 140, 191, 0, 95, 0, 240, 3, 3, 3, 0, 112, 15, 140, 191, 106, 0, 16, 208, 3, 7, 1, 0, 3, 0, 0, 209, 3, 1, 169, 1, 126, 1, 130, 190, 4, 0, 91, 208, 3, 229, 1, 0, 227, 0, 136, 191, 126, 1, 132, 190, 8, 0, 81, 208, 3, 1, 1, 0, 128, 2, 6, 126, 4, 126, 254, 137, 220, 0, 136, 191, 255, 0, 136, 190, 28, 46, 77, 59, 126, 1, 138, 190, 8, 0, 81, 208, 3, 17, 0, 0, 255, 6, 6, 10, 82, 184, 78, 65, 10, 126, 254, 137, 242, 6, 6, 10, 210, 0, 136, 191, 255, 6, 14, 38, 255, 255, 255, 127, 242, 14, 16, 4, 255, 0, 136, 190, 0, 0, 128, 61, 106, 1, 75, 208, 8, 17, 0, 0, 126, 1, 136, 190, 8, 106, 254, 137, 7, 105, 16, 126, 70, 0, 136, 191, 129, 16, 18, 36, 255, 16, 16, 104, 0, 0, 128, 0, 255, 18, 18, 104, 0, 0, 0, 1, 255, 16, 20, 38, 0, 0, 127, 0, 255, 18, 18, 38, 0, 0, 1, 0, 9, 21, 18, 104, 249, 2, 20, 126, 9, 6, 5, 0, 128, 2, 22, 126, 10, 0, 143, 210, 131, 20, 2, 0, 255, 0, 141, 190, 85, 85, 85, 85, 255, 0, 140, 190, 85, 85, 85, 85, 12, 106, 25, 209, 12, 20, 2, 0, 13, 2, 26, 126, 13, 23, 26, 56, 0, 128, 84, 220, 12, 0, 127, 12, 255, 0, 141, 190, 85, 85, 85, 85, 255, 0, 140, 190, 85, 85, 85, 85, 10, 106, 25, 209, 12, 20, 2, 0, 13, 2, 28, 126, 14, 23, 22, 56, 0, 128, 84, 220, 10, 0, 127, 10, 255, 16, 16, 38, 255, 255, 127, 0, 240, 18, 18, 40, 240, 16, 16, 40, 9, 17, 16, 4, 113, 15, 140, 191, 13, 17, 18, 10, 12, 17, 18, 44, 255, 2, 28, 126, 171, 170, 170, 62, 255, 0, 140, 190, 0, 0, 128, 62, 7, 103, 30, 126, 12, 18, 28, 44, 12, 0, 193, 209, 12, 17, 38, 132, 193, 30, 30, 104, 14, 0, 193, 209, 9, 29, 194, 3, 9, 19, 32, 10, 13, 17, 24, 44, 15, 11, 16, 126, 14, 33, 24, 44, 255, 0, 140, 190, 244, 253, 5, 56, 12, 0, 193, 209, 8, 25, 48, 132, 112, 15, 140, 191, 12, 23, 24, 2, 8, 21, 16, 46, 0, 112, 49, 63, 12, 19, 30, 4, 255, 18, 28, 42, 0, 0, 0, 128, 8, 31, 26, 2, 8, 126, 254, 137, 8, 17, 18, 10, 21, 0, 136, 191, 8, 19, 20, 10, 255, 2, 22, 126, 171, 170, 42, 62, 255, 0, 140, 190, 37, 73, 18, 62, 12, 16, 22, 44, 8, 23, 22, 48, 205, 204, 76, 62, 8, 23, 22, 48, 0, 0, 128, 62, 8, 23, 22, 48, 171, 170, 170, 62, 10, 23, 20, 10, 241, 18, 28, 10, 15, 0, 193, 209, 9, 227, 41, 132, 15, 17, 26, 4, 255, 20, 24, 42, 0, 0, 0, 128, 255, 16, 16, 42, 0, 0, 0, 128, 8, 1, 254, 190, 8, 27, 20, 4, 15, 29, 18, 4, 15, 21, 20, 2, 12, 19, 18, 4, 255, 26, 22, 38, 0, 240, 255, 255, 9, 21, 18, 2, 13, 23, 16, 4, 9, 17, 16, 2, 255, 16, 18, 10, 0, 160, 42, 56, 11, 19, 18, 46, 0, 160, 42, 56, 8, 19, 16, 46, 0, 80, 213, 62, 11, 17, 18, 46, 0, 80, 213, 62, 255, 18, 20, 10, 59, 170, 184, 66, 10, 17, 20, 126, 191, 20, 24, 38, 131, 24, 24, 36, 255, 0, 137, 190, 85, 85, 85, 85, 255, 0, 136, 190, 85, 85, 85, 85, 12, 106, 25, 209, 8, 24, 2, 0, 9, 2, 26, 126, 13, 106, 28, 209, 13, 1, 169, 1, 0, 128, 84, 220, 12, 0, 127, 12, 255, 0, 136, 190, 0, 80, 213, 62, 10, 11, 28, 126, 11, 0, 193, 209, 8, 22, 38, 132, 14, 19, 30, 46, 0, 0, 49, 188, 8, 23, 16, 2, 14, 31, 22, 46, 239, 47, 228, 183, 8, 23, 22, 2, 255, 2, 28, 126, 171, 170, 42, 62, 255, 0, 136, 190, 171, 170, 42, 61, 8, 22, 28, 44, 14, 0, 193, 209, 14, 23, 194, 3, 11, 23, 30, 10, 14, 31, 22, 44, 255, 0, 136, 190, 8, 227, 130, 180, 255, 0, 137, 190, 24, 114, 177, 66, 112, 15, 140, 191, 13, 23, 26, 44, 12, 0, 68, 208, 8, 17, 0, 0, 9, 18, 132, 124, 12, 23, 26, 44, 106, 12, 140, 134, 9, 18, 130, 124, 134, 20, 16, 34, 12, 27, 20, 2, 106, 12, 234, 135, 8, 0, 136, 210, 10, 17, 2, 0, 255, 2, 20, 126, 0, 0, 128, 127, 255, 0, 136, 190, 208, 142, 206, 194, 8, 21, 16, 0, 8, 18, 150, 124, 128, 16, 16, 0, 3, 15, 138, 125, 242, 16, 16, 10, 255, 2, 18, 126, 0, 0, 192, 127, 255, 0, 136, 190, 0, 0, 128, 255, 8, 19, 16, 0, 128, 14, 138, 125, 8, 0, 194, 208, 3, 17, 0, 0, 128, 16, 16, 0, 255, 2, 18, 126, 0, 0, 128, 127, 8, 0, 0, 209, 8, 19, 34, 0, 3, 19, 132, 125, 8, 19, 16, 0, 7, 19, 152, 125, 8, 7, 14, 0, 242, 6, 138, 125, 242, 14, 6, 0, 255, 2, 14, 126, 174, 71, 97, 189, 255, 0, 136, 190, 61, 10, 135, 63, 3, 0, 193, 209, 3, 17, 28, 4, 4, 1, 254, 190, 2, 126, 254, 137, 242, 2, 6, 126, 2, 1, 254, 190, 106, 0, 16, 208, 4, 7, 1, 0, 4, 0, 0, 209, 4, 1, 169, 1, 242, 8, 156, 124, 2, 106, 254, 134, 227, 0, 136, 191, 126, 1, 132, 190, 8, 0, 81, 208, 4, 1, 1, 0, 128, 2, 8, 126, 4, 126, 254, 137, 220, 0, 136, 191, 255, 0, 136, 190, 28, 46, 77, 59, 126, 1, 138, 190, 8, 0, 81, 208, 4, 17, 0, 0, 255, 8, 8, 10, 82, 184, 78, 65, 10, 126, 254, 137, 242, 8, 8, 10, 210, 0, 136, 191, 255, 8, 14, 38, 255, 255, 255, 127, 242, 14, 16, 4, 255, 0, 136, 190, 0, 0, 128, 61, 106, 1, 75, 208, 8, 17, 0, 0, 126, 1, 136, 190, 8, 106, 254, 137, 7, 105, 16, 126, 70, 0, 136, 191, 129, 16, 18, 36, 255, 16, 16, 104, 0, 0, 128, 0, 255, 18, 18, 104, 0, 0, 0, 1, 255, 16, 20, 38, 0, 0, 127, 0, 255, 18, 18, 38, 0, 0, 1, 0, 9, 21, 18, 104, 249, 2, 20, 126, 9, 6, 5, 0, 128, 2, 22, 126, 10, 0, 143, 210, 131, 20, 2, 0, 255, 0, 141, 190, 85, 85, 85, 85, 255, 0, 140, 190, 85, 85, 85, 85, 12, 106, 25, 209, 12, 20, 2, 0, 13, 2, 26, 126, 13, 23, 26, 56, 0, 128, 84, 220, 12, 0, 127, 12, 255, 0, 141, 190, 85, 85, 85, 85, 255, 0, 140, 190, 85, 85, 85, 85, 10, 106, 25, 209, 12, 20, 2, 0, 13, 2, 28, 126, 14, 23, 22, 56, 0, 128, 84, 220, 10, 0, 127, 10, 255, 16, 16, 38, 255, 255, 127, 0, 240, 18, 18, 40, 240, 16, 16, 40, 9, 17, 16, 4, 113, 15, 140, 191, 13, 17, 18, 10, 12, 17, 18, 44, 255, 2, 28, 126, 171, 170, 170, 62, 255, 0, 140, 190, 0, 0, 128, 62, 7, 103, 30, 126, 12, 18, 28, 44, 12, 0, 193, 209, 12, 17, 38, 132, 193, 30, 30, 104, 14, 0, 193, 209, 9, 29, 194, 3, 9, 19, 32, 10, 13, 17, 24, 44, 15, 11, 16, 126, 14, 33, 24, 44, 255, 0, 140, 190, 244, 253, 5, 56, 12, 0, 193, 209, 8, 25, 48, 132, 112, 15, 140, 191, 12, 23, 24, 2, 8, 21, 16, 46, 0, 112, 49, 63, 12, 19, 30, 4, 255, 18, 28, 42, 0, 0, 0, 128, 8, 31, 26, 2, 8, 126, 254, 137, 8, 17, 18, 10, 21, 0, 136, 191, 8, 19, 20, 10, 255, 2, 22, 126, 171, 170, 42, 62, 255, 0, 140, 190, 37, 73, 18, 62, 12, 16, 22, 44, 8, 23, 22, 48, 205, 204, 76, 62, 8, 23, 22, 48, 0, 0, 128, 62, 8, 23, 22, 48, 171, 170, 170, 62, 10, 23, 20, 10, 241, 18, 28, 10, 15, 0, 193, 209, 9, 227, 41, 132, 15, 17, 26, 4, 255, 20, 24, 42, 0, 0, 0, 128, 255, 16, 16, 42, 0, 0, 0, 128, 8, 1, 254, 190, 8, 27, 20, 4, 15, 29, 18, 4, 15, 21, 20, 2, 12, 19, 18, 4, 255, 26, 22, 38, 0, 240, 255, 255, 9, 21, 18, 2, 13, 23, 16, 4, 9, 17, 16, 2, 255, 16, 18, 10, 0, 160, 42, 56, 11, 19, 18, 46, 0, 160, 42, 56, 8, 19, 16, 46, 0, 80, 213, 62, 11, 17, 18, 46, 0, 80, 213, 62, 255, 18, 20, 10, 59, 170, 184, 66, 10, 17, 20, 126, 191, 20, 24, 38, 131, 24, 24, 36, 255, 0, 137, 190, 85, 85, 85, 85, 255, 0, 136, 190, 85, 85, 85, 85, 12, 106, 25, 209, 8, 24, 2, 0, 9, 2, 26, 126, 13, 106, 28, 209, 13, 1, 169, 1, 0, 128, 84, 220, 12, 0, 127, 12, 255, 0, 136, 190, 0, 80, 213, 62, 10, 11, 28, 126, 11, 0, 193, 209, 8, 22, 38, 132, 14, 19, 30, 46, 0, 0, 49, 188, 8, 23, 16, 2, 14, 31, 22, 46, 239, 47, 228, 183, 8, 23, 22, 2, 255, 2, 28, 126, 171, 170, 42, 62, 255, 0, 136, 190, 171, 170, 42, 61, 8, 22, 28, 44, 14, 0, 193, 209, 14, 23, 194, 3, 11, 23, 30, 10, 14, 31, 22, 44, 255, 0, 136, 190, 8, 227, 130, 180, 255, 0, 137, 190, 24, 114, 177, 66, 112, 15, 140, 191, 13, 23, 26, 44, 12, 0, 68, 208, 8, 17, 0, 0, 9, 18, 132, 124, 12, 23, 26, 44, 106, 12, 140, 134, 9, 18, 130, 124, 134, 20, 16, 34, 12, 27, 20, 2, 106, 12, 234, 135, 8, 0, 136, 210, 10, 17, 2, 0, 255, 2, 20, 126, 0, 0, 128, 127, 255, 0, 136, 190, 208, 142, 206, 194, 8, 21, 16, 0, 8, 18, 150, 124, 128, 16, 16, 0, 4, 15, 138, 125, 242, 16, 16, 10, 255, 2, 18, 126, 0, 0, 192, 127, 255, 0, 136, 190, 0, 0, 128, 255, 8, 19, 16, 0, 128, 14, 138, 125, 8, 0, 194, 208, 4, 17, 0, 0, 128, 16, 16, 0, 255, 2, 18, 126, 0, 0, 128, 127, 8, 0, 0, 209, 8, 19, 34, 0, 4, 19, 132, 125, 8, 19, 16, 0, 7, 19, 152, 125, 8, 9, 14, 0, 242, 8, 138, 125, 242, 14, 8, 0, 255, 2, 14, 126, 174, 71, 97, 189, 255, 0, 136, 190, 61, 10, 135, 63, 4, 0, 193, 209, 4, 17, 28, 4, 4, 1, 254, 190, 2, 126, 254, 137, 242, 2, 8, 126, 2, 1, 254, 190, 3, 2, 10, 192, 56, 0, 0, 0, 106, 0, 16, 208, 5, 7, 1, 0, 5, 0, 0, 209, 5, 1, 169, 1, 127, 192, 140, 191, 8, 0, 34, 104, 9, 2, 36, 104, 10, 4, 38, 104, 126, 1, 130, 190, 4, 0, 91, 208, 5, 229, 1, 0, 227, 0, 136, 191, 126, 1, 132, 190, 8, 0, 81, 208, 5, 1, 1, 0, 128, 2, 10, 126, 4, 126, 254, 137, 220, 0, 136, 191, 255, 0, 136, 190, 28, 46, 77, 59, 126, 1, 138, 190, 8, 0, 81, 208, 5, 17, 0, 0, 255, 10, 10, 10, 82, 184, 78, 65, 10, 126, 254, 137, 242, 10, 10, 10, 210, 0, 136, 191, 255, 10, 14, 38, 255, 255, 255, 127, 242, 14, 16, 4, 255, 0, 136, 190, 0, 0, 128, 61, 106, 1, 75, 208, 8, 17, 0, 0, 126, 1, 136, 190, 8, 106, 254, 137, 7, 105, 16, 126, 70, 0, 136, 191, 129, 16, 18, 36, 255, 16, 16, 104, 0, 0, 128, 0, 255, 18, 18, 104, 0, 0, 0, 1, 255, 16, 20, 38, 0, 0, 127, 0, 255, 18, 18, 38, 0, 0, 1, 0, 9, 21, 18, 104, 249, 2, 20, 126, 9, 6, 5, 0, 128, 2, 22, 126, 10, 0, 143, 210, 131, 20, 2, 0, 255, 0, 141, 190, 85, 85, 85, 85, 255, 0, 140, 190, 85, 85, 85, 85, 12, 106, 25, 209, 12, 20, 2, 0, 13, 2, 26, 126, 13, 23, 26, 56, 0, 128, 84, 220, 12, 0, 127, 12, 255, 0, 141, 190, 85, 85, 85, 85, 255, 0, 140, 190, 85, 85, 85, 85, 10, 106, 25, 209, 12, 20, 2, 0, 13, 2, 28, 126, 14, 23, 22, 56, 0, 128, 84, 220, 10, 0, 127, 10, 255, 16, 16, 38, 255, 255, 127, 0, 240, 18, 18, 40, 240, 16, 16, 40, 9, 17, 16, 4, 113, 15, 140, 191, 13, 17, 18, 10, 12, 17, 18, 44, 255, 2, 28, 126, 171, 170, 170, 62, 255, 0, 140, 190, 0, 0, 128, 62, 7, 103, 30, 126, 12, 18, 28, 44, 12, 0, 193, 209, 12, 17, 38, 132, 193, 30, 30, 104, 14, 0, 193, 209, 9, 29, 194, 3, 9, 19, 32, 10, 13, 17, 24, 44, 15, 11, 16, 126, 14, 33, 24, 44, 255, 0, 140, 190, 244, 253, 5, 56, 12, 0, 193, 209, 8, 25, 48, 132, 112, 15, 140, 191, 12, 23, 24, 2, 8, 21, 16, 46, 0, 112, 49, 63, 12, 19, 26, 4, 255, 18, 28, 42, 0, 0, 0, 128, 8, 27, 30, 2, 8, 126, 254, 137, 8, 17, 18, 10, 21, 0, 136, 191, 8, 19, 20, 10, 255, 2, 22, 126, 171, 170, 42, 62, 255, 0, 140, 190, 37, 73, 18, 62, 12, 16, 22, 44, 8, 23, 22, 48, 205, 204, 76, 62, 8, 23, 22, 48, 0, 0, 128, 62, 8, 23, 22, 48, 171, 170, 170, 62, 10, 23, 20, 10, 241, 18, 28, 10, 13, 0, 193, 209, 9, 227, 41, 132, 13, 17, 30, 4, 255, 20, 24, 42, 0, 0, 0, 128, 255, 16, 16, 42, 0, 0, 0, 128, 8, 1, 254, 190, 8, 31, 16, 4, 13, 29, 20, 4, 13, 17, 16, 2, 12, 21, 18, 4, 255, 30, 20, 38, 0, 240, 255, 255, 9, 17, 16, 2, 15, 21, 18, 4, 8, 19, 16, 2, 255, 16, 18, 10, 0, 160, 42, 56, 10, 19, 18, 46, 0, 160, 42, 56, 8, 19, 16, 46, 0, 80, 213, 62, 10, 17, 18, 46, 0, 80, 213, 62, 255, 18, 22, 10, 59, 170, 184, 66, 11, 17, 22, 126, 191, 22, 24, 38, 131, 24, 24, 36, 255, 0, 137, 190, 85, 85, 85, 85, 255, 0, 136, 190, 85, 85, 85, 85, 12, 106, 25, 209, 8, 24, 2, 0, 9, 2, 26, 126, 13, 106, 28, 209, 13, 1, 169, 1, 0, 128, 84, 220, 12, 0, 127, 12, 255, 0, 136, 190, 0, 80, 213, 62, 11, 11, 28, 126, 10, 0, 193, 209, 8, 20, 38, 132, 14, 19, 30, 46, 0, 0, 49, 188, 8, 21, 16, 2, 14, 31, 20, 46, 239, 47, 228, 183, 8, 21, 20, 2, 255, 2, 28, 126, 171, 170, 42, 62, 255, 0, 136, 190, 171, 170, 42, 61, 8, 20, 28, 44, 14, 0, 193, 209, 14, 21, 194, 3, 10, 21, 30, 10, 14, 31, 20, 44, 255, 0, 136, 190, 8, 227, 130, 180, 255, 0, 137, 190, 24, 114, 177, 66, 112, 15, 140, 191, 13, 21, 26, 44, 12, 0, 68, 208, 8, 17, 0, 0, 9, 18, 132, 124, 12, 21, 26, 44, 106, 12, 140, 134, 9, 18, 130, 124, 134, 22, 16, 34, 12, 27, 20, 2, 106, 12, 234, 135, 8, 0, 136, 210, 10, 17, 2, 0, 255, 2, 20, 126, 0, 0, 128, 127, 255, 0, 136, 190, 208, 142, 206, 194, 8, 21, 16, 0, 8, 18, 150, 124, 128, 16, 16, 0, 5, 15, 138, 125, 242, 16, 16, 10, 255, 2, 18, 126, 0, 0, 192, 127, 255, 0, 136, 190, 0, 0, 128, 255, 8, 19, 16, 0, 128, 14, 138, 125, 8, 0, 194, 208, 5, 17, 0, 0, 128, 16, 16, 0, 255, 2, 18, 126, 0, 0, 128, 127, 8, 0, 0, 209, 8, 19, 34, 0, 5, 19, 132, 125, 8, 19, 16, 0, 7, 19, 152, 125, 8, 11, 14, 0, 242, 10, 138, 125, 242, 14, 10, 0, 255, 2, 14, 126, 174, 71, 97, 189, 255, 0, 136, 190, 61, 10, 135, 63, 5, 0, 193, 209, 5, 17, 28, 4, 4, 1, 254, 190, 2, 126, 254, 137, 242, 2, 10, 126, 2, 1, 254, 190, 131, 0, 6, 192, 32, 0, 0, 0, 127, 192, 140, 191, 1, 1, 14, 192, 0, 0, 0, 0, 128, 2, 40, 126, 127, 192, 140, 191, 0, 95, 32, 240, 17, 3, 1, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 172, 0, 148, 19, 0, 0, 43, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 11, 0, 11, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 6, 192, 4, 0, 0, 0, 127, 192, 140, 191, 4, 255, 8, 134, 255, 255, 0, 0, 4, 255, 132, 146, 16, 0, 16, 0, 5, 255, 5, 134, 255, 255, 0, 0, 8, 10, 8, 146, 4, 11, 4, 146, 5, 12, 5, 146, 3, 0, 10, 192, 0, 0, 0, 0, 131, 2, 6, 192, 16, 0, 0, 0, 3, 3, 6, 192, 72, 0, 0, 0, 127, 192, 140, 191, 67, 0, 2, 192, 80, 0, 0, 0, 0, 2, 6, 126, 2, 2, 8, 126, 0, 0, 255, 209, 8, 6, 2, 4, 1, 0, 255, 209, 4, 8, 6, 4, 10, 2, 6, 126, 2, 0, 198, 208, 1, 27, 0, 0, 12, 0, 134, 125, 2, 0, 255, 209, 5, 6, 10, 4, 106, 2, 130, 135, 127, 192, 140, 191, 1, 4, 134, 125, 2, 106, 234, 135, 126, 1, 128, 190, 0, 106, 254, 137, 28, 0, 136, 191, 3, 2, 10, 192, 24, 0, 0, 0, 131, 0, 6, 192, 40, 0, 0, 0, 3, 1, 2, 192, 48, 0, 0, 0, 127, 192, 140, 191, 4, 3, 14, 192, 0, 0, 0, 0, 2, 0, 6, 104, 3, 2, 8, 104, 4, 4, 10, 104, 128, 2, 12, 126, 127, 192, 140, 191, 0, 95, 0, 240, 3, 3, 3, 0, 3, 1, 10, 192, 56, 0, 0, 0, 5, 2, 14, 192, 0, 0, 0, 0, 127, 192, 140, 191, 4, 0, 14, 104, 5, 2, 16, 104, 6, 4, 18, 104, 128, 2, 20, 126, 112, 15, 140, 191, 0, 95, 32, 240, 7, 3, 2, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 172, 0, 148, 0, 0, 0, 43, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 5, 0, 5, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 192, 4, 0, 0, 0, 127, 192, 140, 191, 4, 255, 4, 134, 255, 255, 0, 0, 4, 10, 4, 146, 3, 0, 6, 192, 0, 0, 0, 0, 127, 192, 140, 191, 67, 0, 2, 192, 72, 0, 0, 0, 0, 2, 2, 126, 0, 0, 255, 209, 4, 2, 2, 4, 126, 1, 130, 190, 127, 192, 140, 191, 0, 0, 209, 208, 0, 3, 0, 0, 20, 0, 136, 191, 3, 2, 10, 192, 24, 0, 0, 0, 3, 0, 2, 192, 40, 0, 0, 0, 127, 192, 140, 191, 4, 3, 10, 192, 0, 0, 0, 0, 0, 0, 2, 104, 127, 192, 140, 191, 0, 32, 12, 224, 1, 1, 3, 128, 3, 0, 2, 192, 56, 0, 0, 0, 5, 1, 10, 192, 0, 0, 0, 0, 127, 192, 140, 191, 0, 0, 0, 104, 112, 15, 140, 191, 0, 32, 28, 224, 0, 1, 1, 128, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 172, 0, 148, 19, 0, 0, 43, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 13, 0, 13, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 6, 192, 4, 0, 0, 0, 127, 192, 140, 191, 4, 255, 8, 134, 255, 255, 0, 0, 4, 255, 132, 146, 16, 0, 16, 0, 5, 255, 5, 134, 255, 255, 0, 0, 8, 10, 8, 146, 4, 11, 4, 146, 5, 12, 5, 146, 3, 0, 6, 192, 0, 0, 0, 0, 127, 192, 140, 191, 67, 0, 2, 192, 72, 0, 0, 0, 0, 2, 6, 126, 0, 0, 255, 209, 8, 6, 2, 4, 126, 1, 130, 190, 127, 192, 140, 191, 0, 0, 209, 208, 0, 3, 0, 0, 29, 0, 136, 191, 3, 2, 14, 192, 8, 0, 0, 0, 3, 0, 2, 192, 40, 0, 0, 0, 127, 192, 140, 191, 6, 4, 10, 192, 0, 0, 0, 0, 0, 0, 6, 104, 127, 192, 140, 191, 0, 32, 12, 224, 3, 3, 4, 128, 3, 4, 10, 192, 56, 0, 0, 0, 7, 5, 14, 192, 0, 0, 0, 0, 5, 10, 0, 128, 127, 192, 140, 191, 18, 2, 14, 126, 4, 8, 1, 128, 17, 2, 16, 126, 16, 0, 18, 104, 11, 0, 255, 209, 0, 14, 10, 4, 10, 0, 255, 209, 1, 16, 6, 4, 128, 2, 24, 126, 112, 15, 140, 191, 0, 95, 32, 240, 9, 3, 5, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 172, 0, 148, 19, 0, 0, 43, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 9, 0, 9, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 6, 192, 4, 0, 0, 0, 127, 192, 140, 191, 4, 255, 8, 134, 255, 255, 0, 0, 4, 255, 132, 146, 16, 0, 16, 0, 5, 255, 5, 134, 255, 255, 0, 0, 8, 10, 8, 146, 4, 11, 4, 146, 5, 12, 5, 146, 3, 0, 6, 192, 0, 0, 0, 0, 127, 192, 140, 191, 67, 0, 2, 192, 72, 0, 0, 0, 0, 2, 6, 126, 0, 0, 255, 209, 8, 6, 2, 4, 126, 1, 130, 190, 127, 192, 140, 191, 0, 0, 209, 208, 0, 3, 0, 0, 31, 0, 136, 191, 3, 2, 14, 192, 8, 0, 0, 0, 3, 0, 6, 192, 40, 0, 0, 0, 127, 192, 140, 191, 67, 2, 2, 192, 48, 0, 0, 0, 6, 4, 14, 192, 0, 0, 0, 0, 5, 10, 5, 128, 127, 192, 140, 191, 9, 2, 6, 126, 4, 8, 4, 128, 1, 2, 8, 126, 0, 0, 10, 104, 7, 0, 255, 209, 5, 6, 10, 4, 6, 0, 255, 209, 4, 8, 6, 4, 128, 2, 16, 126, 0, 95, 0, 240, 5, 1, 4, 0, 3, 0, 2, 192, 56, 0, 0, 0, 7, 1, 10, 192, 0, 0, 0, 0, 127, 192, 140, 191, 0, 0, 0, 104, 112, 15, 140, 191, 0, 32, 28, 224, 0, 1, 1, 128, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 172, 0, 148, 19, 0, 0, 43, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 11, 0, 11, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 6, 192, 4, 0, 0, 0, 127, 192, 140, 191, 4, 255, 8, 134, 255, 255, 0, 0, 4, 255, 132, 146, 16, 0, 16, 0, 5, 255, 5, 134, 255, 255, 0, 0, 8, 10, 8, 146, 4, 11, 4, 146, 5, 12, 5, 146, 3, 0, 10, 192, 0, 0, 0, 0, 131, 2, 6, 192, 16, 0, 0, 0, 3, 3, 6, 192, 96, 0, 0, 0, 127, 192, 140, 191, 67, 0, 2, 192, 104, 0, 0, 0, 0, 2, 6, 126, 2, 2, 8, 126, 0, 0, 255, 209, 8, 6, 2, 4, 1, 0, 255, 209, 4, 8, 6, 4, 10, 2, 6, 126, 2, 0, 193, 208, 1, 27, 0, 0, 12, 0, 136, 125, 2, 0, 255, 209, 5, 6, 10, 4, 106, 2, 130, 134, 127, 192, 140, 191, 1, 4, 136, 125, 2, 106, 128, 134, 0, 32, 128, 190, 55, 0, 136, 191, 3, 2, 10, 192, 80, 0, 0, 0, 127, 192, 140, 191, 8, 0, 14, 104, 9, 2, 16, 104, 10, 4, 18, 104, 131, 0, 2, 192, 112, 0, 0, 0, 3, 1, 6, 192, 24, 0, 0, 0, 127, 192, 140, 191, 2, 130, 0, 191, 30, 0, 133, 191, 2, 129, 0, 191, 13, 0, 132, 191, 3, 2, 10, 192, 48, 0, 0, 0, 2, 3, 14, 192, 0, 0, 0, 0, 127, 192, 140, 191, 8, 2, 0, 126, 9, 2, 2, 126, 10, 2, 4, 126, 11, 2, 6, 126, 128, 2, 20, 126, 0, 95, 32, 240, 7, 0, 3, 0, 27, 0, 130, 191, 2, 128, 0, 191, 25, 0, 132, 191, 3, 2, 10, 192, 32, 0, 0, 0, 2, 3, 14, 192, 0, 0, 0, 0, 127, 192, 140, 191, 8, 2, 0, 126, 9, 2, 2, 126, 10, 2, 4, 126, 11, 2, 6, 126, 128, 2, 20, 126, 0, 95, 32, 240, 7, 0, 3, 0, 12, 0, 130, 191, 3, 2, 10, 192, 64, 0, 0, 0, 2, 3, 14, 192, 0, 0, 0, 0, 127, 192, 140, 191, 8, 2, 0, 126, 9, 2, 2, 126, 10, 2, 4, 126, 11, 2, 6, 126, 128, 2, 20, 126, 0, 95, 32, 240, 7, 0, 3, 0, 0, 0, 129, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 172, 0, 148, 0, 0, 0, 43, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 5, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 192, 4, 0, 0, 0, 127, 192, 140, 191, 4, 255, 4, 134, 255, 255, 0, 0, 4, 10, 4, 146, 3, 0, 6, 192, 0, 0, 0, 0, 127, 192, 140, 191, 67, 0, 2, 192, 96, 0, 0, 0, 0, 2, 2, 126, 0, 0, 255, 209, 4, 2, 2, 4, 126, 1, 130, 190, 127, 192, 140, 191, 0, 0, 209, 208, 0, 3, 0, 0, 50, 0, 136, 191, 3, 0, 2, 192, 80, 0, 0, 0, 127, 192, 140, 191, 0, 0, 0, 104, 3, 0, 2, 192, 112, 0, 0, 0, 3, 1, 6, 192, 24, 0, 0, 0, 127, 192, 140, 191, 0, 130, 0, 191, 28, 0, 133, 191, 0, 129, 0, 191, 12, 0, 132, 191, 3, 2, 10, 192, 48, 0, 0, 0, 2, 1, 10, 192, 0, 0, 0, 0, 127, 192, 140, 191, 8, 2, 2, 126, 9, 2, 4, 126, 10, 2, 6, 126, 11, 2, 8, 126, 0, 32, 28, 224, 0, 1, 1, 128, 25, 0, 130, 191, 0, 128, 0, 191, 23, 0, 132, 191, 3, 2, 10, 192, 32, 0, 0, 0, 2, 1, 10, 192, 0, 0, 0, 0, 127, 192, 140, 191, 8, 2, 2, 126, 9, 2, 4, 126, 10, 2, 6, 126, 11, 2, 8, 126, 0, 32, 28, 224, 0, 1, 1, 128, 11, 0, 130, 191, 3, 2, 10, 192, 64, 0, 0, 0, 2, 1, 10, 192, 0, 0, 0, 0, 127, 192, 140, 191, 8, 2, 2, 126, 9, 2, 4, 126, 10, 2, 6, 126, 11, 2, 8, 126, 0, 32, 28, 224, 0, 1, 1, 128, 0, 0, 129, 191, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 1, 0, 4, 0, 8, 2, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 1, 0, 4, 0, 16, 6, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 26, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 4, 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 26, 0, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 168, 4, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 26, 0, 5, 0, 0, 10, 0, 0, 0, 0, 0, 0, 20, 2, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 26, 0, 5, 0, 0, 13, 0, 0, 0, 0, 0, 0, 72, 13, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 26, 0, 5, 0, 0, 27, 0, 0, 0, 0, 0, 0, 20, 2, 0, 0, 0, 0, 0, 0, 33, 1, 0, 0, 26, 0, 5, 0, 0, 30, 0, 0, 0, 0, 0, 0, 160, 1, 0, 0, 0, 0, 0, 0, 58, 1, 0, 0, 26, 0, 5, 0, 0, 32, 0, 0, 0, 0, 0, 0, 220, 1, 0, 0, 0, 0, 0, 0, 90, 1, 0, 0, 26, 0, 5, 0, 0, 34, 0, 0, 0, 0, 0, 0, 228, 1, 0, 0, 0, 0, 0, 0, 122, 1, 0, 0, 26, 0, 5, 0, 0, 36, 0, 0, 0, 0, 0, 0, 124, 2, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 26, 0, 5, 0, 0, 39, 0, 0, 0, 0, 0, 0, 24, 2, 0, 0, 0, 0, 0, 0, 170, 1, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 1, 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 15, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 15, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 17, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 17, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 19, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 19, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 19, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 19, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 20, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 23, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 23, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 23, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 23, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 24, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 24, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 3, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 2, 0, 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 3, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 3, 0, 0, 0, 0, 0, 0, 24, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 1, 0, 0, 0, 7, 0, 192, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 24, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 55, 0, 0, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 56, 0, 0, 0, 0, 0, 0, 176, 1, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0}; +} +} diff --git a/runtime/hsa-runtime/image/blit_src/CMakeLists.txt b/runtime/hsa-runtime/image/blit_src/CMakeLists.txt index 9318a7ae66..f2e025f172 100644 --- a/runtime/hsa-runtime/image/blit_src/CMakeLists.txt +++ b/runtime/hsa-runtime/image/blit_src/CMakeLists.txt @@ -31,7 +31,7 @@ cmake_minimum_required(VERSION 3.5.0) # ## Include the cmake_modules utils.cmake -list ( APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../../opensrc/hsa-runtime/cmake_modules" ) +list ( APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../cmake_modules" ) include ( utils ) # Flag to abort before executing after default initialization of cache variables @@ -45,7 +45,6 @@ foreach(ITEM IN LISTS FOLDERS) list (APPEND LLVM_SEARCH_PATHS "${LLVM_SEARCH_ROOT}/${ITEM}/include/") endforeach() - if (NOT DEFINED OPENCL_VER) set (OPENCL_VER "2.0") endif() diff --git a/runtime/hsa-runtime/image/blit_src/create_hsaco_ascii_file.sh b/runtime/hsa-runtime/image/blit_src/create_hsaco_ascii_file.sh index d594b56093..647fbb492d 100755 --- a/runtime/hsa-runtime/image/blit_src/create_hsaco_ascii_file.sh +++ b/runtime/hsa-runtime/image/blit_src/create_hsaco_ascii_file.sh @@ -16,6 +16,9 @@ cat < "$opencl_blit_file.tmp" # Move the file atomically into place, so make doesn't get half a file diff --git a/runtime/hsa-runtime/image/device_info.cpp b/runtime/hsa-runtime/image/device_info.cpp index d936f68957..9b74242a17 100755 --- a/runtime/hsa-runtime/image/device_info.cpp +++ b/runtime/hsa-runtime/image/device_info.cpp @@ -19,13 +19,15 @@ // year of creation of the work. #include - #include -#include "inc/hsa.h" +#include "core/inc/hsa_internal.h" #include "device_info.h" #include "addrlib/src/amdgpu_asic_addr.h" +namespace rocr { +namespace image { + uint32_t MajorVerFromDevID(uint32_t dev_id) { return dev_id/100; } @@ -42,9 +44,8 @@ hsa_status_t GetGPUAsicID(hsa_agent_t agent, uint32_t *chip_id) { char asic_name[64]; assert(chip_id != nullptr); - hsa_status_t status = hsa_agent_get_info( - agent, static_cast(HSA_AGENT_INFO_NAME), - &asic_name); + hsa_status_t status = HSA::hsa_agent_get_info( + agent, static_cast(HSA_AGENT_INFO_NAME), &asic_name); assert(status == HSA_STATUS_SUCCESS); if (status != HSA_STATUS_SUCCESS) { @@ -179,3 +180,6 @@ uint32_t DevIDToAddrLibFamily(uint32_t dev_id) { assert(0); // We should have already returned } + +} // namespace image +} // namespace rocr diff --git a/runtime/hsa-runtime/image/device_info.h b/runtime/hsa-runtime/image/device_info.h index be40122699..7c78fdaffc 100755 --- a/runtime/hsa-runtime/image/device_info.h +++ b/runtime/hsa-runtime/image/device_info.h @@ -22,18 +22,16 @@ #include "stdint.h" #include "inc/hsa.h" -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus +namespace rocr { +namespace image { uint32_t MajorVerFromDevID(uint32_t dev_id); uint32_t MinorVerFromDevID(uint32_t dev_id); uint32_t StepFromDevID(uint32_t dev_id); uint32_t DevIDToAddrLibFamily(uint32_t dev_id); - hsa_status_t GetGPUAsicID(hsa_agent_t agent, uint32_t *chip_id); -#ifdef __cplusplus -} -#endif // __cplusplus + +} // namespace image +} // namespace rocr #endif // HSA_RUNTIME_CORE_INC_DEVICE_INFO_H_ diff --git a/runtime/hsa-runtime/image/hsa_ext_image.cpp b/runtime/hsa-runtime/image/hsa_ext_image.cpp index a3a04b668e..80a5f9c478 100644 --- a/runtime/hsa-runtime/image/hsa_ext_image.cpp +++ b/runtime/hsa-runtime/image/hsa_ext_image.cpp @@ -1,18 +1,18 @@ -#include "inc/hsa.h" -#include "inc/hsa_ext_amd.h" -#include "inc/hsa_ext_image.h" #include "image_runtime.h" +#include "image/inc/hsa_ext_image_impl.h" -#undef HSA_API -#define HSA_API HSA_API_EXPORT +namespace rocr { +namespace image { //---------------------------------------------------------------------------// // Utilty routines //---------------------------------------------------------------------------// -static void enforceDefaultPitch(hsa_agent_t agent, const hsa_ext_image_descriptor_t* image_descriptor, size_t& image_data_row_pitch, size_t& image_data_slice_pitch) { +static void enforceDefaultPitch(hsa_agent_t agent, + const hsa_ext_image_descriptor_t* image_descriptor, + size_t& image_data_row_pitch, size_t& image_data_slice_pitch) { // Set default pitch if (image_data_row_pitch == 0) { - auto manager = ext_image::ImageRuntime::instance()->image_manager(agent); + auto manager = ImageRuntime::instance()->image_manager(agent); assert((manager != nullptr) && "Image manager should already exit."); image_data_row_pitch = image_descriptor->width * manager->GetImageProperty(agent, image_descriptor->format, image_descriptor->geometry) @@ -41,13 +41,11 @@ static void enforceDefaultPitch(hsa_agent_t agent, const hsa_ext_image_descripto } //---------------------------------------------------------------------------// -// Image APIs +// APIs that implement Image functionality //---------------------------------------------------------------------------// -extern "C" { - -hsa_status_t HSA_API hsa_amd_image_get_info_max_dim_impl(hsa_agent_t agent, - hsa_agent_info_t attribute, - void* value) { + +hsa_status_t hsa_amd_image_get_info_max_dim(hsa_agent_t agent, hsa_agent_info_t attribute, + void* value) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } @@ -56,15 +54,13 @@ hsa_status_t HSA_API hsa_amd_image_get_info_max_dim_impl(hsa_agent_t agent, return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - return ext_image::ImageRuntime::instance()->GetImageInfoMaxDimension( - agent, attribute, value); + return ImageRuntime::instance()->GetImageInfoMaxDimension(agent, attribute, value); } -hsa_status_t HSA_API - hsa_ext_image_get_capability_impl(hsa_agent_t agent, - hsa_ext_image_geometry_t image_geometry, - const hsa_ext_image_format_t* image_format, - uint32_t* capability_mask) { +hsa_status_t hsa_ext_image_get_capability(hsa_agent_t agent, + hsa_ext_image_geometry_t image_geometry, + const hsa_ext_image_format_t* image_format, + uint32_t* capability_mask) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } @@ -75,14 +71,14 @@ hsa_status_t HSA_API return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - return ext_image::ImageRuntime::instance()->GetImageCapability( - agent, *image_format, image_geometry, *capability_mask); + return ImageRuntime::instance()->GetImageCapability(agent, *image_format, image_geometry, + *capability_mask); } -hsa_status_t HSA_API hsa_ext_image_data_get_info_impl( - hsa_agent_t agent, const hsa_ext_image_descriptor_t* image_descriptor, - hsa_access_permission_t access_permission, - hsa_ext_image_data_info_t* image_data_info) { +hsa_status_t hsa_ext_image_data_get_info(hsa_agent_t agent, + const hsa_ext_image_descriptor_t* image_descriptor, + hsa_access_permission_t access_permission, + hsa_ext_image_data_info_t* image_data_info) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } @@ -93,16 +89,14 @@ hsa_status_t HSA_API hsa_ext_image_data_get_info_impl( return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - return ext_image::ImageRuntime::instance()->GetImageSizeAndAlignment( + return ImageRuntime::instance()->GetImageSizeAndAlignment( agent, *image_descriptor, HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE, 0, 0, *image_data_info); } -hsa_status_t HSA_API - hsa_ext_image_create_impl(hsa_agent_t agent, - const hsa_ext_image_descriptor_t* image_descriptor, - const void* image_data, - hsa_access_permission_t access_permission, - hsa_ext_image_t* image) { +hsa_status_t hsa_ext_image_create(hsa_agent_t agent, + const hsa_ext_image_descriptor_t* image_descriptor, + const void* image_data, hsa_access_permission_t access_permission, + hsa_ext_image_t* image) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } @@ -111,24 +105,22 @@ hsa_status_t HSA_API return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - return ext_image::ImageRuntime::instance()->CreateImageHandle( - agent, *image_descriptor, image_data, access_permission, - HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE, 0, 0, *image); + return ImageRuntime::instance()->CreateImageHandle( + agent, *image_descriptor, image_data, access_permission, HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE, 0, + 0, *image); } -hsa_status_t HSA_API - hsa_ext_image_destroy_impl(hsa_agent_t agent, hsa_ext_image_t image) { +hsa_status_t hsa_ext_image_destroy(hsa_agent_t agent, hsa_ext_image_t image) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } - return ext_image::ImageRuntime::instance()->DestroyImageHandle(image); + return ImageRuntime::instance()->DestroyImageHandle(image); } -hsa_status_t HSA_API - hsa_ext_image_copy_impl(hsa_agent_t agent, hsa_ext_image_t src_image, - const hsa_dim3_t* src_offset, hsa_ext_image_t dst_image, - const hsa_dim3_t* dst_offset, const hsa_dim3_t* range) { +hsa_status_t hsa_ext_image_copy(hsa_agent_t agent, hsa_ext_image_t src_image, + const hsa_dim3_t* src_offset, hsa_ext_image_t dst_image, + const hsa_dim3_t* dst_offset, const hsa_dim3_t* range) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } @@ -138,15 +130,13 @@ hsa_status_t HSA_API return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - return ext_image::ImageRuntime::instance()->CopyImage( - src_image, dst_image, *src_offset, *dst_offset, *range); + return ImageRuntime::instance()->CopyImage(src_image, dst_image, *src_offset, *dst_offset, + *range); } -hsa_status_t HSA_API - hsa_ext_image_import_impl(hsa_agent_t agent, const void* src_memory, - size_t src_row_pitch, size_t src_slice_pitch, - hsa_ext_image_t dst_image, - const hsa_ext_image_region_t* image_region) { +hsa_status_t hsa_ext_image_import(hsa_agent_t agent, const void* src_memory, size_t src_row_pitch, + size_t src_slice_pitch, hsa_ext_image_t dst_image, + const hsa_ext_image_region_t* image_region) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } @@ -155,15 +145,13 @@ hsa_status_t HSA_API return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - return ext_image::ImageRuntime::instance()->CopyBufferToImage( - src_memory, src_row_pitch, src_slice_pitch, dst_image, *image_region); + return ImageRuntime::instance()->CopyBufferToImage(src_memory, src_row_pitch, src_slice_pitch, + dst_image, *image_region); } -hsa_status_t HSA_API - hsa_ext_image_export_impl(hsa_agent_t agent, hsa_ext_image_t src_image, - void* dst_memory, size_t dst_row_pitch, - size_t dst_slice_pitch, - const hsa_ext_image_region_t* image_region) { +hsa_status_t hsa_ext_image_export(hsa_agent_t agent, hsa_ext_image_t src_image, void* dst_memory, + size_t dst_row_pitch, size_t dst_slice_pitch, + const hsa_ext_image_region_t* image_region) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } @@ -172,14 +160,12 @@ hsa_status_t HSA_API return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - return ext_image::ImageRuntime::instance()->CopyImageToBuffer( - src_image, dst_memory, dst_row_pitch, dst_slice_pitch, *image_region); + return ImageRuntime::instance()->CopyImageToBuffer(src_image, dst_memory, dst_row_pitch, + dst_slice_pitch, *image_region); } -hsa_status_t HSA_API - hsa_ext_image_clear_impl(hsa_agent_t agent, hsa_ext_image_t image, - const void* data, - const hsa_ext_image_region_t* image_region) { +hsa_status_t hsa_ext_image_clear(hsa_agent_t agent, hsa_ext_image_t image, const void* data, + const hsa_ext_image_region_t* image_region) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } @@ -188,13 +174,12 @@ hsa_status_t HSA_API return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - return ext_image::ImageRuntime::instance()->FillImage(image, data, - *image_region); + return ImageRuntime::instance()->FillImage(image, data, *image_region); }; -hsa_status_t HSA_API hsa_ext_sampler_create_impl( - hsa_agent_t agent, const hsa_ext_sampler_descriptor_t* sampler_descriptor, - hsa_ext_sampler_t* sampler) { +hsa_status_t hsa_ext_sampler_create(hsa_agent_t agent, + const hsa_ext_sampler_descriptor_t* sampler_descriptor, + hsa_ext_sampler_t* sampler) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } @@ -203,25 +188,22 @@ hsa_status_t HSA_API hsa_ext_sampler_create_impl( return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - return ext_image::ImageRuntime::instance()->CreateSamplerHandle( - agent, *sampler_descriptor, *sampler); + return ImageRuntime::instance()->CreateSamplerHandle(agent, *sampler_descriptor, *sampler); } -hsa_status_t HSA_API - hsa_ext_sampler_destroy_impl(hsa_agent_t agent, hsa_ext_sampler_t sampler) { +hsa_status_t hsa_ext_sampler_destroy(hsa_agent_t agent, hsa_ext_sampler_t sampler) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } - return ext_image::ImageRuntime::instance()->DestroySamplerHandle(sampler); + return ImageRuntime::instance()->DestroySamplerHandle(sampler); } -hsa_status_t HSA_API - hsa_ext_image_get_capability_with_layout_impl(hsa_agent_t agent, - hsa_ext_image_geometry_t image_geometry, - const hsa_ext_image_format_t* image_format, - hsa_ext_image_data_layout_t image_data_layout, - uint32_t* capability_mask) { +hsa_status_t hsa_ext_image_get_capability_with_layout(hsa_agent_t agent, + hsa_ext_image_geometry_t image_geometry, + const hsa_ext_image_format_t* image_format, + hsa_ext_image_data_layout_t image_data_layout, + uint32_t* capability_mask) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } @@ -233,16 +215,14 @@ hsa_status_t HSA_API return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - return ext_image::ImageRuntime::instance()->GetImageCapability( - agent, *image_format, image_geometry, *capability_mask); + return ImageRuntime::instance()->GetImageCapability(agent, *image_format, image_geometry, + *capability_mask); } -hsa_status_t HSA_API hsa_ext_image_data_get_info_with_layout_impl( +hsa_status_t hsa_ext_image_data_get_info_with_layout( hsa_agent_t agent, const hsa_ext_image_descriptor_t* image_descriptor, - hsa_access_permission_t access_permission, - hsa_ext_image_data_layout_t image_data_layout, - size_t image_data_row_pitch, - size_t image_data_slice_pitch, + hsa_access_permission_t access_permission, hsa_ext_image_data_layout_t image_data_layout, + size_t image_data_row_pitch, size_t image_data_slice_pitch, hsa_ext_image_data_info_t* image_data_info) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; @@ -257,20 +237,15 @@ hsa_status_t HSA_API hsa_ext_image_data_get_info_with_layout_impl( enforceDefaultPitch(agent, image_descriptor, image_data_row_pitch, image_data_slice_pitch); - return ext_image::ImageRuntime::instance()->GetImageSizeAndAlignment( - agent, *image_descriptor, image_data_layout, image_data_row_pitch, - image_data_slice_pitch, *image_data_info); + return ImageRuntime::instance()->GetImageSizeAndAlignment( + agent, *image_descriptor, image_data_layout, image_data_row_pitch, image_data_slice_pitch, + *image_data_info); } -hsa_status_t HSA_API - hsa_ext_image_create_with_layout_impl(hsa_agent_t agent, - const hsa_ext_image_descriptor_t* image_descriptor, - const void* image_data, - hsa_access_permission_t access_permission, - hsa_ext_image_data_layout_t image_data_layout, - size_t image_data_row_pitch, - size_t image_data_slice_pitch, - hsa_ext_image_t* image) { +hsa_status_t hsa_ext_image_create_with_layout( + hsa_agent_t agent, const hsa_ext_image_descriptor_t* image_descriptor, const void* image_data, + hsa_access_permission_t access_permission, hsa_ext_image_data_layout_t image_data_layout, + size_t image_data_row_pitch, size_t image_data_slice_pitch, hsa_ext_image_t* image) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } @@ -282,19 +257,16 @@ hsa_status_t HSA_API enforceDefaultPitch(agent, image_descriptor, image_data_row_pitch, image_data_slice_pitch); - return ext_image::ImageRuntime::instance()->CreateImageHandle( + return ImageRuntime::instance()->CreateImageHandle( agent, *image_descriptor, image_data, access_permission, image_data_layout, image_data_row_pitch, image_data_slice_pitch, *image); } -hsa_status_t HSA_API hsa_amd_image_create_impl( - hsa_agent_t agent, - const hsa_ext_image_descriptor_t *image_descriptor, - const hsa_amd_image_descriptor_t *image_layout, - const void *image_data, - hsa_access_permission_t access_permission, - hsa_ext_image_t *image) -{ +hsa_status_t hsa_amd_image_create(hsa_agent_t agent, + const hsa_ext_image_descriptor_t* image_descriptor, + const hsa_amd_image_descriptor_t* image_layout, + const void* image_data, hsa_access_permission_t access_permission, + hsa_ext_image_t* image) { if (agent.handle == 0) { return HSA_STATUS_ERROR_INVALID_AGENT; } @@ -303,8 +275,44 @@ hsa_status_t HSA_API hsa_amd_image_create_impl( return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - return ext_image::ImageRuntime::instance()->CreateImageHandleWithLayout( + return ImageRuntime::instance()->CreateImageHandleWithLayout( agent, *image_descriptor, image_layout, image_data, access_permission, *image); } +void LoadImage(core::ImageExtTableInternal* image_api, + decltype(::hsa_amd_image_create)** interface_api) { + image_api->hsa_ext_image_get_capability_fn = hsa_ext_image_get_capability; + + image_api->hsa_ext_image_data_get_info_fn = hsa_ext_image_data_get_info; + + image_api->hsa_ext_image_create_fn = hsa_ext_image_create; + + image_api->hsa_ext_image_import_fn = hsa_ext_image_import; + + image_api->hsa_ext_image_export_fn = hsa_ext_image_export; + + image_api->hsa_ext_image_copy_fn = hsa_ext_image_copy; + + image_api->hsa_ext_image_clear_fn = hsa_ext_image_clear; + + image_api->hsa_ext_image_destroy_fn = hsa_ext_image_destroy; + + image_api->hsa_ext_sampler_create_fn = hsa_ext_sampler_create; + + image_api->hsa_ext_sampler_destroy_fn = hsa_ext_sampler_destroy; + + image_api->hsa_ext_image_get_capability_with_layout_fn = hsa_ext_image_get_capability_with_layout; + + image_api->hsa_ext_image_data_get_info_with_layout_fn = hsa_ext_image_data_get_info_with_layout; + + image_api->hsa_ext_image_create_with_layout_fn = hsa_ext_image_create_with_layout; + + image_api->hsa_amd_image_get_info_max_dim_fn = hsa_amd_image_get_info_max_dim; + + *interface_api = hsa_amd_image_create; } + +void ReleaseImageRsrcs() { ImageRuntime::DestroySingleton(); } + +} // namespace image +} // namespace rocr diff --git a/runtime/hsa-runtime/image/image.so.def b/runtime/hsa-runtime/image/image.so.def deleted file mode 100644 index d95d698d39..0000000000 --- a/runtime/hsa-runtime/image/image.so.def +++ /dev/null @@ -1,22 +0,0 @@ -{ -global: - hsa_ext_image_get_capability_impl; - hsa_ext_image_data_get_info_impl; - hsa_ext_image_create_impl; - hsa_ext_image_import_impl; - hsa_ext_image_export_impl; - hsa_ext_image_copy_impl; - hsa_ext_image_clear_impl; - hsa_ext_image_destroy_impl; - hsa_ext_sampler_create_impl; - hsa_ext_sampler_destroy_impl; - hsa_ext_image_get_capability_with_layout_impl; - hsa_ext_image_data_get_info_with_layout_impl; - hsa_ext_image_create_with_layout_impl; - hsa_amd_image_get_info_max_dim_impl; - hsa_amd_image_create_impl; - Load; - Unload; -local: - *; -}; diff --git a/runtime/hsa-runtime/image/image_lut.h b/runtime/hsa-runtime/image/image_lut.h index d1868a2499..bb9a697313 100644 --- a/runtime/hsa-runtime/image/image_lut.h +++ b/runtime/hsa-runtime/image/image_lut.h @@ -7,7 +7,9 @@ #include "resource.h" #include "util.h" -namespace amd { +namespace rocr { +namespace image { + class ImageLut { public: ImageLut() {} @@ -33,5 +35,6 @@ class ImageLut { DISALLOW_COPY_AND_ASSIGN(ImageLut); }; -} // namespace +} // namespace image +} // namespace rocr #endif // AMD_HSA_EXT_IMAGE_IMAGE_LUT_H diff --git a/runtime/hsa-runtime/image/image_lut_kv.cpp b/runtime/hsa-runtime/image/image_lut_kv.cpp index e358c0a047..463cc94167 100644 --- a/runtime/hsa-runtime/image/image_lut_kv.cpp +++ b/runtime/hsa-runtime/image/image_lut_kv.cpp @@ -1,7 +1,9 @@ #include "image_lut_kv.h" #include "resource_kv.h" -namespace amd { +namespace rocr { +namespace image { + const uint32_t ImageLutKv::kGeometryLut_[GEOMETRY_COUNT] = { SQ_RSRC_IMG_1D, // HSA_EXT_IMAGE_GEOMETRY_1D SQ_RSRC_IMG_2D, // HSA_EXT_IMAGE_GEOMETRY_2D @@ -393,4 +395,5 @@ uint32_t ImageLutKv::GetPixelSize(uint8_t data_format, uint8_t data_type) const } } -} // namespace amd +} // namespace image +} // namespace rocr diff --git a/runtime/hsa-runtime/image/image_lut_kv.h b/runtime/hsa-runtime/image/image_lut_kv.h index 8ae8ce86ba..c6c9d4a94b 100644 --- a/runtime/hsa-runtime/image/image_lut_kv.h +++ b/runtime/hsa-runtime/image/image_lut_kv.h @@ -3,7 +3,9 @@ #include "image_lut.h" -namespace amd { +namespace rocr { +namespace image { + class ImageLutKv : public ImageLut { public: ImageLutKv() {} @@ -46,5 +48,6 @@ class ImageLutKv : public ImageLut { DISALLOW_COPY_AND_ASSIGN(ImageLutKv); }; -} // namespace +} // namespace image +} // namespace rocr #endif // AMD_HSA_EXT_IMAGE_IMAGE_LUT_KV_H diff --git a/runtime/hsa-runtime/image/image_manager.cpp b/runtime/hsa-runtime/image/image_manager.cpp index 901c3d276f..b303aa4253 100644 --- a/runtime/hsa-runtime/image/image_manager.cpp +++ b/runtime/hsa-runtime/image/image_manager.cpp @@ -1,5 +1,6 @@ #include "inc/hsa_ext_amd.h" #include "inc/hsa_ext_image.h" +#include "core/inc/hsa_ext_amd_impl.h" #include "image_manager.h" #include "image_runtime.h" @@ -14,22 +15,23 @@ __inline long int lrintf(float f) { return _mm_cvtss_si32(_mm_load_ss(&f)); } #endif -namespace amd { +namespace rocr { +namespace image { Image* Image::Create(hsa_agent_t agent) { - hsa_amd_memory_pool_t pool = ext_image::ImageRuntime::instance()->kernarg_pool(); + hsa_amd_memory_pool_t pool = ImageRuntime::instance()->kernarg_pool(); Image* image = NULL; hsa_status_t status = - hsa_amd_memory_pool_allocate(pool, sizeof(Image), 0, reinterpret_cast(&image)); + AMD::hsa_amd_memory_pool_allocate(pool, sizeof(Image), 0, reinterpret_cast(&image)); assert(status == HSA_STATUS_SUCCESS); if (status != HSA_STATUS_SUCCESS) return NULL; new (image) Image(); - status = hsa_amd_agents_allow_access(1, &agent, NULL, image); + status = AMD::hsa_amd_agents_allow_access(1, &agent, NULL, image); if (status != HSA_STATUS_SUCCESS) { Image::Destroy(image); @@ -43,24 +45,24 @@ void Image::Destroy(const Image* image) { assert(image != NULL); image->~Image(); - hsa_status_t status = hsa_amd_memory_pool_free(const_cast(image)); + hsa_status_t status = AMD::hsa_amd_memory_pool_free(const_cast(image)); assert(status == HSA_STATUS_SUCCESS); } Sampler* Sampler::Create(hsa_agent_t agent) { - hsa_amd_memory_pool_t pool = ext_image::ImageRuntime::instance()->kernarg_pool(); + hsa_amd_memory_pool_t pool = ImageRuntime::instance()->kernarg_pool(); Sampler* sampler = NULL; - hsa_status_t status = - hsa_amd_memory_pool_allocate(pool, sizeof(Sampler), 0, reinterpret_cast(&sampler)); + hsa_status_t status = AMD::hsa_amd_memory_pool_allocate(pool, sizeof(Sampler), 0, + reinterpret_cast(&sampler)); if (status != HSA_STATUS_SUCCESS) return NULL; new (sampler) Sampler(); - status = hsa_amd_agents_allow_access(1, &agent, NULL, sampler); + status = AMD::hsa_amd_agents_allow_access(1, &agent, NULL, sampler); if (status != HSA_STATUS_SUCCESS) { Sampler::Destroy(sampler); @@ -74,7 +76,7 @@ void Sampler::Destroy(const Sampler* sampler) { assert(sampler != NULL); sampler->~Sampler(); - hsa_status_t status = hsa_amd_memory_pool_free(const_cast(sampler)); + hsa_status_t status = AMD::hsa_amd_memory_pool_free(const_cast(sampler)); assert(status == HSA_STATUS_SUCCESS); } @@ -111,7 +113,7 @@ hsa_status_t ImageManager::CopyImageToBuffer( const Image& src_image, void* dst_memory, size_t dst_row_pitch, size_t dst_slice_pitch, const hsa_ext_image_region_t& image_region) { // Treat buffer as image since we don't tile our image anyway. - amd::Image* dst_image = Image::Create(src_image.component); + Image* dst_image = Image::Create(src_image.component); dst_image->component = src_image.component; dst_image->desc = src_image.desc; // the width, height, depth is ignored. @@ -685,4 +687,5 @@ hsa_status_t ImageManager::FillImage(const Image& image, const void* pattern, return HSA_STATUS_SUCCESS; } -} // namespace +} // namespace image +} // namespace rocr diff --git a/runtime/hsa-runtime/image/image_manager.h b/runtime/hsa-runtime/image/image_manager.h index 11210622cf..6f44fa1a20 100644 --- a/runtime/hsa-runtime/image/image_manager.h +++ b/runtime/hsa-runtime/image/image_manager.h @@ -7,7 +7,9 @@ #include "resource.h" #include "util.h" -namespace amd { +namespace rocr { +namespace image { + /// @brief Abstract class for creating AMD agent specific image / sampler /// resources and data transfer. class ImageManager { @@ -94,5 +96,6 @@ class ImageManager { DISALLOW_COPY_AND_ASSIGN(ImageManager); }; -} // namespace +} // namespace image +} // namespace rocr #endif // AMD_HSA_EXT_IMAGE_IMAGE_MANAGER_H diff --git a/runtime/hsa-runtime/image/image_manager_ai.cpp b/runtime/hsa-runtime/image/image_manager_ai.cpp index ab790b3d41..c7fdc06895 100755 --- a/runtime/hsa-runtime/image/image_manager_ai.cpp +++ b/runtime/hsa-runtime/image/image_manager_ai.cpp @@ -8,6 +8,7 @@ #include "hsakmt.h" #include "inc/hsa_ext_amd.h" +#include "core/inc/hsa_internal.h" #include "addrlib/src/core/addrlib.h" #include "image_runtime.h" #include "resource.h" @@ -15,7 +16,9 @@ #include "util.h" #include "device_info.h" -namespace amd { +namespace rocr { +namespace image { + ImageManagerAi::ImageManagerAi() : ImageManagerKv() {} ImageManagerAi::~ImageManagerAi() {} @@ -28,7 +31,7 @@ hsa_status_t ImageManagerAi::CalculateImageSizeAndAlignment( hsa_ext_image_data_info_t& image_info) const { ADDR2_COMPUTE_SURFACE_INFO_OUTPUT out = {0}; hsa_profile_t profile; - hsa_status_t status = hsa_agent_get_info(component, HSA_AGENT_INFO_PROFILE, &profile); + hsa_status_t status = HSA::hsa_agent_get_info(component, HSA_AGENT_INFO_PROFILE, &profile); Image::TileMode tileMode = Image::TileMode::LINEAR; if (image_data_layout == HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE) { tileMode = (profile == HSA_PROFILE_BASE && @@ -97,10 +100,10 @@ hsa_status_t ImageManagerAi::PopulateImageSrd(Image& image, const metadata_amd_t sq_buf_rsrc_word3_u word3; word0.val = 0; - word0.f.base_address = ext_image::PtrLow32(image_data_addr); + word0.f.base_address = PtrLow32(image_data_addr); word1.val = image.srd[1]; - word1.f.base_address_hi = ext_image::PtrHigh32(image_data_addr); + word1.f.base_address_hi = PtrHigh32(image_data_addr); word1.f.stride = image_prop.element_size; word3.val = image.srd[3]; @@ -120,8 +123,8 @@ hsa_status_t ImageManagerAi::PopulateImageSrd(Image& image, const metadata_amd_t if(image_prop.element_size!=hwPixelSize) return (hsa_status_t)HSA_EXT_STATUS_ERROR_IMAGE_FORMAT_UNSUPPORTED; - ((SQ_IMG_RSRC_WORD0*)(&image.srd[0]))->bits.BASE_ADDRESS = ext_image::PtrLow40Shift8(image_data_addr); - ((SQ_IMG_RSRC_WORD1*)(&image.srd[1]))->bits.BASE_ADDRESS_HI = ext_image::PtrHigh64Shift40(image_data_addr); + ((SQ_IMG_RSRC_WORD0*)(&image.srd[0]))->bits.BASE_ADDRESS = PtrLow40Shift8(image_data_addr); + ((SQ_IMG_RSRC_WORD1*)(&image.srd[1]))->bits.BASE_ADDRESS_HI = PtrHigh64Shift40(image_data_addr); ((SQ_IMG_RSRC_WORD1*)(&image.srd[1]))->bits.DATA_FORMAT = image_prop.data_format; ((SQ_IMG_RSRC_WORD1*)(&image.srd[1]))->bits.NUM_FORMAT = image_prop.data_type; ((SQ_IMG_RSRC_WORD3*)(&image.srd[3]))->bits.DST_SEL_X = swizzle.x; @@ -137,9 +140,10 @@ hsa_status_t ImageManagerAi::PopulateImageSrd(Image& image, const metadata_amd_t uintptr_t meta = uintptr_t(((SQ_IMG_RSRC_WORD5*)(&image.srd[5]))->bits.META_DATA_ADDRESS_HI) << 40; meta |= uintptr_t(((SQ_IMG_RSRC_WORD7*)(&image.srd[7]))->bits.META_DATA_ADDRESS) << 8; meta += reinterpret_cast(image_data_addr); - - ((SQ_IMG_RSRC_WORD7*)(&image.srd[7]))->bits.META_DATA_ADDRESS = ext_image::PtrLow40Shift8((void*)meta); - ((SQ_IMG_RSRC_WORD5*)(&image.srd[5]))->bits.META_DATA_ADDRESS_HI = ext_image::PtrHigh64Shift40((void*)meta); + + ((SQ_IMG_RSRC_WORD7*)(&image.srd[7]))->bits.META_DATA_ADDRESS = PtrLow40Shift8((void*)meta); + ((SQ_IMG_RSRC_WORD5*)(&image.srd[5]))->bits.META_DATA_ADDRESS_HI = + PtrHigh64Shift40((void*)meta); } //Looks like this is only used for CPU copies. image.row_pitch = 0;//desc->word4.bits.pitch+1*desc->word3.bits.element_size; @@ -240,10 +244,10 @@ hsa_status_t ImageManagerAi::PopulateImageSrd(Image& image) const { sq_buf_rsrc_word3_u word3; word0.val = 0; - word0.f.base_address = ext_image::PtrLow32(image_data_addr); + word0.f.base_address = PtrLow32(image_data_addr); word1.val = 0; - word1.f.base_address_hi = ext_image::PtrHigh32(image_data_addr); + word1.f.base_address_hi = PtrHigh32(image_data_addr); word1.f.stride = image_prop.element_size; word1.f.swizzle_enable = false; word1.f.cache_swizzle = false; @@ -291,10 +295,10 @@ hsa_status_t ImageManagerAi::PopulateImageSrd(Image& image) const { const size_t row_pitch_size = out.pitch * image_prop.element_size; - word0.f.base_address = ext_image::PtrLow40Shift8(image_data_addr); + word0.f.base_address = PtrLow40Shift8(image_data_addr); word1.val = 0; - word1.f.base_address_hi = ext_image::PtrHigh64Shift40(image_data_addr); + word1.f.base_address_hi = PtrHigh64Shift40(image_data_addr); word1.f.min_lod = 0; word1.f.data_format = image_prop.data_format; word1.f.num_format = image_prop.data_type; @@ -395,7 +399,7 @@ hsa_status_t ImageManagerAi::ModifyImageSrd( return HSA_STATUS_SUCCESS; } -hsa_status_t ImageManagerAi::PopulateSamplerSrd(amd::Sampler& sampler) const { +hsa_status_t ImageManagerAi::PopulateSamplerSrd(Sampler& sampler) const { const hsa_ext_sampler_descriptor_t sampler_descriptor = sampler.desc; SQ_IMG_SAMP_WORD0 word0; @@ -545,4 +549,5 @@ uint32_t ImageManagerAi::GetAddrlibSurfaceInfoAi( return in.swizzleMode; } -} // namespace +} // namespace image +} // namespace rocr diff --git a/runtime/hsa-runtime/image/image_manager_ai.h b/runtime/hsa-runtime/image/image_manager_ai.h index c28bb8416b..284e72731d 100644 --- a/runtime/hsa-runtime/image/image_manager_ai.h +++ b/runtime/hsa-runtime/image/image_manager_ai.h @@ -4,7 +4,8 @@ #include "addrlib/inc/addrinterface.h" #include "image_manager_kv.h" -namespace amd { +namespace rocr { +namespace image { class ImageManagerAi : public ImageManagerKv { public: @@ -46,5 +47,7 @@ class ImageManagerAi : public ImageManagerKv { private: DISALLOW_COPY_AND_ASSIGN(ImageManagerAi); }; -} + +} // namespace image +} // namespace rocr #endif // HSA_RUNTIME_EXT_IMAGE_IMAGE_MANAGER_AI_H diff --git a/runtime/hsa-runtime/image/image_manager_kv.cpp b/runtime/hsa-runtime/image/image_manager_kv.cpp index 8d40cd86a8..34b1245eb7 100755 --- a/runtime/hsa-runtime/image/image_manager_kv.cpp +++ b/runtime/hsa-runtime/image/image_manager_kv.cpp @@ -7,8 +7,9 @@ #include #include "hsakmt.h" -#include "inc/hsa.h" #include "inc/hsa_ext_amd.h" +#include "core/inc/hsa_internal.h" +#include "core/inc/hsa_ext_amd_impl.h" #include "addrlib/inc/addrinterface.h" #include "addrlib/src/core/addrlib.h" #include "image_runtime.h" @@ -17,7 +18,9 @@ #include "util.h" #include "device_info.h" -namespace amd { +namespace rocr { +namespace image { + ImageManagerKv::ImageManagerKv() : ImageManager() {} ImageManagerKv::~ImageManagerKv() {} @@ -39,7 +42,8 @@ hsa_status_t ImageManagerKv::Initialize(hsa_agent_t agent_handle) { tileConfig.MacroTileConfig = &mtc[0]; tileConfig.NumMacroTileConfigs = 40; uint32_t node_id = 0; - status = hsa_agent_get_info(agent_, static_cast(HSA_AMD_AGENT_INFO_DRIVER_NODE_ID), &node_id); + status = HSA::hsa_agent_get_info( + agent_, static_cast(HSA_AMD_AGENT_INFO_DRIVER_NODE_ID), &node_id); assert(status == HSA_STATUS_SUCCESS); HSAKMT_STATUS stat = hsaKmtGetTileConfig(node_id, &tileConfig); assert(stat == HSAKMT_STATUS_SUCCESS); @@ -96,7 +100,7 @@ hsa_status_t ImageManagerKv::Initialize(hsa_agent_t agent_handle) { // the change to the coherency mode happens before a call to // hsa_ext_image_create. hsa_amd_coherency_type_t coherency_type; - status = hsa_amd_coherency_get_type(agent_, &coherency_type); + status = AMD::hsa_amd_coherency_get_type(agent_, &coherency_type); assert(status == HSA_STATUS_SUCCESS); mtype_ = (coherency_type == HSA_AMD_COHERENCY_TYPE_COHERENT) ? 3 : 1; @@ -104,15 +108,14 @@ hsa_status_t ImageManagerKv::Initialize(hsa_agent_t agent_handle) { // hsa_ext_image_create. hsa_region_t local_region = {0}; - status = - hsa_agent_iterate_regions(agent_, GetLocalMemoryRegion, &local_region); + status = HSA::hsa_agent_iterate_regions(agent_, GetLocalMemoryRegion, &local_region); assert(status == HSA_STATUS_SUCCESS); local_memory_base_address_ = 0; if (local_region.handle != 0) { - status = hsa_region_get_info( - local_region, static_cast(HSA_AMD_REGION_INFO_BASE), - &local_memory_base_address_); + status = HSA::hsa_region_get_info(local_region, + static_cast(HSA_AMD_REGION_INFO_BASE), + &local_memory_base_address_); assert(status == HSA_STATUS_SUCCESS); } @@ -125,7 +128,7 @@ hsa_status_t ImageManagerKv::Initialize(hsa_agent_t agent_handle) { void ImageManagerKv::Cleanup() { if (blit_queue_.queue_ != NULL) { - hsa_queue_destroy(blit_queue_.queue_); + HSA::hsa_queue_destroy(blit_queue_.queue_); } if (addr_lib_ != NULL) { @@ -158,7 +161,7 @@ hsa_status_t ImageManagerKv::CalculateImageSizeAndAlignment( hsa_ext_image_data_info_t& image_info) const { ADDR_COMPUTE_SURFACE_INFO_OUTPUT out = {0}; hsa_profile_t profile; - hsa_status_t status = hsa_agent_get_info(component, HSA_AGENT_INFO_PROFILE, &profile); + hsa_status_t status = HSA::hsa_agent_get_info(component, HSA_AGENT_INFO_PROFILE, &profile); Image::TileMode tileMode = Image::TileMode::LINEAR; if (image_data_layout == HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE) { tileMode = (profile == HSA_PROFILE_BASE && @@ -240,8 +243,8 @@ hsa_status_t ImageManagerKv::PopulateImageSrd(Image& image, const metadata_amd_t image.srd[6]=desc->word6.u32_all; image.srd[7]=desc->word7.u32_all; - ((SQ_IMG_RSRC_WORD0*)(&image.srd[0]))->bits.base_address = ext_image::PtrLow40Shift8(image_data_addr); - ((SQ_IMG_RSRC_WORD1*)(&image.srd[1]))->bits.base_address_hi = ext_image::PtrHigh64Shift40(image_data_addr); + ((SQ_IMG_RSRC_WORD0*)(&image.srd[0]))->bits.base_address = PtrLow40Shift8(image_data_addr); + ((SQ_IMG_RSRC_WORD1*)(&image.srd[1]))->bits.base_address_hi = PtrHigh64Shift40(image_data_addr); ((SQ_IMG_RSRC_WORD1*)(&image.srd[1]))->bits.data_format = image_prop.data_format; ((SQ_IMG_RSRC_WORD1*)(&image.srd[1]))->bits.num_format = image_prop.data_type; ((SQ_IMG_RSRC_WORD1*)(&image.srd[1]))->bits.mtype = mtype; @@ -250,7 +253,7 @@ hsa_status_t ImageManagerKv::PopulateImageSrd(Image& image, const metadata_amd_t ((SQ_IMG_RSRC_WORD3*)(&image.srd[3]))->bits.dst_sel_y = swizzle.y; ((SQ_IMG_RSRC_WORD3*)(&image.srd[3]))->bits.dst_sel_z = swizzle.z; ((SQ_IMG_RSRC_WORD3*)(&image.srd[3]))->bits.dst_sel_w = swizzle.w; - ((SQ_IMG_RSRC_WORD7*)(&image.srd[7]))->bits.meta_data_address += ext_image::PtrLow40Shift8(image_data_addr); + ((SQ_IMG_RSRC_WORD7*)(&image.srd[7]))->bits.meta_data_address += PtrLow40Shift8(image_data_addr); //Looks like this is only used for CPU copies. image.row_pitch = (desc->word4.bits.pitch+1)*image_prop.element_size; @@ -288,10 +291,10 @@ hsa_status_t ImageManagerKv::PopulateImageSrd(Image& image) const { SQ_BUF_RSRC_WORD3 word3; word0.u32_all = 0; - word0.bits.base_address = ext_image::PtrLow32(image_data_addr); + word0.bits.base_address = PtrLow32(image_data_addr); word1.u32_all = 0; - word1.bits.base_address_hi = ext_image::PtrHigh32(image_data_addr); + word1.bits.base_address_hi = PtrHigh32(image_data_addr); word1.bits.stride = image_prop.element_size; word1.bits.swizzle_enable = false; word1.bits.cache_swizzle = false; @@ -341,10 +344,10 @@ hsa_status_t ImageManagerKv::PopulateImageSrd(Image& image) const { const size_t row_pitch_size = out.pitch * image_prop.element_size; - word0.bits.base_address = ext_image::PtrLow40Shift8(image_data_addr); + word0.bits.base_address = PtrLow40Shift8(image_data_addr); word1.u32_all = 0; - word1.bits.base_address_hi = ext_image::PtrHigh64Shift40(image_data_addr); + word1.bits.base_address_hi = PtrHigh64Shift40(image_data_addr); word1.bits.min_lod = 0; word1.bits.data_format = image_prop.data_format; word1.bits.num_format = image_prop.data_type; @@ -364,10 +367,7 @@ hsa_status_t ImageManagerKv::PopulateImageSrd(Image& image) const { word3.bits.dst_sel_z = swizzle.z; word3.bits.dst_sel_w = swizzle.w; word3.bits.tiling_index = out.tileIndex; - word3.bits.pow2_pad = (ext_image::IsPowerOfTwo(row_pitch_size) && - ext_image::IsPowerOfTwo(image.desc.height)) - ? 1 - : 0; + word3.bits.pow2_pad = (IsPowerOfTwo(row_pitch_size) && IsPowerOfTwo(image.desc.height)) ? 1 : 0; word3.bits.type = image_lut_.MapGeometry(image.desc.geometry); word3.bits.atc = atc_access; @@ -456,7 +456,7 @@ hsa_status_t ImageManagerKv::ModifyImageSrd( return HSA_STATUS_SUCCESS; } -hsa_status_t ImageManagerKv::PopulateSamplerSrd(amd::Sampler& sampler) const { +hsa_status_t ImageManagerKv::PopulateSamplerSrd(Sampler& sampler) const { const hsa_ext_sampler_descriptor_t sampler_descriptor = sampler.desc; SQ_IMG_SAMP_WORD0 word0; @@ -525,9 +525,9 @@ hsa_status_t ImageManagerKv::CopyBufferToImage( return HSA_STATUS_ERROR_OUT_OF_RESOURCES; } - return ext_image::ImageRuntime::instance()->blit_kernel().CopyBufferToImage( - blit_queue_, blit_code_catalog_, src_memory, src_row_pitch, - src_slice_pitch, dst_image, image_region); + return ImageRuntime::instance()->blit_kernel().CopyBufferToImage( + blit_queue_, blit_code_catalog_, src_memory, src_row_pitch, src_slice_pitch, dst_image, + image_region); } hsa_status_t ImageManagerKv::CopyImageToBuffer( @@ -537,9 +537,9 @@ hsa_status_t ImageManagerKv::CopyImageToBuffer( return HSA_STATUS_ERROR_OUT_OF_RESOURCES; } - return ext_image::ImageRuntime::instance()->blit_kernel().CopyImageToBuffer( - blit_queue_, blit_code_catalog_, src_image, dst_memory, dst_row_pitch, - dst_slice_pitch, image_region); + return ImageRuntime::instance()->blit_kernel().CopyImageToBuffer( + blit_queue_, blit_code_catalog_, src_image, dst_memory, dst_row_pitch, dst_slice_pitch, + image_region); } hsa_status_t ImageManagerKv::CopyImage(const Image& dst_image, @@ -562,9 +562,9 @@ hsa_status_t ImageManagerKv::CopyImage(const Image& dst_image, BlitKernel::KernelOp copy_type = BlitKernel::KERNEL_OP_COPY_IMAGE_DEFAULT; if ((src_order == dst_order) && (src_type == dst_type)) { - return ext_image::ImageRuntime::instance()->blit_kernel().CopyImage( - blit_queue_, blit_code_catalog_, dst_image, src_image, dst_origin, - src_origin, size, copy_type); + return ImageRuntime::instance()->blit_kernel().CopyImage(blit_queue_, blit_code_catalog_, + dst_image, src_image, dst_origin, + src_origin, size, copy_type); } // Source and destination format must be the same, except for @@ -589,10 +589,9 @@ hsa_status_t ImageManagerKv::CopyImage(const Image& dst_image, uint32_t num_format_original = word1->bits.num_format; word1->bits.num_format = TYPE_UNORM; - hsa_status_t status = - ext_image::ImageRuntime::instance()->blit_kernel().CopyImage( - blit_queue_, blit_code_catalog_, dst_image, src_image, dst_origin, - src_origin, size, copy_type); + hsa_status_t status = ImageRuntime::instance()->blit_kernel().CopyImage( + blit_queue_, blit_code_catalog_, dst_image, src_image, dst_origin, src_origin, size, + copy_type); // Revert to the original format after the copy operation is finished. word1->bits.num_format = num_format_original; @@ -655,9 +654,8 @@ hsa_status_t ImageManagerKv::FillImage(const Image& image, const void* pattern, break; } - hsa_status_t status = - ext_image::ImageRuntime::instance()->blit_kernel().FillImage( - blit_queue_, blit_code_catalog_, *image_view, new_pattern, region); + hsa_status_t status = ImageRuntime::instance()->blit_kernel().FillImage( + blit_queue_, blit_code_catalog_, *image_view, new_pattern, region); // Revert back original configuration. if (word3_buff != NULL) { @@ -682,8 +680,7 @@ hsa_status_t ImageManagerKv::GetLocalMemoryRegion(hsa_region_t region, } hsa_region_segment_t segment; - hsa_status_t stat = - hsa_region_get_info(region, HSA_REGION_INFO_SEGMENT, &segment); + hsa_status_t stat = HSA::hsa_region_get_info(region, HSA_REGION_INFO_SEGMENT, &segment); if (stat != HSA_STATUS_SUCCESS) { return stat; } @@ -693,7 +690,7 @@ hsa_status_t ImageManagerKv::GetLocalMemoryRegion(hsa_region_t region, } uint32_t base = 0; - stat = hsa_region_get_info(region, HSA_REGION_INFO_GLOBAL_FLAGS, &base); + stat = HSA::hsa_region_get_info(region, HSA_REGION_INFO_GLOBAL_FLAGS, &base); if (stat != HSA_STATUS_SUCCESS) { return stat; } @@ -926,12 +923,11 @@ BlitQueue& ImageManagerKv::BlitQueueInit() { blit_queue_.cached_index_ = 0; uint32_t max_queue_size = 0; - hsa_status_t status = hsa_agent_get_info( - agent_, HSA_AGENT_INFO_QUEUE_MAX_SIZE, &max_queue_size); + hsa_status_t status = + HSA::hsa_agent_get_info(agent_, HSA_AGENT_INFO_QUEUE_MAX_SIZE, &max_queue_size); - status = - hsa_queue_create(agent_, max_queue_size, HSA_QUEUE_TYPE_MULTI, NULL, - NULL, UINT_MAX, UINT_MAX, &blit_queue_.queue_); + status = HSA::hsa_queue_create(agent_, max_queue_size, HSA_QUEUE_TYPE_MULTI, NULL, NULL, + UINT_MAX, UINT_MAX, &blit_queue_.queue_); if (HSA_STATUS_SUCCESS != status) { blit_queue_.queue_ = NULL; @@ -939,12 +935,11 @@ BlitQueue& ImageManagerKv::BlitQueueInit() { } // Get the kernel handles. - status = ext_image::ImageRuntime::instance()->blit_kernel().BuildBlitCode( - agent_, blit_code_catalog_); + status = ImageRuntime::instance()->blit_kernel().BuildBlitCode(agent_, blit_code_catalog_); if (HSA_STATUS_SUCCESS != status) { blit_code_catalog_.clear(); - hsa_queue_destroy(blit_queue_.queue_); + HSA::hsa_queue_destroy(blit_queue_.queue_); blit_queue_.queue_ = NULL; return blit_queue_; } @@ -957,4 +952,5 @@ BlitQueue& ImageManagerKv::BlitQueueInit() { return blit_queue_; } -} // namespace +} // namespace image +} // namespace rocr diff --git a/runtime/hsa-runtime/image/image_manager_kv.h b/runtime/hsa-runtime/image/image_manager_kv.h index 335e6044f5..93e5073270 100755 --- a/runtime/hsa-runtime/image/image_manager_kv.h +++ b/runtime/hsa-runtime/image/image_manager_kv.h @@ -6,7 +6,8 @@ #include "image_lut_kv.h" #include "image_manager.h" -namespace amd { +namespace rocr { +namespace image { class ImageManagerKv : public ImageManager { public: @@ -121,5 +122,7 @@ class ImageManagerKv : public ImageManager { private: DISALLOW_COPY_AND_ASSIGN(ImageManagerKv); }; -} + +} // namespace image +} // namespace rocr #endif // HSA_RUNTIME_EXT_IMAGE_IMAGE_MANAGER_KV_H diff --git a/runtime/hsa-runtime/image/image_manager_nv.cpp b/runtime/hsa-runtime/image/image_manager_nv.cpp index 5380e13375..fc7a02c1f5 100755 --- a/runtime/hsa-runtime/image/image_manager_nv.cpp +++ b/runtime/hsa-runtime/image/image_manager_nv.cpp @@ -7,6 +7,7 @@ #include #include "inc/hsa_ext_amd.h" +#include "core/inc/hsa_internal.h" #include "addrlib/src/core/addrlib.h" #include "image_runtime.h" #include "resource.h" @@ -14,7 +15,8 @@ #include "util.h" #include "device_info.h" -namespace amd { +namespace rocr { +namespace image { //----------------------------------------------------------------------------- // Workaround switch to combined format/type codes and missing gfx10 @@ -143,8 +145,7 @@ hsa_status_t ImageManagerNv::CalculateImageSizeAndAlignment( hsa_ext_image_data_info_t& image_info) const { ADDR2_COMPUTE_SURFACE_INFO_OUTPUT out = {0}; hsa_profile_t profile; - hsa_status_t status = hsa_agent_get_info(component, - HSA_AGENT_INFO_PROFILE, &profile); + hsa_status_t status = HSA::hsa_agent_get_info(component, HSA_AGENT_INFO_PROFILE, &profile); Image::TileMode tileMode = Image::TileMode::LINEAR; if (image_data_layout == HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE) { tileMode = (profile == HSA_PROFILE_BASE && @@ -217,10 +218,10 @@ hsa_status_t ImageManagerNv::PopulateImageSrd(Image& image, SQ_BUF_RSRC_WORD3 word3; word0.val = 0; - word0.f.BASE_ADDRESS = ext_image::PtrLow32(image_data_addr); + word0.f.BASE_ADDRESS = PtrLow32(image_data_addr); word1.val = image.srd[1]; - word1.f.BASE_ADDRESS_HI = ext_image::PtrHigh32(image_data_addr); + word1.f.BASE_ADDRESS_HI = PtrHigh32(image_data_addr); word1.f.STRIDE = image_prop.element_size; word3.val = image.srd[3]; @@ -242,9 +243,9 @@ hsa_status_t ImageManagerNv::PopulateImageSrd(Image& image, return (hsa_status_t)HSA_EXT_STATUS_ERROR_IMAGE_FORMAT_UNSUPPORTED; } reinterpret_cast(&image.srd[0])->bits.BASE_ADDRESS = - ext_image::PtrLow40Shift8(image_data_addr); - reinterpret_cast(&image.srd[1])->bits.BASE_ADDRESS_HI - = ext_image::PtrHigh64Shift40(image_data_addr); + PtrLow40Shift8(image_data_addr); + reinterpret_cast(&image.srd[1])->bits.BASE_ADDRESS_HI = + PtrHigh64Shift40(image_data_addr); reinterpret_cast(&image.srd[1])->bits.FORMAT = GetCombinedFormat(image_prop.data_format, image_prop.data_type); reinterpret_cast(&image.srd[3])->bits.DST_SEL_X = swizzle.x; @@ -264,9 +265,10 @@ hsa_status_t ImageManagerNv::PopulateImageSrd(Image& image, uintptr_t meta = uintptr_t(((SQ_IMG_RSRC_WORD7*)(&image.srd[7]))->bits.META_DATA_ADDRESS_HI) << 16; meta |= uintptr_t(((SQ_IMG_RSRC_WORD6*)(&image.srd[6]))->bits.META_DATA_ADDRESS) << 8; meta += reinterpret_cast(image_data_addr); - - ((SQ_IMG_RSRC_WORD6*)(&image.srd[6]))->bits.META_DATA_ADDRESS = ext_image::PtrLow16Shift8((void*)meta); - ((SQ_IMG_RSRC_WORD7*)(&image.srd[7]))->bits.META_DATA_ADDRESS_HI = ext_image::PtrHigh64Shift16((void*)meta); + + ((SQ_IMG_RSRC_WORD6*)(&image.srd[6]))->bits.META_DATA_ADDRESS = PtrLow16Shift8((void*)meta); + ((SQ_IMG_RSRC_WORD7*)(&image.srd[7]))->bits.META_DATA_ADDRESS_HI = + PtrHigh64Shift16((void*)meta); } // Looks like this is only used for CPU copies. image.row_pitch = 0; @@ -352,10 +354,10 @@ hsa_status_t ImageManagerNv::PopulateImageSrd(Image& image) const { SQ_BUF_RSRC_WORD3 word3; word0.val = 0; - word0.f.BASE_ADDRESS = ext_image::PtrLow32(image_data_addr); + word0.f.BASE_ADDRESS = PtrLow32(image_data_addr); word1.val = 0; - word1.f.BASE_ADDRESS_HI = ext_image::PtrHigh32(image_data_addr); + word1.f.BASE_ADDRESS_HI = PtrHigh32(image_data_addr); word1.f.STRIDE = image_prop.element_size; word1.f.SWIZZLE_ENABLE = false; word1.f.CACHE_SWIZZLE = false; @@ -404,18 +406,18 @@ hsa_status_t ImageManagerNv::PopulateImageSrd(Image& image) const { const size_t row_pitch_size = out.pitch * image_prop.element_size; - word0.f.BASE_ADDRESS = ext_image::PtrLow40Shift8(image_data_addr); + word0.f.BASE_ADDRESS = PtrLow40Shift8(image_data_addr); word1.val = 0; - word1.f.BASE_ADDRESS_HI = ext_image::PtrHigh64Shift40(image_data_addr); + word1.f.BASE_ADDRESS_HI = PtrHigh64Shift40(image_data_addr); word1.f.MIN_LOD = 0; word1.f.FORMAT = GetCombinedFormat(image_prop.data_format, image_prop.data_type); // Only take the lowest 2 bits of (image.desc.width - 1) - word1.f.WIDTH = ext_image::BitSelect<0, 1>(image.desc.width - 1); + word1.f.WIDTH = BitSelect<0, 1>(image.desc.width - 1); word2.val = 0; // Take the high 12 bits of (image.desc.width - 1) - word2.f.WIDTH_HI = ext_image::BitSelect<2, 13>(image.desc.width - 1); + word2.f.WIDTH_HI = BitSelect<2, 13>(image.desc.width - 1); word2.f.HEIGHT = image.desc.height ? image.desc.height - 1 : 0; word2.f.RESOURCE_LEVEL = 1; @@ -507,7 +509,7 @@ hsa_status_t ImageManagerNv::ModifyImageSrd( return HSA_STATUS_SUCCESS; } -hsa_status_t ImageManagerNv::PopulateSamplerSrd(amd::Sampler& sampler) const { +hsa_status_t ImageManagerNv::PopulateSamplerSrd(Sampler& sampler) const { const hsa_ext_sampler_descriptor_t sampler_descriptor = sampler.desc; SQ_IMG_SAMP_WORD0 word0; @@ -720,9 +722,8 @@ hsa_status_t ImageManagerNv::FillImage(const Image& image, const void* pattern, break; } - hsa_status_t status = - ext_image::ImageRuntime::instance()->blit_kernel().FillImage( - blit_queue_, blit_code_catalog_, *image_view, new_pattern, region); + hsa_status_t status = ImageRuntime::instance()->blit_kernel().FillImage( + blit_queue_, blit_code_catalog_, *image_view, new_pattern, region); // Revert back original configuration. if (word3_buff != NULL) { @@ -740,4 +741,5 @@ hsa_status_t ImageManagerNv::FillImage(const Image& image, const void* pattern, return status; } -} // namespace amd +} // namespace image +} // namespace rocr diff --git a/runtime/hsa-runtime/image/image_manager_nv.h b/runtime/hsa-runtime/image/image_manager_nv.h index a06131ddbc..6421d6cbc8 100755 --- a/runtime/hsa-runtime/image/image_manager_nv.h +++ b/runtime/hsa-runtime/image/image_manager_nv.h @@ -4,7 +4,8 @@ #include "addrlib/inc/addrinterface.h" #include "image_manager_kv.h" -namespace amd { +namespace rocr { +namespace image { class ImageManagerNv : public ImageManagerKv { public: @@ -48,6 +49,8 @@ class ImageManagerNv : public ImageManagerKv { private: DISALLOW_COPY_AND_ASSIGN(ImageManagerNv); -}; // namespace amd -} +}; + +} // namespace image +} // namespace rocr #endif // EXT_IMAGE_IMAGE_MANAGER_NV_H_ diff --git a/runtime/hsa-runtime/image/image_runtime.cpp b/runtime/hsa-runtime/image/image_runtime.cpp index 869ee464ad..9a3ca5b500 100755 --- a/runtime/hsa-runtime/image/image_runtime.cpp +++ b/runtime/hsa-runtime/image/image_runtime.cpp @@ -5,16 +5,17 @@ #include #include +#include "core/inc/hsa_internal.h" +#include "core/inc/hsa_ext_amd_impl.h" #include "resource.h" #include "image_manager_kv.h" #include "image_manager_ai.h" #include "image_manager_nv.h" #include "device_info.h" -// Per library unload callback function. -extern "C" void (*UnloadCallback)(); +namespace rocr { +namespace image { -namespace ext_image { std::atomic ImageRuntime::instance_(NULL); std::mutex ImageRuntime::instance_mutex_; @@ -26,17 +27,16 @@ hsa_status_t FindKernelArgPool(hsa_amd_memory_pool_t pool, void* data) { uint32_t flag; size_t size; - err = hsa_amd_memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_SEGMENT, - &segment); + err = AMD::hsa_amd_memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_SEGMENT, &segment); assert(err == HSA_STATUS_SUCCESS); if (segment != HSA_AMD_SEGMENT_GLOBAL) return HSA_STATUS_SUCCESS; - err = hsa_amd_memory_pool_get_info( + err = AMD::hsa_amd_memory_pool_get_info( pool, HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS, &flag); assert(err == HSA_STATUS_SUCCESS); - err = hsa_amd_memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_SIZE, &size); + err = AMD::hsa_amd_memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_SIZE, &size); assert(err == HSA_STATUS_SUCCESS); if (((HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_KERNARG_INIT & flag) == 1) && (size != 0)) { @@ -53,7 +53,7 @@ hsa_status_t ImageRuntime::CreateImageManager(hsa_agent_t agent, void* data) { hsa_device_type_t hsa_device_type; hsa_status_t hsa_error_code = - hsa_agent_get_info(agent, HSA_AGENT_INFO_DEVICE, &hsa_device_type); + HSA::hsa_agent_get_info(agent, HSA_AGENT_INFO_DEVICE, &hsa_device_type); if (hsa_error_code != HSA_STATUS_SUCCESS) { return hsa_error_code; } @@ -64,14 +64,14 @@ hsa_status_t ImageRuntime::CreateImageManager(hsa_agent_t agent, void* data) { hsa_error_code = GetGPUAsicID(agent, &chip_id); uint32_t major_ver = MajorVerFromDevID(chip_id); - amd::ImageManager* image_manager; + ImageManager* image_manager; if (major_ver >= 10) { - image_manager = new amd::ImageManagerNv(); + image_manager = new ImageManagerNv(); } else if (major_ver >= 9) { - image_manager = new amd::ImageManagerAi(); + image_manager = new ImageManagerAi(); } else { - image_manager = new amd::ImageManagerKv(); + image_manager = new ImageManagerKv(); } hsa_error_code = image_manager->Initialize(agent); @@ -83,8 +83,7 @@ hsa_status_t ImageRuntime::CreateImageManager(hsa_agent_t agent, void* data) { runtime->image_managers_[agent.handle] = image_manager; } else if (hsa_device_type == HSA_DEVICE_TYPE_CPU) { uint32_t caches[4] = {0}; - hsa_error_code = - hsa_agent_get_info(agent, HSA_AGENT_INFO_CACHE_SIZE, caches); + hsa_error_code = HSA::hsa_agent_get_info(agent, HSA_AGENT_INFO_CACHE_SIZE, caches); if (hsa_error_code != HSA_STATUS_SUCCESS) { return hsa_error_code; @@ -116,7 +115,7 @@ ImageRuntime* ImageRuntime::instance() { return NULL; } - UnloadCallback = &ext_image::ImageRuntime::DestroySingleton; + // UnloadCallback = &ext_image::ImageRuntime::DestroySingleton; } return instance; @@ -131,7 +130,7 @@ ImageRuntime* ImageRuntime::CreateSingleton() { return NULL; } - if (HSA_STATUS_SUCCESS != hsa_iterate_agents(CreateImageManager, instance)) { + if (HSA_STATUS_SUCCESS != HSA::hsa_iterate_agents(CreateImageManager, instance)) { instance->Cleanup(); delete instance; return NULL; @@ -213,8 +212,7 @@ hsa_status_t ImageRuntime::GetImageInfoMaxDimension(hsa_agent_t component, uint32_t array_size = 0; hsa_device_type_t device_type; - hsa_status_t status = - hsa_agent_get_info(component, HSA_AGENT_INFO_DEVICE, &device_type); + hsa_status_t status = HSA::hsa_agent_get_info(component, HSA_AGENT_INFO_DEVICE, &device_type); if (status != HSA_STATUS_SUCCESS) { return status; } @@ -245,14 +243,13 @@ hsa_status_t ImageRuntime::GetImageCapability( hsa_agent_t component, const hsa_ext_image_format_t& format, hsa_ext_image_geometry_t geometry, uint32_t& capability) { hsa_device_type_t device_type; - hsa_status_t status = - hsa_agent_get_info(component, HSA_AGENT_INFO_DEVICE, &device_type); + hsa_status_t status = HSA::hsa_agent_get_info(component, HSA_AGENT_INFO_DEVICE, &device_type); if (status != HSA_STATUS_SUCCESS) { return status; } if (device_type == HSA_DEVICE_TYPE_GPU) { - amd::ImageManager* manager = image_manager(component); + ImageManager* manager = image_manager(component); capability = manager->GetImageProperty(component, format, geometry).cap; } else { // Image is only supported on a GPU device. @@ -290,7 +287,7 @@ hsa_status_t ImageRuntime::GetImageSizeAndAlignment( uint32_t max_depth = 0; uint32_t max_array_size = 0; - amd::ImageManager* manager = image_manager(component); + ImageManager* manager = image_manager(component); // Validate the image dimension. manager->GetImageInfoMaxDimension(component, geometry, max_width, max_height, @@ -333,7 +330,7 @@ hsa_status_t ImageRuntime::CreateImageHandle( return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - amd::Image* image = amd::Image::Create(component); + Image* image = Image::Create(component); image->component = component; image->desc = image_descriptor; image->permission = access_permission; @@ -341,14 +338,15 @@ hsa_status_t ImageRuntime::CreateImageHandle( image->row_pitch = image_data_row_pitch; image->slice_pitch = image_data_slice_pitch; hsa_profile_t profile; - status = hsa_agent_get_info(component, HSA_AGENT_INFO_PROFILE, &profile); + status = HSA::hsa_agent_get_info(component, HSA_AGENT_INFO_PROFILE, &profile); if (image_data_layout == HSA_EXT_IMAGE_DATA_LAYOUT_LINEAR) { - image->tile_mode = amd::Image::TileMode::LINEAR; + image->tile_mode = Image::TileMode::LINEAR; } else { - amd::Image::TileMode tileMode = (profile == HSA_PROFILE_BASE && - image_descriptor.geometry != HSA_EXT_IMAGE_GEOMETRY_1DB)? - amd::Image::TileMode::TILED : amd::Image::TileMode::LINEAR; + Image::TileMode tileMode = + (profile == HSA_PROFILE_BASE && image_descriptor.geometry != HSA_EXT_IMAGE_GEOMETRY_1DB) + ? Image::TileMode::TILED + : Image::TileMode::LINEAR; image->tile_mode = tileMode; } @@ -372,22 +370,22 @@ hsa_status_t ImageRuntime::CreateImageHandleWithLayout( return (hsa_status_t)HSA_EXT_STATUS_ERROR_IMAGE_FORMAT_UNSUPPORTED; uint32_t id; - hsa_agent_get_info(component, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_CHIP_ID, &id); + HSA::hsa_agent_get_info(component, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_CHIP_ID, &id); if(image_layout->deviceID!=(0x1002<<16|id)) return (hsa_status_t)HSA_EXT_STATUS_ERROR_IMAGE_FORMAT_UNSUPPORTED; - - const amd::metadata_amd_t* desc=reinterpret_cast(image_layout); - amd::Image* image = amd::Image::Create(component); + const metadata_amd_t* desc = reinterpret_cast(image_layout); + + Image* image = Image::Create(component); image->component = component; image->desc = image_descriptor; image->permission = access_permission; image->data = const_cast(image_data); - image->tile_mode=amd::Image::TILED; + image->tile_mode = Image::TILED; hsa_status_t err=image_manager(component)->PopulateImageSrd(*image, desc); if(err!=HSA_STATUS_SUCCESS) { - amd::Image::Destroy(image); + Image::Destroy(image); return err; } @@ -397,13 +395,13 @@ hsa_status_t ImageRuntime::CreateImageHandleWithLayout( hsa_status_t ImageRuntime::DestroyImageHandle( const hsa_ext_image_t& image_handle) { - const amd::Image* image = amd::Image::Convert(image_handle.handle); + const Image* image = Image::Convert(image_handle.handle); if (image == NULL) { return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - amd::Image::Destroy(const_cast(image)); + Image::Destroy(const_cast(image)); return HSA_STATUS_SUCCESS; } @@ -412,13 +410,13 @@ hsa_status_t ImageRuntime::CopyBufferToImage( const void* src_memory, size_t src_row_pitch, size_t src_slice_pitch, const hsa_ext_image_t& dst_image_handle, const hsa_ext_image_region_t& image_region) { - const amd::Image* dst_image = amd::Image::Convert(dst_image_handle.handle); + const Image* dst_image = Image::Convert(dst_image_handle.handle); if (dst_image == NULL) { return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - amd::ImageManager* manager = image_manager(dst_image->component); + ImageManager* manager = image_manager(dst_image->component); return manager->CopyBufferToImage(src_memory, src_row_pitch, src_slice_pitch, *dst_image, image_region); } @@ -427,13 +425,13 @@ hsa_status_t ImageRuntime::CopyImageToBuffer( const hsa_ext_image_t& src_image_handle, void* dst_memory, size_t dst_row_pitch, size_t dst_slice_pitch, const hsa_ext_image_region_t& image_region) { - const amd::Image* src_image = amd::Image::Convert(src_image_handle.handle); + const Image* src_image = Image::Convert(src_image_handle.handle); if (src_image == NULL) { return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - amd::ImageManager* manager = image_manager(src_image->component); + ImageManager* manager = image_manager(src_image->component); return manager->CopyImageToBuffer(*src_image, dst_memory, dst_row_pitch, dst_slice_pitch, image_region); } @@ -443,13 +441,13 @@ hsa_status_t ImageRuntime::CopyImage(const hsa_ext_image_t& src_image_handle, const hsa_dim3_t& src_origin, const hsa_dim3_t& dst_origin, const hsa_dim3_t size) { - const amd::Image* src_image = amd::Image::Convert(src_image_handle.handle); + const Image* src_image = Image::Convert(src_image_handle.handle); if (src_image == NULL) { return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - const amd::Image* dst_image = amd::Image::Convert(dst_image_handle.handle); + const Image* dst_image = Image::Convert(dst_image_handle.handle); if (dst_image == NULL) { return HSA_STATUS_ERROR_INVALID_ARGUMENT; @@ -459,7 +457,7 @@ hsa_status_t ImageRuntime::CopyImage(const hsa_ext_image_t& src_image_handle, return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - amd::ImageManager* manager = image_manager(src_image->component); + ImageManager* manager = image_manager(src_image->component); return manager->CopyImage(*dst_image, *src_image, dst_origin, src_origin, size); } @@ -467,13 +465,13 @@ hsa_status_t ImageRuntime::CopyImage(const hsa_ext_image_t& src_image_handle, hsa_status_t ImageRuntime::FillImage( const hsa_ext_image_t& image_handle, const void* pattern, const hsa_ext_image_region_t& image_region) { - const amd::Image* image = amd::Image::Convert(image_handle.handle); + const Image* image = Image::Convert(image_handle.handle); if (image == NULL) { return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - amd::ImageManager* manager = image_manager(image->component); + ImageManager* manager = image_manager(image->component); return manager->FillImage(*image, pattern, image_region); } @@ -484,8 +482,7 @@ hsa_status_t ImageRuntime::CreateSamplerHandle( sampler_handle.handle = 0; hsa_device_type_t device_type; - hsa_status_t status = - hsa_agent_get_info(component, HSA_AGENT_INFO_DEVICE, &device_type); + hsa_status_t status = HSA::hsa_agent_get_info(component, HSA_AGENT_INFO_DEVICE, &device_type); if (status != HSA_STATUS_SUCCESS) { return status; } @@ -495,7 +492,7 @@ hsa_status_t ImageRuntime::CreateSamplerHandle( return HSA_STATUS_ERROR_INVALID_AGENT; } - amd::Sampler* sampler = amd::Sampler::Create(component); + Sampler* sampler = Sampler::Create(component); if (sampler == NULL) { return HSA_STATUS_ERROR_OUT_OF_RESOURCES; } @@ -511,13 +508,13 @@ hsa_status_t ImageRuntime::CreateSamplerHandle( hsa_status_t ImageRuntime::DestroySamplerHandle( hsa_ext_sampler_t& sampler_handle) { - const amd::Sampler* sampler = amd::Sampler::Convert(sampler_handle.handle); + const Sampler* sampler = Sampler::Convert(sampler_handle.handle); if (sampler == NULL) { return HSA_STATUS_ERROR_INVALID_ARGUMENT; } - amd::Sampler::Destroy(sampler); + Sampler::Destroy(sampler); return HSA_STATUS_SUCCESS; } @@ -528,7 +525,7 @@ ImageRuntime::ImageRuntime() ImageRuntime::~ImageRuntime() {} void ImageRuntime::Cleanup() { - std::map::iterator it; + std::map::iterator it; for (it = image_managers_.begin(); it != image_managers_.end(); ++it) { it->second->Cleanup(); delete it->second; @@ -537,4 +534,5 @@ void ImageRuntime::Cleanup() { blit_kernel_.Cleanup(); } -} // namespace +} // namespace image +} // namespace rocr diff --git a/runtime/hsa-runtime/image/image_runtime.h b/runtime/hsa-runtime/image/image_runtime.h index a75ab6fb70..00d6e771cb 100644 --- a/runtime/hsa-runtime/image/image_runtime.h +++ b/runtime/hsa-runtime/image/image_runtime.h @@ -9,16 +9,15 @@ #include "inc/hsa.h" -#undef HSA_API -#define HSA_API - #include "inc/hsa_ext_image.h" #include "inc/hsa_ext_amd.h" #include "blit_kernel.h" #include "image_manager.h" #include "util.h" -namespace ext_image { +namespace rocr { +namespace image { + class ImageRuntime { public: /// @brief Getter for the ImageRuntime singleton object. @@ -98,13 +97,12 @@ class ImageRuntime { /// @brief Destroy the device sampler object referenced by the handle. hsa_status_t DestroySamplerHandle(hsa_ext_sampler_t& sampler); - amd::ImageManager* image_manager(hsa_agent_t agent) { - std::map::iterator it = - image_managers_.find(agent.handle); + ImageManager* image_manager(hsa_agent_t agent) { + std::map::iterator it = image_managers_.find(agent.handle); return (it != image_managers_.end()) ? it->second : NULL; } - amd::BlitKernel& blit_kernel() { return blit_kernel_; } + BlitKernel& blit_kernel() { return blit_kernel_; } size_t cpu_l2_cache_size() const { return cpu_l2_cache_size_; } @@ -131,10 +129,10 @@ class ImageRuntime { /// @brief Contains mapping of agent and its corresponding ::ImageManager /// object. - std::map image_managers_; + std::map image_managers_; /// @brief Manages kernel for accessing images. - amd::BlitKernel blit_kernel_; + BlitKernel blit_kernel_; size_t cpu_l2_cache_size_; @@ -143,5 +141,6 @@ class ImageRuntime { DISALLOW_COPY_AND_ASSIGN(ImageRuntime); }; -} // namespace +} // namespace image +} // namespace rocr #endif // HSA_RUNTIME_EXT_IMAGE_IMAGE_RUNTIME_H diff --git a/runtime/hsa-runtime/image/inc/hsa_ext_image_impl.h b/runtime/hsa-runtime/image/inc/hsa_ext_image_impl.h new file mode 100644 index 0000000000..40b876a8f2 --- /dev/null +++ b/runtime/hsa-runtime/image/inc/hsa_ext_image_impl.h @@ -0,0 +1,90 @@ +#ifndef HSA_RUNTIME_EXT_IMAGE_H +#define HSA_RUNTIME_EXT_IMAGE_H + +#include "inc/hsa.h" +#include "inc/hsa_ext_amd.h" +#include "inc/hsa_ext_image.h" +#include "core/inc/hsa_ext_interface.h" + +//---------------------------------------------------------------------------// +// APIs that implement Image functionality +//---------------------------------------------------------------------------// + +namespace rocr { +namespace image { + +hsa_status_t hsa_amd_image_get_info_max_dim(hsa_agent_t agent, hsa_agent_info_t attribute, + void* value); + +hsa_status_t hsa_ext_image_get_capability(hsa_agent_t agent, + hsa_ext_image_geometry_t image_geometry, + const hsa_ext_image_format_t* image_format, + uint32_t* capability_mask); + +hsa_status_t hsa_ext_image_data_get_info(hsa_agent_t agent, + const hsa_ext_image_descriptor_t* image_descriptor, + hsa_access_permission_t access_permission, + hsa_ext_image_data_info_t* image_data_info); + +hsa_status_t hsa_ext_image_create(hsa_agent_t agent, + const hsa_ext_image_descriptor_t* image_descriptor, + const void* image_data, hsa_access_permission_t access_permission, + hsa_ext_image_t* image); + +hsa_status_t hsa_ext_image_destroy(hsa_agent_t agent, hsa_ext_image_t image); + +hsa_status_t hsa_ext_image_copy(hsa_agent_t agent, hsa_ext_image_t src_image, + const hsa_dim3_t* src_offset, hsa_ext_image_t dst_image, + const hsa_dim3_t* dst_offset, const hsa_dim3_t* range); + +hsa_status_t hsa_ext_image_import(hsa_agent_t agent, const void* src_memory, size_t src_row_pitch, + size_t src_slice_pitch, hsa_ext_image_t dst_image, + const hsa_ext_image_region_t* image_region); + +hsa_status_t hsa_ext_image_export(hsa_agent_t agent, hsa_ext_image_t src_image, void* dst_memory, + size_t dst_row_pitch, size_t dst_slice_pitch, + const hsa_ext_image_region_t* image_region); + +hsa_status_t hsa_ext_image_clear(hsa_agent_t agent, hsa_ext_image_t image, const void* data, + const hsa_ext_image_region_t* image_region); + +hsa_status_t hsa_ext_sampler_create(hsa_agent_t agent, + const hsa_ext_sampler_descriptor_t* sampler_descriptor, + hsa_ext_sampler_t* sampler); + +hsa_status_t hsa_ext_sampler_destroy(hsa_agent_t agent, hsa_ext_sampler_t sampler); + +hsa_status_t hsa_ext_image_get_capability_with_layout(hsa_agent_t agent, + hsa_ext_image_geometry_t image_geometry, + const hsa_ext_image_format_t* image_format, + hsa_ext_image_data_layout_t image_data_layout, + uint32_t* capability_mask); + +hsa_status_t hsa_ext_image_data_get_info_with_layout( + hsa_agent_t agent, const hsa_ext_image_descriptor_t* image_descriptor, + hsa_access_permission_t access_permission, hsa_ext_image_data_layout_t image_data_layout, + size_t image_data_row_pitch, size_t image_data_slice_pitch, + hsa_ext_image_data_info_t* image_data_info); + +hsa_status_t hsa_ext_image_create_with_layout( + hsa_agent_t agent, const hsa_ext_image_descriptor_t* image_descriptor, const void* image_data, + hsa_access_permission_t access_permission, hsa_ext_image_data_layout_t image_data_layout, + size_t image_data_row_pitch, size_t image_data_slice_pitch, hsa_ext_image_t* image); + +hsa_status_t hsa_amd_image_create(hsa_agent_t agent, + const hsa_ext_image_descriptor_t* image_descriptor, + const hsa_amd_image_descriptor_t* image_layout, + const void* image_data, hsa_access_permission_t access_permission, + hsa_ext_image_t* image); + +// Update Api table with func pointers that implement functionality +void LoadImage(core::ImageExtTableInternal* image_api, + decltype(::hsa_amd_image_create)** interface_api); + +// Release resources acquired by Image implementation +void ReleaseImageRsrcs(); + +} // namespace image +} // namespace rocr + +#endif // HSA_RUNTIME_EXT_IMAGE_H diff --git a/runtime/hsa-runtime/image/resource.h b/runtime/hsa-runtime/image/resource.h index a9943917c8..89214b1d20 100644 --- a/runtime/hsa-runtime/image/resource.h +++ b/runtime/hsa-runtime/image/resource.h @@ -26,8 +26,8 @@ (HSA_EXT_IMAGE_CAPABILITY_READ_ONLY | HSA_EXT_IMAGE_CAPABILITY_WRITE_ONLY | \ HSA_EXT_IMAGE_CAPABILITY_READ_WRITE) - -namespace amd { +namespace rocr { +namespace image { typedef struct metadata_amd_s { uint32_t version; // Must be 1 @@ -151,5 +151,6 @@ public: hsa_ext_sampler_descriptor_t desc; } Sampler; -} // namespace +} // namespace image +} // namespace rocr #endif // HSA_RUNTIME_EXT_IMAGE_RESOURCE_H diff --git a/runtime/hsa-runtime/image/resource_ai.h b/runtime/hsa-runtime/image/resource_ai.h index 4d5d6c92c5..6925198f25 100644 --- a/runtime/hsa-runtime/image/resource_ai.h +++ b/runtime/hsa-runtime/image/resource_ai.h @@ -7,7 +7,8 @@ #error "BIGENDIAN_CPU or LITTLEENDIAN_CPU must be defined" #endif -namespace amd { +namespace rocr { +namespace image { union SQ_BUF_RSRC_WORD0 { struct { @@ -1116,5 +1117,6 @@ typedef struct metadata_amd_ai_s { uint32_t mip_offsets[0]; //Mip level offset bits [39:8] for each level (if any) } metadata_amd_ai_t; -} // namespace +} // namespace image +} // namespace rocr #endif // HSA_RUNTIME_EXT_IMAGE_RESOURCE_AI_H diff --git a/runtime/hsa-runtime/image/resource_kv.h b/runtime/hsa-runtime/image/resource_kv.h index c1df1ffb56..a451dfde8d 100644 --- a/runtime/hsa-runtime/image/resource_kv.h +++ b/runtime/hsa-runtime/image/resource_kv.h @@ -7,7 +7,9 @@ #error "BIGENDIAN_CPU or LITTLEENDIAN_CPU must be defined" #endif -namespace amd { +namespace rocr { +namespace image { + union SQ_BUF_RSRC_WORD0 { struct { #if defined(LITTLEENDIAN_CPU) @@ -459,5 +461,6 @@ typedef struct metadata_amd_ci_vi_s { uint32_t mip_offsets[0]; //Mip level offset bits [39:8] for each level (if any) } metadata_amd_ci_vi_t; -} // namespace -#endif // HSA_RUNTIME_EXT_IMAGE_RESOURCE_KV_H \ No newline at end of file +} // namespace image +} // namespace rocr +#endif // HSA_RUNTIME_EXT_IMAGE_RESOURCE_KV_H diff --git a/runtime/hsa-runtime/image/resource_nv.h b/runtime/hsa-runtime/image/resource_nv.h index 4fb592371a..47cc63e9ad 100755 --- a/runtime/hsa-runtime/image/resource_nv.h +++ b/runtime/hsa-runtime/image/resource_nv.h @@ -7,7 +7,8 @@ #error "BIGENDIAN_CPU or LITTLEENDIAN_CPU must be defined" #endif -namespace amd { +namespace rocr { +namespace image { /**********************************************************/ /**********************************************************/ @@ -830,5 +831,6 @@ typedef struct metadata_amd_nv_s { uint32_t mip_offsets[0]; } metadata_amd_nv_t; -} // namespace amd +} // namespace image +} // namespace rocr #endif // EXT_IMAGE_RESOURCE_NV_H_ diff --git a/runtime/hsa-runtime/image/util.h b/runtime/hsa-runtime/image/util.h index 6d82138472..3b51ca55d2 100644 --- a/runtime/hsa-runtime/image/util.h +++ b/runtime/hsa-runtime/image/util.h @@ -1,40 +1,46 @@ #ifndef HSA_RUNTIME_EXT_IMAGE_UTIL_H #define HSA_RUNTIME_EXT_IMAGE_UTIL_H +#include "stdint.h" +#include "stddef.h" +#include "stdlib.h" #include -#include +#include +#include +#include #include "inc/hsa.h" -// A macro to disallow the copy and move constructor and operator= functions -// This should be used in the private: declarations for a class -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - TypeName(TypeName&&); \ - void operator=(const TypeName&); \ - void operator=(TypeName&&); +namespace rocr { +namespace image { #if defined(_MSC_VER) #define ALIGNED_(x) __declspec(align(x)) #else #if defined(__GNUC__) -#define ALIGNED_(x) __attribute__ ((aligned(x))) -#endif // __GNUC__ +#define ALIGNED_(x) __attribute__((aligned(x))) +#endif // __GNUC__ #endif // _MSC_VER #define MULTILINE(...) # __VA_ARGS__ +} // namespace image +} // namespace rocr + + #if defined(__GNUC__) #include "mm_malloc.h" #if defined(__i386__) || defined(__x86_64__) #include #else -#error \ +#error \ "Processor not identified. " \ - "Need to provide a lightweight approximate clock interface (aka __rdtsc())." + "Need to provide a lightweight approximate clock interface (aka __rdtsc())." #endif -namespace ext_image { +namespace rocr { +namespace image { + #define __forceinline __inline__ __attribute__((always_inline)) static __forceinline void __debugbreak() { __builtin_trap(); } #define __declspec(x) __attribute__((x)) @@ -43,17 +49,94 @@ static __forceinline void __debugbreak() { __builtin_trap(); } #define __ALIGNED__(x) __attribute__((aligned(x))) static __forceinline void* _aligned_malloc(size_t size, size_t alignment) { - return _mm_malloc(size, alignment); +#ifdef _ISOC11_SOURCE + return aligned_alloc(alignment, size); +#else + void* mem = NULL; + if (NULL != posix_memalign(&mem, alignment, size)) return NULL; + return mem; +#endif } -static __forceinline void _aligned_free(void* ptr) { return _mm_free(ptr); } +static __forceinline void _aligned_free(void* ptr) { return free(ptr); } #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) #include "intrin.h" #define __ALIGNED__(x) __declspec(align(x)) -namespace ext_image { + +namespace rocr { +namespace image { #else #error "Compiler and/or processor not identified." #endif +// A macro to disallow the copy and move constructor and operator= functions +#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ + TypeName(const TypeName&) = delete; \ + TypeName(TypeName&&) = delete; \ + void operator=(const TypeName&) = delete; \ + void operator=(TypeName&&) = delete; + +template class ScopeGuard { + public: + explicit __forceinline ScopeGuard(const lambda& release) : release_(release), dismiss_(false) {} + + ScopeGuard(ScopeGuard& rhs) { *this = rhs; } + + __forceinline ~ScopeGuard() { + if (!dismiss_) release_(); + } + __forceinline ScopeGuard& operator=(ScopeGuard& rhs) { + dismiss_ = rhs.dismiss_; + release_ = rhs.release_; + rhs.dismiss_ = true; + } + __forceinline void Dismiss() { dismiss_ = true; } + + private: + lambda release_; + bool dismiss_; +}; + +template static __forceinline ScopeGuard MakeScopeGuard(lambda rel) { + return ScopeGuard(rel); +} + +#define MAKE_SCOPE_GUARD_HELPER(lname, sname, ...) \ + auto lname = __VA_ARGS__; \ + ScopeGuard sname(lname); +#define MAKE_SCOPE_GUARD(...) \ + MAKE_SCOPE_GUARD_HELPER(PASTE(scopeGuardLambda, __COUNTER__), PASTE(scopeGuard, __COUNTER__), \ + __VA_ARGS__) +#define MAKE_NAMED_SCOPE_GUARD(name, ...) \ + MAKE_SCOPE_GUARD_HELPER(PASTE(scopeGuardLambda, __COUNTER__), name, __VA_ARGS__) + +/// @brief: Finds out the min one of two inputs, input must support ">" +/// operator. +/// @param: a(Input), a reference to type T. +/// @param: b(Input), a reference to type T. +/// @return: T. +template static __forceinline T Min(const T& a, const T& b) { return (a > b) ? b : a; } + +template static __forceinline T Min(const T& a, const T& b, Arg... args) { + return Min(a, Min(b, args...)); +} + +/// @brief: Find out the max one of two inputs, input must support ">" operator. +/// @param: a(Input), a reference to type T. +/// @param: b(Input), a reference to type T. +/// @return: T. +template static __forceinline T Max(const T& a, const T& b) { return (b > a) ? b : a; } + +template static __forceinline T Max(const T& a, const T& b, Arg... args) { + return Max(a, Max(b, args...)); +} + +/// @brief: Free the memory space which is newed previously. +/// @param: ptr(Input), a pointer to memory space. Can't be NULL. +/// @return: void. +struct DeleteObject { + template void operator()(const T* ptr) const { delete ptr; } +}; + /// @brief: Checks if a value is power of two, if it is, return true. Be careful /// when passing 0. /// @param: val(Input), the data to be checked. @@ -148,6 +231,24 @@ static __forceinline uint64_t NextPow2(uint64_t value) { return v + 1; } +static __forceinline bool strIsEmpty(const char* str) noexcept { return str[0] == '\0'; } + +static __forceinline std::string& ltrim(std::string& s) { + auto it = std::find_if(s.begin(), s.end(), + [](char c) { return !std::isspace(c, std::locale::classic()); }); + s.erase(s.begin(), it); + return s; +} + +static __forceinline std::string& rtrim(std::string& s) { + auto it = std::find_if(s.rbegin(), s.rend(), + [](char c) { return !std::isspace(c, std::locale::classic()); }); + s.erase(it.base(), s.end()); + return s; +} + +static __forceinline std::string& trim(std::string& s) { return ltrim(rtrim(s)); } + template static __forceinline uint32_t BitSelect(T p) { static_assert(sizeof(T) <= sizeof(uintptr_t), "Type out of range."); @@ -192,22 +293,7 @@ inline uint32_t PtrHigh32(const void* p) { return ptr; } -/** -* Generic functor compatible with the STL algorithms that enables proper -* destruction of a container of pointers. If (for instance), \c v is a vector -* of pointers to objects of type T, then the destructors of the elements in -* \c v are invoked when calling -* \code{std::for_each(v.begin(), v.end(), DeleteObject())} -* -* The original code and further information about this function object can be -* found in "Effective STL", 1st edition, item 7. -*/ -struct DeleteObject { - template - void operator()(const T *ptr) const { - delete ptr; - } -}; -} // namespace ext_image +} // namespace image +} // namespace rocr #endif // HSA_RUNTIME_EXT_IMAGE_UTIL_H