mirror of
https://github.com/xmrig/xmrig.git
synced 2024-11-17 08:17:40 +00:00
Merge branch 'evo' into dev
This commit is contained in:
commit
a4d086c451
152 changed files with 12379 additions and 8777 deletions
22
CHANGELOG.md
22
CHANGELOG.md
|
@ -1,3 +1,25 @@
|
||||||
|
# v6.2.1
|
||||||
|
- [#1728](https://github.com/xmrig/xmrig/issues/1728) Fixed, 32 bit Windows builds was crash on start.
|
||||||
|
- [#1729](https://github.com/xmrig/xmrig/pull/1729) Fixed KawPow crash on old CPUs.
|
||||||
|
- [#1730](https://github.com/xmrig/xmrig/pull/1730) Improved displaying information for compute errors on GPUs.
|
||||||
|
- [#1732](https://github.com/xmrig/xmrig/pull/1732) Fixed NiceHash disconnects for KawPow.
|
||||||
|
- Fixed AMD GPU health (temperatures/power/clocks/fans) readings on Linux.
|
||||||
|
|
||||||
|
# v6.2.0-beta
|
||||||
|
- [#1717](https://github.com/xmrig/xmrig/pull/1717) Added new algorithm `cn/ccx` for Conceal.
|
||||||
|
- [#1718](https://github.com/xmrig/xmrig/pull/1718) Fixed, linker on Linux was marking entire executable as having an executable stack.
|
||||||
|
- [#1720](https://github.com/xmrig/xmrig/pull/1720) Fixed broken CryptoNight algorithms family with gcc 10.1.
|
||||||
|
|
||||||
|
# v6.0.1-beta
|
||||||
|
- [#1708](https://github.com/xmrig/xmrig/issues/1708) Added `title` option.
|
||||||
|
- [#1711](https://github.com/xmrig/xmrig/pull/1711) [cuda] Print errors from KawPow DAG initialization.
|
||||||
|
- [#1713](https://github.com/xmrig/xmrig/pull/1713) [cuda] Reduced memory usage for KawPow, minimum CUDA plugin version now is 6.1.0.
|
||||||
|
|
||||||
|
# v6.0.0-beta
|
||||||
|
- [#1694](https://github.com/xmrig/xmrig/pull/1694) Added support for KawPow algorithm (Ravencoin) on AMD/NVIDIA.
|
||||||
|
- Removed previously deprecated `cn/gpu` algorithm.
|
||||||
|
- Default donation level reduced to 1% but you still can increase it if you like.
|
||||||
|
|
||||||
# v5.11.3
|
# v5.11.3
|
||||||
- [#1718](https://github.com/xmrig/xmrig/pull/1718) Fixed, linker on Linux was marking entire executable as having an executable stack.
|
- [#1718](https://github.com/xmrig/xmrig/pull/1718) Fixed, linker on Linux was marking entire executable as having an executable stack.
|
||||||
- [#1720](https://github.com/xmrig/xmrig/pull/1720) Fixed broken CryptoNight algorithms family with gcc 10.1.
|
- [#1720](https://github.com/xmrig/xmrig/pull/1720) Fixed broken CryptoNight algorithms family with gcc 10.1.
|
||||||
|
|
|
@ -6,10 +6,10 @@ option(WITH_HWLOC "Enable hwloc support" ON)
|
||||||
option(WITH_CN_LITE "Enable CryptoNight-Lite algorithms family" ON)
|
option(WITH_CN_LITE "Enable CryptoNight-Lite algorithms family" ON)
|
||||||
option(WITH_CN_HEAVY "Enable CryptoNight-Heavy algorithms family" ON)
|
option(WITH_CN_HEAVY "Enable CryptoNight-Heavy algorithms family" ON)
|
||||||
option(WITH_CN_PICO "Enable CryptoNight-Pico algorithm" ON)
|
option(WITH_CN_PICO "Enable CryptoNight-Pico algorithm" ON)
|
||||||
option(WITH_CN_GPU "Enable CryptoNight-GPU algorithm" OFF)
|
|
||||||
option(WITH_RANDOMX "Enable RandomX algorithms family" ON)
|
option(WITH_RANDOMX "Enable RandomX algorithms family" ON)
|
||||||
option(WITH_ARGON2 "Enable Argon2 algorithms family" ON)
|
option(WITH_ARGON2 "Enable Argon2 algorithms family" ON)
|
||||||
option(WITH_ASTROBWT "Enable AstroBWT algorithms family" ON)
|
option(WITH_ASTROBWT "Enable AstroBWT algorithms family" ON)
|
||||||
|
option(WITH_KAWPOW "Enable KawPow algorithms family" ON)
|
||||||
option(WITH_HTTP "Enable HTTP protocol support (client/server)" ON)
|
option(WITH_HTTP "Enable HTTP protocol support (client/server)" ON)
|
||||||
option(WITH_DEBUG_LOG "Enable debug log output" OFF)
|
option(WITH_DEBUG_LOG "Enable debug log output" OFF)
|
||||||
option(WITH_TLS "Enable OpenSSL support" ON)
|
option(WITH_TLS "Enable OpenSSL support" ON)
|
||||||
|
@ -163,8 +163,8 @@ else()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_definitions(/D__STDC_FORMAT_MACROS)
|
add_definitions(-DXMRIG_MINER_PROJECT)
|
||||||
add_definitions(/DUNICODE)
|
add_definitions(-D__STDC_FORMAT_MACROS -DUNICODE)
|
||||||
|
|
||||||
find_package(UV REQUIRED)
|
find_package(UV REQUIRED)
|
||||||
|
|
||||||
|
@ -172,9 +172,9 @@ include(cmake/flags.cmake)
|
||||||
include(cmake/randomx.cmake)
|
include(cmake/randomx.cmake)
|
||||||
include(cmake/argon2.cmake)
|
include(cmake/argon2.cmake)
|
||||||
include(cmake/astrobwt.cmake)
|
include(cmake/astrobwt.cmake)
|
||||||
|
include(cmake/kawpow.cmake)
|
||||||
include(cmake/OpenSSL.cmake)
|
include(cmake/OpenSSL.cmake)
|
||||||
include(cmake/asm.cmake)
|
include(cmake/asm.cmake)
|
||||||
include(cmake/cn-gpu.cmake)
|
|
||||||
|
|
||||||
if (WITH_CN_LITE)
|
if (WITH_CN_LITE)
|
||||||
add_definitions(/DXMRIG_ALGO_CN_LITE)
|
add_definitions(/DXMRIG_ALGO_CN_LITE)
|
||||||
|
@ -204,8 +204,8 @@ if (WITH_DEBUG_LOG)
|
||||||
add_definitions(/DAPP_DEBUG)
|
add_definitions(/DAPP_DEBUG)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(${CMAKE_PROJECT_NAME} ${HEADERS} ${SOURCES} ${SOURCES_OS} ${SOURCES_CPUID} ${HEADERS_CRYPTO} ${SOURCES_CRYPTO} ${SOURCES_SYSLOG} ${TLS_SOURCES} ${XMRIG_ASM_SOURCES} ${CN_GPU_SOURCES})
|
add_executable(${CMAKE_PROJECT_NAME} ${HEADERS} ${SOURCES} ${SOURCES_OS} ${SOURCES_CPUID} ${HEADERS_CRYPTO} ${SOURCES_CRYPTO} ${SOURCES_SYSLOG} ${TLS_SOURCES} ${XMRIG_ASM_SOURCES})
|
||||||
target_link_libraries(${CMAKE_PROJECT_NAME} ${XMRIG_ASM_LIBRARY} ${OPENSSL_LIBRARIES} ${UV_LIBRARIES} ${EXTRA_LIBS} ${CPUID_LIB} ${ARGON2_LIBRARY})
|
target_link_libraries(${CMAKE_PROJECT_NAME} ${XMRIG_ASM_LIBRARY} ${OPENSSL_LIBRARIES} ${UV_LIBRARIES} ${EXTRA_LIBS} ${CPUID_LIB} ${ARGON2_LIBRARY} ${ETHASH_LIBRARY})
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
|
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
[![GitHub stars](https://img.shields.io/github/stars/xmrig/xmrig.svg)](https://github.com/xmrig/xmrig/stargazers)
|
[![GitHub stars](https://img.shields.io/github/stars/xmrig/xmrig.svg)](https://github.com/xmrig/xmrig/stargazers)
|
||||||
[![GitHub forks](https://img.shields.io/github/forks/xmrig/xmrig.svg)](https://github.com/xmrig/xmrig/network)
|
[![GitHub forks](https://img.shields.io/github/forks/xmrig/xmrig.svg)](https://github.com/xmrig/xmrig/network)
|
||||||
|
|
||||||
XMRig High performance, open source, cross platform RandomX, CryptoNight, AstroBWT and Argon2 CPU/GPU miner, with official support for Windows.
|
XMRig High performance, open source, cross platform RandomX, KawPow, CryptoNight, AstroBWT and Argon2 CPU/GPU miner, with official support for Windows.
|
||||||
|
|
||||||
## Mining backends
|
## Mining backends
|
||||||
- **CPU** (x64/x86/ARM)
|
- **CPU** (x64/x86/ARM)
|
||||||
|
@ -118,6 +118,8 @@ Misc:
|
||||||
-h, --help display this help and exit
|
-h, --help display this help and exit
|
||||||
--dry-run test configuration and exit
|
--dry-run test configuration and exit
|
||||||
--export-topology export hwloc topology to a XML file and exit
|
--export-topology export hwloc topology to a XML file and exit
|
||||||
|
--title set custom console window title
|
||||||
|
--no-title disable setting console window title
|
||||||
```
|
```
|
||||||
|
|
||||||
## Donations
|
## Donations
|
||||||
|
|
|
@ -3,12 +3,10 @@ if (WITH_ASTROBWT)
|
||||||
|
|
||||||
list(APPEND HEADERS_CRYPTO
|
list(APPEND HEADERS_CRYPTO
|
||||||
src/crypto/astrobwt/AstroBWT.h
|
src/crypto/astrobwt/AstroBWT.h
|
||||||
src/crypto/astrobwt/sha3.h
|
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND SOURCES_CRYPTO
|
list(APPEND SOURCES_CRYPTO
|
||||||
src/crypto/astrobwt/AstroBWT.cpp
|
src/crypto/astrobwt/AstroBWT.cpp
|
||||||
src/crypto/astrobwt/sha3.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if (XMRIG_ARM)
|
if (XMRIG_ARM)
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
if (WITH_CN_GPU AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
||||||
|
|
||||||
if (XMRIG_ARM)
|
|
||||||
set(CN_GPU_SOURCES src/crypto/cn/gpu/cn_gpu_arm.cpp)
|
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES GNU OR CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
|
||||||
set_source_files_properties(src/crypto/cn/gpu/cn_gpu_arm.cpp PROPERTIES COMPILE_FLAGS "-O3")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
set(CN_GPU_SOURCES src/crypto/cn/gpu/cn_gpu_avx.cpp src/crypto/cn/gpu/cn_gpu_ssse3.cpp)
|
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES GNU OR CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
|
||||||
set_source_files_properties(src/crypto/cn/gpu/cn_gpu_avx.cpp PROPERTIES COMPILE_FLAGS "-O3 -mavx2")
|
|
||||||
set_source_files_properties(src/crypto/cn/gpu/cn_gpu_ssse3.cpp PROPERTIES COMPILE_FLAGS "-O3")
|
|
||||||
elseif (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
|
||||||
set_source_files_properties(src/crypto/cn/gpu/cn_gpu_avx.cpp PROPERTIES COMPILE_FLAGS "/arch:AVX")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_definitions(/DXMRIG_ALGO_CN_GPU)
|
|
||||||
else()
|
|
||||||
set(CN_GPU_SOURCES "")
|
|
||||||
|
|
||||||
remove_definitions(/DXMRIG_ALGO_CN_GPU)
|
|
||||||
endif()
|
|
19
cmake/kawpow.cmake
Normal file
19
cmake/kawpow.cmake
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
if (WITH_KAWPOW)
|
||||||
|
add_definitions(/DXMRIG_ALGO_KAWPOW)
|
||||||
|
|
||||||
|
list(APPEND HEADERS_CRYPTO
|
||||||
|
src/crypto/kawpow/KPCache.h
|
||||||
|
src/crypto/kawpow/KPHash.h
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND SOURCES_CRYPTO
|
||||||
|
src/crypto/kawpow/KPCache.cpp
|
||||||
|
src/crypto/kawpow/KPHash.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_subdirectory(src/3rdparty/libethash)
|
||||||
|
set(ETHASH_LIBRARY ethash)
|
||||||
|
else()
|
||||||
|
remove_definitions(/DXMRIG_ALGO_KAWPOW)
|
||||||
|
set(ETHASH_LIBRARY "")
|
||||||
|
endif()
|
|
@ -6,38 +6,40 @@ Algorithm can be defined in 3 ways:
|
||||||
2. Per pool `coin` option, currently only usable values for this option is `monero` and `arqma`.
|
2. Per pool `coin` option, currently only usable values for this option is `monero` and `arqma`.
|
||||||
3. Per pool `algo` option.
|
3. Per pool `algo` option.
|
||||||
|
|
||||||
Option `coin` useful for pools without algorithm negotiation support or daemon to allow automatically switch algorithm in next hard fork.
|
Option `coin` useful for pools without [algorithm negotiation](https://xmrig.com/docs/extensions/algorithm-negotiation) support or daemon to allow automatically switch algorithm in next hard fork. If you use xmrig-proxy don't need specify algorithm on miner side.
|
||||||
|
|
||||||
## Algorithm names
|
## Algorithm names
|
||||||
|
|
||||||
| Name | Memory | Version | Notes |
|
| Name | Memory | Version | Description | Notes |
|
||||||
|------|--------|---------|-------|
|
|------|--------|---------|-------------|-------|
|
||||||
| `rx/sfx` | 2 MB | 5.4.0+ | RandomSFX (RandomX variant for Safex). |
|
| `kawpow` | - | 6.0.0+ | KawPow (Ravencoin) | GPU only |
|
||||||
| `rx/v` | 2 MB | 5.4.0+ | RandomV (RandomX variant for new MoneroV). |
|
| `rx/keva` | 1 MB | 5.9.0+ | RandomKEVA (RandomX variant for Keva). | |
|
||||||
| `rx/arq` | 256 KB | 4.3.0+ | RandomARQ (RandomX variant for ArQmA). |
|
| `astrobwt` | 20 MB | 5.8.0+ | AstroBWT (Dero). | |
|
||||||
| `rx/0` | 2 MB | 3.2.0+ | RandomX (Monero). |
|
| `cn-pico/tlo` | 256 KB | 5.5.0+ | CryptoNight-Pico (Talleo). | |
|
||||||
| `argon2/chukwa` | 512 KB | 3.1.0+ | Argon2id (Chukwa). |
|
| `rx/sfx` | 2 MB | 5.4.0+ | RandomSFX (RandomX variant for Safex). | |
|
||||||
| `argon2/wrkz` | 256 KB | 3.1.0+ | Argon2id (WRKZ) |
|
| `rx/arq` | 256 KB | 4.3.0+ | RandomARQ (RandomX variant for ArQmA). | |
|
||||||
| `rx/wow` | 1 MB | 3.0.0+ | RandomWOW (RandomX variant for Wownero). |
|
| `rx/0` | 2 MB | 3.2.0+ | RandomX (Monero). | |
|
||||||
| `rx/loki` | 2 MB | 3.0.0+ | RandomXL (RandomX variant for Loki). |
|
| `argon2/chukwa` | 512 KB | 3.1.0+ | Argon2id (Chukwa). | CPU only |
|
||||||
| `cn/fast` | 2 MB | 3.0.0+ | CryptoNight variant 1 with half iterations. |
|
| `argon2/wrkz` | 256 KB | 3.1.0+ | Argon2id (WRKZ) | CPU only |
|
||||||
| `cn/rwz` | 2 MB | 2.14.0+ | CryptoNight variant 2 with 3/4 iterations and reversed shuffle operation. |
|
| `rx/wow` | 1 MB | 3.0.0+ | RandomWOW (RandomX variant for Wownero). | |
|
||||||
| `cn/zls` | 2 MB | 2.14.0+ | CryptoNight variant 2 with 3/4 iterations. |
|
| `rx/loki` | 2 MB | 3.0.0+ | RandomXL (RandomX variant for Loki). | |
|
||||||
| `cn/double` | 2 MB | 2.14.0+ | CryptoNight variant 2 with double iterations. |
|
| `cn/fast` | 2 MB | 3.0.0+ | CryptoNight variant 1 with half iterations. | |
|
||||||
| `cn/r` | 2 MB | 2.13.0+ | CryptoNightR (Monero's variant 4). |
|
| `cn/rwz` | 2 MB | 2.14.0+ | CryptoNight variant 2 with 3/4 iterations and reversed shuffle operation. | |
|
||||||
| `cn/gpu` | 2 MB | 2.11.0+ | CryptoNight-GPU. |
|
| `cn/zls` | 2 MB | 2.14.0+ | CryptoNight variant 2 with 3/4 iterations. | |
|
||||||
| `cn-pico` | 256 KB | 2.10.0+ | CryptoNight-Pico. |
|
| `cn/double` | 2 MB | 2.14.0+ | CryptoNight variant 2 with double iterations. | |
|
||||||
| `cn/half` | 2 MB | 2.9.0+ | CryptoNight variant 2 with half iterations. |
|
| `cn/r` | 2 MB | 2.13.0+ | CryptoNightR (Monero's variant 4). | |
|
||||||
| `cn/2` | 2 MB | 2.8.0+ | CryptoNight variant 2. |
|
| `cn-pico` | 256 KB | 2.10.0+ | CryptoNight-Pico. | |
|
||||||
| `cn/xao` | 2 MB | 2.6.4+ | CryptoNight variant 0 (modified). |
|
| `cn/half` | 2 MB | 2.9.0+ | CryptoNight variant 2 with half iterations. | |
|
||||||
| `cn/rto` | 2 MB | 2.6.4+ | CryptoNight variant 1 (modified). |
|
| `cn/2` | 2 MB | 2.8.0+ | CryptoNight variant 2. | |
|
||||||
| `cn-heavy/tube` | 4 MB | 2.6.4+ | CryptoNight-Heavy (modified). |
|
| `cn/xao` | 2 MB | 2.6.4+ | CryptoNight variant 0 (modified). | |
|
||||||
| `cn-heavy/xhv` | 4 MB | 2.6.3+ | CryptoNight-Heavy (modified). |
|
| `cn/rto` | 2 MB | 2.6.4+ | CryptoNight variant 1 (modified). | |
|
||||||
| `cn-heavy/0` | 4 MB | 2.6.0+ | CryptoNight-Heavy. |
|
| `cn-heavy/tube` | 4 MB | 2.6.4+ | CryptoNight-Heavy (modified). | |
|
||||||
| `cn/1` | 2 MB | 2.5.0+ | CryptoNight variant 1. |
|
| `cn-heavy/xhv` | 4 MB | 2.6.3+ | CryptoNight-Heavy (modified). | |
|
||||||
| `cn-lite/1` | 1 MB | 2.5.0+ | CryptoNight-Lite variant 1. |
|
| `cn-heavy/0` | 4 MB | 2.6.0+ | CryptoNight-Heavy. | |
|
||||||
| `cn-lite/0` | 1 MB | 0.8.0+ | CryptoNight-Lite variant 0. |
|
| `cn/1` | 2 MB | 2.5.0+ | CryptoNight variant 1. | |
|
||||||
| `cn/0` | 2 MB | 0.5.0+ | CryptoNight (original). |
|
| `cn-lite/1` | 1 MB | 2.5.0+ | CryptoNight-Lite variant 1. | |
|
||||||
|
| `cn-lite/0` | 1 MB | 0.8.0+ | CryptoNight-Lite variant 0. | |
|
||||||
|
| `cn/0` | 2 MB | 0.5.0+ | CryptoNight (original). | |
|
||||||
|
|
||||||
## Migration to v3
|
## Migration to v3
|
||||||
Since version 3 mining [algorithm](#algorithm-names) should specified for each pool separately (`algo` option), earlier versions was use one global `algo` option and per pool `variant` option (this option was removed in v3). If your pool support [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/issues/168) you may not specify this option at all.
|
Since version 3 mining [algorithm](#algorithm-names) should specified for each pool separately (`algo` option), earlier versions was use one global `algo` option and per pool `variant` option (this option was removed in v3). If your pool support [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/issues/168) you may not specify this option at all.
|
||||||
|
|
1
doc/build/CMAKE_OPTIONS.md
vendored
1
doc/build/CMAKE_OPTIONS.md
vendored
|
@ -6,7 +6,6 @@
|
||||||
* **`-DWITH_CN_LITE=OFF`** disable all CryptoNight-Lite algorithms (`cn-lite/0`, `cn-lite/1`).
|
* **`-DWITH_CN_LITE=OFF`** disable all CryptoNight-Lite algorithms (`cn-lite/0`, `cn-lite/1`).
|
||||||
* **`-DWITH_CN_HEAVY=OFF`** disable all CryptoNight-Heavy algorithms (`cn-heavy/0`, `cn-heavy/xhv`, `cn-heavy/tube`).
|
* **`-DWITH_CN_HEAVY=OFF`** disable all CryptoNight-Heavy algorithms (`cn-heavy/0`, `cn-heavy/xhv`, `cn-heavy/tube`).
|
||||||
* **`-DWITH_CN_PICO=OFF`** disable CryptoNight-Pico algorithm (`cn-pico`).
|
* **`-DWITH_CN_PICO=OFF`** disable CryptoNight-Pico algorithm (`cn-pico`).
|
||||||
* **`-DWITH_CN_GPU=OFF`** disable CryptoNight-GPU algorithm (`cn/gpu`).
|
|
||||||
* **`-DWITH_RANDOMX=OFF`** disable RandomX algorithms (`rx/loki`, `rx/wow`).
|
* **`-DWITH_RANDOMX=OFF`** disable RandomX algorithms (`rx/loki`, `rx/wow`).
|
||||||
* **`-DWITH_ARGON2=OFF`** disable Argon2 algorithms (`argon2/chukwa`, `argon2/wrkz`).
|
* **`-DWITH_ARGON2=OFF`** disable Argon2 algorithms (`argon2/chukwa`, `argon2/wrkz`).
|
||||||
|
|
||||||
|
|
|
@ -43,15 +43,6 @@ function cn_r()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function cn_gpu()
|
|
||||||
{
|
|
||||||
const cn_gpu = opencl_minify(addIncludes('cryptonight_gpu.cl', [ 'wolf-aes.cl', 'keccak.cl' ]));
|
|
||||||
|
|
||||||
// fs.writeFileSync('cryptonight_gpu_gen.cl', cn_gpu);
|
|
||||||
fs.writeFileSync('cryptonight_gpu_cl.h', text2h(cn_gpu, 'xmrig', 'cryptonight_gpu_cl'));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function rx()
|
function rx()
|
||||||
{
|
{
|
||||||
let rx = addIncludes('randomx.cl', [
|
let rx = addIncludes('randomx.cl', [
|
||||||
|
@ -85,11 +76,21 @@ function astrobwt()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function kawpow()
|
||||||
|
{
|
||||||
|
const kawpow = opencl_minify(addIncludes('kawpow.cl', [ 'defs.h' ]));
|
||||||
|
const kawpow_dag = opencl_minify(addIncludes('kawpow_dag.cl', [ 'defs.h' ]));
|
||||||
|
|
||||||
|
// fs.writeFileSync('kawpow_gen.cl', kawpow);
|
||||||
|
fs.writeFileSync('kawpow_cl.h', text2h(kawpow, 'xmrig', 'kawpow_cl'));
|
||||||
|
fs.writeFileSync('kawpow_dag_cl.h', text2h(kawpow_dag, 'xmrig', 'kawpow_dag_cl'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
process.chdir(path.resolve('src/backend/opencl/cl/cn'));
|
process.chdir(path.resolve('src/backend/opencl/cl/cn'));
|
||||||
|
|
||||||
cn();
|
cn();
|
||||||
cn_r();
|
cn_r();
|
||||||
cn_gpu();
|
|
||||||
|
|
||||||
process.chdir(cwd);
|
process.chdir(cwd);
|
||||||
process.chdir(path.resolve('src/backend/opencl/cl/rx'));
|
process.chdir(path.resolve('src/backend/opencl/cl/rx'));
|
||||||
|
@ -100,3 +101,8 @@ process.chdir(cwd);
|
||||||
process.chdir(path.resolve('src/backend/opencl/cl/astrobwt'));
|
process.chdir(path.resolve('src/backend/opencl/cl/astrobwt'));
|
||||||
|
|
||||||
astrobwt();
|
astrobwt();
|
||||||
|
|
||||||
|
process.chdir(cwd);
|
||||||
|
process.chdir(path.resolve('src/backend/opencl/cl/kawpow'));
|
||||||
|
|
||||||
|
kawpow();
|
||||||
|
|
|
@ -6,7 +6,7 @@ const fs = require('fs');
|
||||||
function bin2h(buf, namespace, name)
|
function bin2h(buf, namespace, name)
|
||||||
{
|
{
|
||||||
const size = buf.byteLength;
|
const size = buf.byteLength;
|
||||||
let out = `#pragma once\n\nnamespace ${namespace} {\n\nstatic unsigned char ${name}[${size}] = {\n `;
|
let out = `#pragma once\n\nnamespace ${namespace} {\n\nstatic const unsigned char ${name}[${size}] = {\n `;
|
||||||
|
|
||||||
let b = 32;
|
let b = 32;
|
||||||
for (let i = 0; i < size; i++) {
|
for (let i = 0; i < size; i++) {
|
||||||
|
@ -28,7 +28,7 @@ function text2h_internal(text, name)
|
||||||
{
|
{
|
||||||
const buf = Buffer.from(text);
|
const buf = Buffer.from(text);
|
||||||
const size = buf.byteLength;
|
const size = buf.byteLength;
|
||||||
let out = `\nstatic char ${name}[${size + 1}] = {\n `;
|
let out = `\nstatic const char ${name}[${size + 1}] = {\n `;
|
||||||
|
|
||||||
let b = 32;
|
let b = 32;
|
||||||
for (let i = 0; i < size; i++) {
|
for (let i = 0; i < size; i++) {
|
||||||
|
|
24
src/3rdparty/libethash/CMakeLists.txt
vendored
Normal file
24
src/3rdparty/libethash/CMakeLists.txt
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
cmake_minimum_required (VERSION 2.8)
|
||||||
|
project (ethash C)
|
||||||
|
|
||||||
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Os")
|
||||||
|
|
||||||
|
set(HEADERS
|
||||||
|
data_sizes.h
|
||||||
|
endian.h
|
||||||
|
ethash.h
|
||||||
|
ethash_internal.h
|
||||||
|
fnv.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(SOURCES
|
||||||
|
ethash_internal.c
|
||||||
|
keccakf800.c
|
||||||
|
)
|
||||||
|
|
||||||
|
include_directories(../..)
|
||||||
|
|
||||||
|
add_library(ethash STATIC
|
||||||
|
${HEADERS}
|
||||||
|
${SOURCES}
|
||||||
|
)
|
811
src/3rdparty/libethash/data_sizes.h
vendored
Normal file
811
src/3rdparty/libethash/data_sizes.h
vendored
Normal file
|
@ -0,0 +1,811 @@
|
||||||
|
/*
|
||||||
|
This file is part of cpp-ethereum.
|
||||||
|
|
||||||
|
cpp-ethereum is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software FoundationUUU,either version 3 of the LicenseUUU,or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
cpp-ethereum is distributed in the hope that it will be usefulU,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with cpp-ethereum. If notUUU,see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @file data_sizes.h
|
||||||
|
* @author Matthew Wampler-Doty <negacthulhu@gmail.com>
|
||||||
|
* @date 2015
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
// 2048 Epochs (~20 years) worth of tabulated DAG sizes
|
||||||
|
|
||||||
|
// Generated with the following Mathematica Code:
|
||||||
|
|
||||||
|
// GetCacheSizes[n_] := Module[{
|
||||||
|
// CacheSizeBytesInit = 2^24,
|
||||||
|
// CacheGrowth = 2^17,
|
||||||
|
// HashBytes = 64,
|
||||||
|
// j = 0},
|
||||||
|
// Reap[
|
||||||
|
// While[j < n,
|
||||||
|
// Module[{i =
|
||||||
|
// Floor[(CacheSizeBytesInit + CacheGrowth * j) / HashBytes]},
|
||||||
|
// While[! PrimeQ[i], i--];
|
||||||
|
// Sow[i*HashBytes]; j++]]]][[2]][[1]]
|
||||||
|
|
||||||
|
|
||||||
|
static const uint64_t dag_sizes[2048] = {
|
||||||
|
1073739904U, 1082130304U, 1090514816U, 1098906752U, 1107293056U,
|
||||||
|
1115684224U, 1124070016U, 1132461952U, 1140849536U, 1149232768U,
|
||||||
|
1157627776U, 1166013824U, 1174404736U, 1182786944U, 1191180416U,
|
||||||
|
1199568512U, 1207958912U, 1216345216U, 1224732032U, 1233124736U,
|
||||||
|
1241513344U, 1249902464U, 1258290304U, 1266673792U, 1275067264U,
|
||||||
|
1283453312U, 1291844992U, 1300234112U, 1308619904U, 1317010048U,
|
||||||
|
1325397376U, 1333787776U, 1342176128U, 1350561664U, 1358954368U,
|
||||||
|
1367339392U, 1375731584U, 1384118144U, 1392507008U, 1400897408U,
|
||||||
|
1409284736U, 1417673344U, 1426062464U, 1434451072U, 1442839168U,
|
||||||
|
1451229056U, 1459615616U, 1468006016U, 1476394112U, 1484782976U,
|
||||||
|
1493171584U, 1501559168U, 1509948032U, 1518337664U, 1526726528U,
|
||||||
|
1535114624U, 1543503488U, 1551892096U, 1560278656U, 1568669056U,
|
||||||
|
1577056384U, 1585446272U, 1593831296U, 1602219392U, 1610610304U,
|
||||||
|
1619000192U, 1627386752U, 1635773824U, 1644164224U, 1652555648U,
|
||||||
|
1660943488U, 1669332608U, 1677721216U, 1686109312U, 1694497664U,
|
||||||
|
1702886272U, 1711274624U, 1719661184U, 1728047744U, 1736434816U,
|
||||||
|
1744829056U, 1753218944U, 1761606272U, 1769995904U, 1778382464U,
|
||||||
|
1786772864U, 1795157888U, 1803550592U, 1811937664U, 1820327552U,
|
||||||
|
1828711552U, 1837102976U, 1845488768U, 1853879936U, 1862269312U,
|
||||||
|
1870656896U, 1879048064U, 1887431552U, 1895825024U, 1904212096U,
|
||||||
|
1912601216U, 1920988544U, 1929379456U, 1937765504U, 1946156672U,
|
||||||
|
1954543232U, 1962932096U, 1971321728U, 1979707264U, 1988093056U,
|
||||||
|
1996487552U, 2004874624U, 2013262208U, 2021653888U, 2030039936U,
|
||||||
|
2038430848U, 2046819968U, 2055208576U, 2063596672U, 2071981952U,
|
||||||
|
2080373632U, 2088762752U, 2097149056U, 2105539712U, 2113928576U,
|
||||||
|
2122315136U, 2130700672U, 2139092608U, 2147483264U, 2155872128U,
|
||||||
|
2164257664U, 2172642176U, 2181035392U, 2189426048U, 2197814912U,
|
||||||
|
2206203008U, 2214587264U, 2222979712U, 2231367808U, 2239758208U,
|
||||||
|
2248145024U, 2256527744U, 2264922752U, 2273312128U, 2281701248U,
|
||||||
|
2290086272U, 2298476672U, 2306867072U, 2315251072U, 2323639168U,
|
||||||
|
2332032128U, 2340420224U, 2348808064U, 2357196416U, 2365580416U,
|
||||||
|
2373966976U, 2382363008U, 2390748544U, 2399139968U, 2407530368U,
|
||||||
|
2415918976U, 2424307328U, 2432695424U, 2441084288U, 2449472384U,
|
||||||
|
2457861248U, 2466247808U, 2474637184U, 2483026816U, 2491414144U,
|
||||||
|
2499803776U, 2508191872U, 2516582272U, 2524970368U, 2533359232U,
|
||||||
|
2541743488U, 2550134144U, 2558525056U, 2566913408U, 2575301504U,
|
||||||
|
2583686528U, 2592073856U, 2600467328U, 2608856192U, 2617240448U,
|
||||||
|
2625631616U, 2634022016U, 2642407552U, 2650796416U, 2659188352U,
|
||||||
|
2667574912U, 2675965312U, 2684352896U, 2692738688U, 2701130624U,
|
||||||
|
2709518464U, 2717907328U, 2726293376U, 2734685056U, 2743073152U,
|
||||||
|
2751462016U, 2759851648U, 2768232832U, 2776625536U, 2785017728U,
|
||||||
|
2793401984U, 2801794432U, 2810182016U, 2818571648U, 2826959488U,
|
||||||
|
2835349376U, 2843734144U, 2852121472U, 2860514432U, 2868900992U,
|
||||||
|
2877286784U, 2885676928U, 2894069632U, 2902451584U, 2910843008U,
|
||||||
|
2919234688U, 2927622784U, 2936011648U, 2944400768U, 2952789376U,
|
||||||
|
2961177728U, 2969565568U, 2977951616U, 2986338944U, 2994731392U,
|
||||||
|
3003120256U, 3011508352U, 3019895936U, 3028287104U, 3036675968U,
|
||||||
|
3045063808U, 3053452928U, 3061837696U, 3070228352U, 3078615424U,
|
||||||
|
3087003776U, 3095394944U, 3103782272U, 3112173184U, 3120562048U,
|
||||||
|
3128944768U, 3137339264U, 3145725056U, 3154109312U, 3162505088U,
|
||||||
|
3170893184U, 3179280256U, 3187669376U, 3196056704U, 3204445568U,
|
||||||
|
3212836736U, 3221224064U, 3229612928U, 3238002304U, 3246391168U,
|
||||||
|
3254778496U, 3263165824U, 3271556224U, 3279944576U, 3288332416U,
|
||||||
|
3296719232U, 3305110912U, 3313500032U, 3321887104U, 3330273152U,
|
||||||
|
3338658944U, 3347053184U, 3355440512U, 3363827072U, 3372220288U,
|
||||||
|
3380608384U, 3388997504U, 3397384576U, 3405774208U, 3414163072U,
|
||||||
|
3422551936U, 3430937984U, 3439328384U, 3447714176U, 3456104576U,
|
||||||
|
3464493952U, 3472883584U, 3481268864U, 3489655168U, 3498048896U,
|
||||||
|
3506434432U, 3514826368U, 3523213952U, 3531603584U, 3539987072U,
|
||||||
|
3548380288U, 3556763264U, 3565157248U, 3573545344U, 3581934464U,
|
||||||
|
3590324096U, 3598712704U, 3607098752U, 3615488384U, 3623877248U,
|
||||||
|
3632265856U, 3640646528U, 3649043584U, 3657430144U, 3665821568U,
|
||||||
|
3674207872U, 3682597504U, 3690984832U, 3699367808U, 3707764352U,
|
||||||
|
3716152448U, 3724541056U, 3732925568U, 3741318016U, 3749706368U,
|
||||||
|
3758091136U, 3766481536U, 3774872704U, 3783260032U, 3791650432U,
|
||||||
|
3800036224U, 3808427648U, 3816815488U, 3825204608U, 3833592704U,
|
||||||
|
3841981568U, 3850370432U, 3858755968U, 3867147904U, 3875536256U,
|
||||||
|
3883920512U, 3892313728U, 3900702592U, 3909087872U, 3917478784U,
|
||||||
|
3925868416U, 3934256512U, 3942645376U, 3951032192U, 3959422336U,
|
||||||
|
3967809152U, 3976200064U, 3984588416U, 3992974976U, 4001363584U,
|
||||||
|
4009751168U, 4018141312U, 4026530432U, 4034911616U, 4043308928U,
|
||||||
|
4051695488U, 4060084352U, 4068472448U, 4076862848U, 4085249408U,
|
||||||
|
4093640576U, 4102028416U, 4110413696U, 4118805632U, 4127194496U,
|
||||||
|
4135583104U, 4143971968U, 4152360832U, 4160746112U, 4169135744U,
|
||||||
|
4177525888U, 4185912704U, 4194303616U, 4202691968U, 4211076736U,
|
||||||
|
4219463552U, 4227855488U, 4236246656U, 4244633728U, 4253022848U,
|
||||||
|
4261412224U, 4269799808U, 4278184832U, 4286578048U, 4294962304U,
|
||||||
|
4303349632U, 4311743104U, 4320130432U, 4328521088U, 4336909184U,
|
||||||
|
4345295488U, 4353687424U, 4362073472U, 4370458496U, 4378852736U,
|
||||||
|
4387238528U, 4395630208U, 4404019072U, 4412407424U, 4420790656U,
|
||||||
|
4429182848U, 4437571456U, 4445962112U, 4454344064U, 4462738048U,
|
||||||
|
4471119232U, 4479516544U, 4487904128U, 4496289664U, 4504682368U,
|
||||||
|
4513068416U, 4521459584U, 4529846144U, 4538232704U, 4546619776U,
|
||||||
|
4555010176U, 4563402112U, 4571790208U, 4580174464U, 4588567936U,
|
||||||
|
4596957056U, 4605344896U, 4613734016U, 4622119808U, 4630511488U,
|
||||||
|
4638898816U, 4647287936U, 4655675264U, 4664065664U, 4672451968U,
|
||||||
|
4680842624U, 4689231488U, 4697620352U, 4706007424U, 4714397056U,
|
||||||
|
4722786176U, 4731173248U, 4739562368U, 4747951744U, 4756340608U,
|
||||||
|
4764727936U, 4773114496U, 4781504384U, 4789894784U, 4798283648U,
|
||||||
|
4806667648U, 4815059584U, 4823449472U, 4831835776U, 4840226176U,
|
||||||
|
4848612224U, 4857003392U, 4865391488U, 4873780096U, 4882169728U,
|
||||||
|
4890557312U, 4898946944U, 4907333248U, 4915722368U, 4924110976U,
|
||||||
|
4932499328U, 4940889728U, 4949276032U, 4957666432U, 4966054784U,
|
||||||
|
4974438016U, 4982831488U, 4991221376U, 4999607168U, 5007998848U,
|
||||||
|
5016386432U, 5024763776U, 5033164672U, 5041544576U, 5049941888U,
|
||||||
|
5058329728U, 5066717056U, 5075107456U, 5083494272U, 5091883904U,
|
||||||
|
5100273536U, 5108662144U, 5117048192U, 5125436032U, 5133827456U,
|
||||||
|
5142215296U, 5150605184U, 5158993024U, 5167382144U, 5175769472U,
|
||||||
|
5184157568U, 5192543872U, 5200936064U, 5209324928U, 5217711232U,
|
||||||
|
5226102656U, 5234490496U, 5242877312U, 5251263872U, 5259654016U,
|
||||||
|
5268040832U, 5276434304U, 5284819328U, 5293209728U, 5301598592U,
|
||||||
|
5309986688U, 5318374784U, 5326764416U, 5335151488U, 5343542144U,
|
||||||
|
5351929472U, 5360319872U, 5368706944U, 5377096576U, 5385484928U,
|
||||||
|
5393871232U, 5402263424U, 5410650496U, 5419040384U, 5427426944U,
|
||||||
|
5435816576U, 5444205952U, 5452594816U, 5460981376U, 5469367936U,
|
||||||
|
5477760896U, 5486148736U, 5494536832U, 5502925952U, 5511315328U,
|
||||||
|
5519703424U, 5528089984U, 5536481152U, 5544869504U, 5553256064U,
|
||||||
|
5561645696U, 5570032768U, 5578423936U, 5586811264U, 5595193216U,
|
||||||
|
5603585408U, 5611972736U, 5620366208U, 5628750464U, 5637143936U,
|
||||||
|
5645528192U, 5653921408U, 5662310272U, 5670694784U, 5679082624U,
|
||||||
|
5687474048U, 5695864448U, 5704251008U, 5712641408U, 5721030272U,
|
||||||
|
5729416832U, 5737806208U, 5746194304U, 5754583936U, 5762969984U,
|
||||||
|
5771358592U, 5779748224U, 5788137856U, 5796527488U, 5804911232U,
|
||||||
|
5813300608U, 5821692544U, 5830082176U, 5838468992U, 5846855552U,
|
||||||
|
5855247488U, 5863636096U, 5872024448U, 5880411008U, 5888799872U,
|
||||||
|
5897186432U, 5905576832U, 5913966976U, 5922352768U, 5930744704U,
|
||||||
|
5939132288U, 5947522432U, 5955911296U, 5964299392U, 5972688256U,
|
||||||
|
5981074304U, 5989465472U, 5997851008U, 6006241408U, 6014627968U,
|
||||||
|
6023015552U, 6031408256U, 6039796096U, 6048185216U, 6056574848U,
|
||||||
|
6064963456U, 6073351808U, 6081736064U, 6090128768U, 6098517632U,
|
||||||
|
6106906496U, 6115289216U, 6123680896U, 6132070016U, 6140459648U,
|
||||||
|
6148849024U, 6157237376U, 6165624704U, 6174009728U, 6182403712U,
|
||||||
|
6190792064U, 6199176064U, 6207569792U, 6215952256U, 6224345216U,
|
||||||
|
6232732544U, 6241124224U, 6249510272U, 6257899136U, 6266287744U,
|
||||||
|
6274676864U, 6283065728U, 6291454336U, 6299843456U, 6308232064U,
|
||||||
|
6316620928U, 6325006208U, 6333395584U, 6341784704U, 6350174848U,
|
||||||
|
6358562176U, 6366951296U, 6375337856U, 6383729536U, 6392119168U,
|
||||||
|
6400504192U, 6408895616U, 6417283456U, 6425673344U, 6434059136U,
|
||||||
|
6442444672U, 6450837376U, 6459223424U, 6467613056U, 6476004224U,
|
||||||
|
6484393088U, 6492781952U, 6501170048U, 6509555072U, 6517947008U,
|
||||||
|
6526336384U, 6534725504U, 6543112832U, 6551500672U, 6559888768U,
|
||||||
|
6568278656U, 6576662912U, 6585055616U, 6593443456U, 6601834112U,
|
||||||
|
6610219648U, 6618610304U, 6626999168U, 6635385472U, 6643777408U,
|
||||||
|
6652164224U, 6660552832U, 6668941952U, 6677330048U, 6685719424U,
|
||||||
|
6694107776U, 6702493568U, 6710882176U, 6719274112U, 6727662976U,
|
||||||
|
6736052096U, 6744437632U, 6752825984U, 6761213824U, 6769604224U,
|
||||||
|
6777993856U, 6786383488U, 6794770816U, 6803158144U, 6811549312U,
|
||||||
|
6819937664U, 6828326528U, 6836706176U, 6845101696U, 6853491328U,
|
||||||
|
6861880448U, 6870269312U, 6878655104U, 6887046272U, 6895433344U,
|
||||||
|
6903822208U, 6912212864U, 6920596864U, 6928988288U, 6937377152U,
|
||||||
|
6945764992U, 6954149248U, 6962544256U, 6970928768U, 6979317376U,
|
||||||
|
6987709312U, 6996093824U, 7004487296U, 7012875392U, 7021258624U,
|
||||||
|
7029652352U, 7038038912U, 7046427776U, 7054818944U, 7063207808U,
|
||||||
|
7071595136U, 7079980928U, 7088372608U, 7096759424U, 7105149824U,
|
||||||
|
7113536896U, 7121928064U, 7130315392U, 7138699648U, 7147092352U,
|
||||||
|
7155479168U, 7163865728U, 7172249984U, 7180648064U, 7189036672U,
|
||||||
|
7197424768U, 7205810816U, 7214196608U, 7222589824U, 7230975104U,
|
||||||
|
7239367552U, 7247755904U, 7256145536U, 7264533376U, 7272921472U,
|
||||||
|
7281308032U, 7289694848U, 7298088832U, 7306471808U, 7314864512U,
|
||||||
|
7323253888U, 7331643008U, 7340029568U, 7348419712U, 7356808832U,
|
||||||
|
7365196672U, 7373585792U, 7381973888U, 7390362752U, 7398750592U,
|
||||||
|
7407138944U, 7415528576U, 7423915648U, 7432302208U, 7440690304U,
|
||||||
|
7449080192U, 7457472128U, 7465860992U, 7474249088U, 7482635648U,
|
||||||
|
7491023744U, 7499412608U, 7507803008U, 7516192384U, 7524579968U,
|
||||||
|
7532967296U, 7541358464U, 7549745792U, 7558134656U, 7566524032U,
|
||||||
|
7574912896U, 7583300992U, 7591690112U, 7600075136U, 7608466816U,
|
||||||
|
7616854912U, 7625244544U, 7633629824U, 7642020992U, 7650410368U,
|
||||||
|
7658794112U, 7667187328U, 7675574912U, 7683961984U, 7692349568U,
|
||||||
|
7700739712U, 7709130368U, 7717519232U, 7725905536U, 7734295424U,
|
||||||
|
7742683264U, 7751069056U, 7759457408U, 7767849088U, 7776238208U,
|
||||||
|
7784626816U, 7793014912U, 7801405312U, 7809792128U, 7818179968U,
|
||||||
|
7826571136U, 7834957184U, 7843347328U, 7851732352U, 7860124544U,
|
||||||
|
7868512384U, 7876902016U, 7885287808U, 7893679744U, 7902067072U,
|
||||||
|
7910455936U, 7918844288U, 7927230848U, 7935622784U, 7944009344U,
|
||||||
|
7952400256U, 7960786048U, 7969176704U, 7977565312U, 7985953408U,
|
||||||
|
7994339968U, 8002730368U, 8011119488U, 8019508096U, 8027896192U,
|
||||||
|
8036285056U, 8044674688U, 8053062272U, 8061448832U, 8069838464U,
|
||||||
|
8078227328U, 8086616704U, 8095006592U, 8103393664U, 8111783552U,
|
||||||
|
8120171392U, 8128560256U, 8136949376U, 8145336704U, 8153726848U,
|
||||||
|
8162114944U, 8170503296U, 8178891904U, 8187280768U, 8195669632U,
|
||||||
|
8204058496U, 8212444544U, 8220834176U, 8229222272U, 8237612672U,
|
||||||
|
8246000768U, 8254389376U, 8262775168U, 8271167104U, 8279553664U,
|
||||||
|
8287944064U, 8296333184U, 8304715136U, 8313108352U, 8321497984U,
|
||||||
|
8329885568U, 8338274432U, 8346663296U, 8355052928U, 8363441536U,
|
||||||
|
8371828352U, 8380217984U, 8388606592U, 8396996224U, 8405384576U,
|
||||||
|
8413772672U, 8422161536U, 8430549376U, 8438939008U, 8447326592U,
|
||||||
|
8455715456U, 8464104832U, 8472492928U, 8480882048U, 8489270656U,
|
||||||
|
8497659776U, 8506045312U, 8514434944U, 8522823808U, 8531208832U,
|
||||||
|
8539602304U, 8547990656U, 8556378752U, 8564768384U, 8573154176U,
|
||||||
|
8581542784U, 8589933952U, 8598322816U, 8606705024U, 8615099264U,
|
||||||
|
8623487872U, 8631876992U, 8640264064U, 8648653952U, 8657040256U,
|
||||||
|
8665430656U, 8673820544U, 8682209152U, 8690592128U, 8698977152U,
|
||||||
|
8707374464U, 8715763328U, 8724151424U, 8732540032U, 8740928384U,
|
||||||
|
8749315712U, 8757704576U, 8766089344U, 8774480768U, 8782871936U,
|
||||||
|
8791260032U, 8799645824U, 8808034432U, 8816426368U, 8824812928U,
|
||||||
|
8833199488U, 8841591424U, 8849976448U, 8858366336U, 8866757248U,
|
||||||
|
8875147136U, 8883532928U, 8891923328U, 8900306816U, 8908700288U,
|
||||||
|
8917088384U, 8925478784U, 8933867392U, 8942250368U, 8950644608U,
|
||||||
|
8959032704U, 8967420544U, 8975809664U, 8984197504U, 8992584064U,
|
||||||
|
9000976256U, 9009362048U, 9017752448U, 9026141312U, 9034530688U,
|
||||||
|
9042917504U, 9051307904U, 9059694208U, 9068084864U, 9076471424U,
|
||||||
|
9084861824U, 9093250688U, 9101638528U, 9110027648U, 9118416512U,
|
||||||
|
9126803584U, 9135188096U, 9143581312U, 9151969664U, 9160356224U,
|
||||||
|
9168747136U, 9177134464U, 9185525632U, 9193910144U, 9202302848U,
|
||||||
|
9210690688U, 9219079552U, 9227465344U, 9235854464U, 9244244864U,
|
||||||
|
9252633472U, 9261021824U, 9269411456U, 9277799296U, 9286188928U,
|
||||||
|
9294574208U, 9302965888U, 9311351936U, 9319740032U, 9328131968U,
|
||||||
|
9336516736U, 9344907392U, 9353296768U, 9361685888U, 9370074752U,
|
||||||
|
9378463616U, 9386849408U, 9395239808U, 9403629184U, 9412016512U,
|
||||||
|
9420405376U, 9428795008U, 9437181568U, 9445570688U, 9453960832U,
|
||||||
|
9462346624U, 9470738048U, 9479121536U, 9487515008U, 9495903616U,
|
||||||
|
9504289664U, 9512678528U, 9521067904U, 9529456256U, 9537843584U,
|
||||||
|
9546233728U, 9554621312U, 9563011456U, 9571398784U, 9579788672U,
|
||||||
|
9588178304U, 9596567168U, 9604954496U, 9613343104U, 9621732992U,
|
||||||
|
9630121856U, 9638508416U, 9646898816U, 9655283584U, 9663675776U,
|
||||||
|
9672061312U, 9680449664U, 9688840064U, 9697230464U, 9705617536U,
|
||||||
|
9714003584U, 9722393984U, 9730772608U, 9739172224U, 9747561088U,
|
||||||
|
9755945344U, 9764338816U, 9772726144U, 9781116544U, 9789503872U,
|
||||||
|
9797892992U, 9806282624U, 9814670464U, 9823056512U, 9831439232U,
|
||||||
|
9839833984U, 9848224384U, 9856613504U, 9865000576U, 9873391232U,
|
||||||
|
9881772416U, 9890162816U, 9898556288U, 9906940544U, 9915333248U,
|
||||||
|
9923721088U, 9932108672U, 9940496512U, 9948888448U, 9957276544U,
|
||||||
|
9965666176U, 9974048384U, 9982441088U, 9990830464U, 9999219584U,
|
||||||
|
10007602816U, 10015996544U, 10024385152U, 10032774016U, 10041163648U,
|
||||||
|
10049548928U, 10057940096U, 10066329472U, 10074717824U, 10083105152U,
|
||||||
|
10091495296U, 10099878784U, 10108272256U, 10116660608U, 10125049216U,
|
||||||
|
10133437312U, 10141825664U, 10150213504U, 10158601088U, 10166991232U,
|
||||||
|
10175378816U, 10183766144U, 10192157312U, 10200545408U, 10208935552U,
|
||||||
|
10217322112U, 10225712768U, 10234099328U, 10242489472U, 10250876032U,
|
||||||
|
10259264896U, 10267656064U, 10276042624U, 10284429184U, 10292820352U,
|
||||||
|
10301209472U, 10309598848U, 10317987712U, 10326375296U, 10334763392U,
|
||||||
|
10343153536U, 10351541632U, 10359930752U, 10368318592U, 10376707456U,
|
||||||
|
10385096576U, 10393484672U, 10401867136U, 10410262144U, 10418647424U,
|
||||||
|
10427039104U, 10435425664U, 10443810176U, 10452203648U, 10460589952U,
|
||||||
|
10468982144U, 10477369472U, 10485759104U, 10494147712U, 10502533504U,
|
||||||
|
10510923392U, 10519313536U, 10527702656U, 10536091264U, 10544478592U,
|
||||||
|
10552867712U, 10561255808U, 10569642368U, 10578032768U, 10586423168U,
|
||||||
|
10594805632U, 10603200128U, 10611588992U, 10619976064U, 10628361344U,
|
||||||
|
10636754048U, 10645143424U, 10653531776U, 10661920384U, 10670307968U,
|
||||||
|
10678696832U, 10687086464U, 10695475072U, 10703863168U, 10712246144U,
|
||||||
|
10720639616U, 10729026688U, 10737414784U, 10745806208U, 10754190976U,
|
||||||
|
10762581376U, 10770971264U, 10779356288U, 10787747456U, 10796135552U,
|
||||||
|
10804525184U, 10812915584U, 10821301888U, 10829692288U, 10838078336U,
|
||||||
|
10846469248U, 10854858368U, 10863247232U, 10871631488U, 10880023424U,
|
||||||
|
10888412032U, 10896799616U, 10905188992U, 10913574016U, 10921964672U,
|
||||||
|
10930352768U, 10938742912U, 10947132544U, 10955518592U, 10963909504U,
|
||||||
|
10972298368U, 10980687488U, 10989074816U, 10997462912U, 11005851776U,
|
||||||
|
11014241152U, 11022627712U, 11031017344U, 11039403904U, 11047793024U,
|
||||||
|
11056184704U, 11064570752U, 11072960896U, 11081343872U, 11089737856U,
|
||||||
|
11098128256U, 11106514816U, 11114904448U, 11123293568U, 11131680128U,
|
||||||
|
11140065152U, 11148458368U, 11156845696U, 11165236864U, 11173624192U,
|
||||||
|
11182013824U, 11190402688U, 11198790784U, 11207179136U, 11215568768U,
|
||||||
|
11223957376U, 11232345728U, 11240734592U, 11249122688U, 11257511296U,
|
||||||
|
11265899648U, 11274285952U, 11282675584U, 11291065472U, 11299452544U,
|
||||||
|
11307842432U, 11316231296U, 11324616832U, 11333009024U, 11341395584U,
|
||||||
|
11349782656U, 11358172288U, 11366560384U, 11374950016U, 11383339648U,
|
||||||
|
11391721856U, 11400117376U, 11408504192U, 11416893568U, 11425283456U,
|
||||||
|
11433671552U, 11442061184U, 11450444672U, 11458837888U, 11467226752U,
|
||||||
|
11475611776U, 11484003968U, 11492392064U, 11500780672U, 11509169024U,
|
||||||
|
11517550976U, 11525944448U, 11534335616U, 11542724224U, 11551111808U,
|
||||||
|
11559500672U, 11567890304U, 11576277376U, 11584667008U, 11593056128U,
|
||||||
|
11601443456U, 11609830016U, 11618221952U, 11626607488U, 11634995072U,
|
||||||
|
11643387776U, 11651775104U, 11660161664U, 11668552576U, 11676940928U,
|
||||||
|
11685330304U, 11693718656U, 11702106496U, 11710496128U, 11718882688U,
|
||||||
|
11727273088U, 11735660416U, 11744050048U, 11752437376U, 11760824704U,
|
||||||
|
11769216128U, 11777604736U, 11785991296U, 11794381952U, 11802770048U,
|
||||||
|
11811157888U, 11819548544U, 11827932544U, 11836324736U, 11844713344U,
|
||||||
|
11853100928U, 11861486464U, 11869879936U, 11878268032U, 11886656896U,
|
||||||
|
11895044992U, 11903433088U, 11911822976U, 11920210816U, 11928600448U,
|
||||||
|
11936987264U, 11945375872U, 11953761152U, 11962151296U, 11970543488U,
|
||||||
|
11978928512U, 11987320448U, 11995708288U, 12004095104U, 12012486272U,
|
||||||
|
12020875136U, 12029255552U, 12037652096U, 12046039168U, 12054429568U,
|
||||||
|
12062813824U, 12071206528U, 12079594624U, 12087983744U, 12096371072U,
|
||||||
|
12104759936U, 12113147264U, 12121534592U, 12129924992U, 12138314624U,
|
||||||
|
12146703232U, 12155091584U, 12163481216U, 12171864704U, 12180255872U,
|
||||||
|
12188643968U, 12197034112U, 12205424512U, 12213811328U, 12222199424U,
|
||||||
|
12230590336U, 12238977664U, 12247365248U, 12255755392U, 12264143488U,
|
||||||
|
12272531584U, 12280920448U, 12289309568U, 12297694592U, 12306086528U,
|
||||||
|
12314475392U, 12322865024U, 12331253632U, 12339640448U, 12348029312U,
|
||||||
|
12356418944U, 12364805248U, 12373196672U, 12381580928U, 12389969024U,
|
||||||
|
12398357632U, 12406750592U, 12415138432U, 12423527552U, 12431916416U,
|
||||||
|
12440304512U, 12448692352U, 12457081216U, 12465467776U, 12473859968U,
|
||||||
|
12482245504U, 12490636672U, 12499025536U, 12507411584U, 12515801728U,
|
||||||
|
12524190592U, 12532577152U, 12540966272U, 12549354368U, 12557743232U,
|
||||||
|
12566129536U, 12574523264U, 12582911872U, 12591299456U, 12599688064U,
|
||||||
|
12608074624U, 12616463488U, 12624845696U, 12633239936U, 12641631616U,
|
||||||
|
12650019968U, 12658407296U, 12666795136U, 12675183232U, 12683574656U,
|
||||||
|
12691960192U, 12700350592U, 12708740224U, 12717128576U, 12725515904U,
|
||||||
|
12733906816U, 12742295168U, 12750680192U, 12759071872U, 12767460736U,
|
||||||
|
12775848832U, 12784236928U, 12792626816U, 12801014656U, 12809404288U,
|
||||||
|
12817789312U, 12826181504U, 12834568832U, 12842954624U, 12851345792U,
|
||||||
|
12859732352U, 12868122496U, 12876512128U, 12884901248U, 12893289088U,
|
||||||
|
12901672832U, 12910067584U, 12918455168U, 12926842496U, 12935232896U,
|
||||||
|
12943620736U, 12952009856U, 12960396928U, 12968786816U, 12977176192U,
|
||||||
|
12985563776U, 12993951104U, 13002341504U, 13010730368U, 13019115392U,
|
||||||
|
13027506304U, 13035895168U, 13044272512U, 13052673152U, 13061062528U,
|
||||||
|
13069446272U, 13077838976U, 13086227072U, 13094613632U, 13103000192U,
|
||||||
|
13111393664U, 13119782528U, 13128157568U, 13136559232U, 13144945024U,
|
||||||
|
13153329536U, 13161724288U, 13170111872U, 13178502784U, 13186884736U,
|
||||||
|
13195279744U, 13203667072U, 13212057472U, 13220445824U, 13228832128U,
|
||||||
|
13237221248U, 13245610624U, 13254000512U, 13262388352U, 13270777472U,
|
||||||
|
13279166336U, 13287553408U, 13295943296U, 13304331904U, 13312719488U,
|
||||||
|
13321108096U, 13329494656U, 13337885824U, 13346274944U, 13354663808U,
|
||||||
|
13363051136U, 13371439232U, 13379825024U, 13388210816U, 13396605056U,
|
||||||
|
13404995456U, 13413380224U, 13421771392U, 13430159744U, 13438546048U,
|
||||||
|
13446937216U, 13455326848U, 13463708288U, 13472103808U, 13480492672U,
|
||||||
|
13488875648U, 13497269888U, 13505657728U, 13514045312U, 13522435712U,
|
||||||
|
13530824576U, 13539210112U, 13547599232U, 13555989376U, 13564379008U,
|
||||||
|
13572766336U, 13581154432U, 13589544832U, 13597932928U, 13606320512U,
|
||||||
|
13614710656U, 13623097472U, 13631477632U, 13639874944U, 13648264064U,
|
||||||
|
13656652928U, 13665041792U, 13673430656U, 13681818496U, 13690207616U,
|
||||||
|
13698595712U, 13706982272U, 13715373184U, 13723762048U, 13732150144U,
|
||||||
|
13740536704U, 13748926592U, 13757316224U, 13765700992U, 13774090112U,
|
||||||
|
13782477952U, 13790869376U, 13799259008U, 13807647872U, 13816036736U,
|
||||||
|
13824425344U, 13832814208U, 13841202304U, 13849591424U, 13857978752U,
|
||||||
|
13866368896U, 13874754688U, 13883145344U, 13891533184U, 13899919232U,
|
||||||
|
13908311168U, 13916692096U, 13925085056U, 13933473152U, 13941866368U,
|
||||||
|
13950253696U, 13958643584U, 13967032192U, 13975417216U, 13983807616U,
|
||||||
|
13992197504U, 14000582272U, 14008973696U, 14017363072U, 14025752192U,
|
||||||
|
14034137984U, 14042528384U, 14050918016U, 14059301504U, 14067691648U,
|
||||||
|
14076083584U, 14084470144U, 14092852352U, 14101249664U, 14109635968U,
|
||||||
|
14118024832U, 14126407552U, 14134804352U, 14143188608U, 14151577984U,
|
||||||
|
14159968384U, 14168357248U, 14176741504U, 14185127296U, 14193521024U,
|
||||||
|
14201911424U, 14210301824U, 14218685056U, 14227067264U, 14235467392U,
|
||||||
|
14243855488U, 14252243072U, 14260630144U, 14269021568U, 14277409408U,
|
||||||
|
14285799296U, 14294187904U, 14302571392U, 14310961792U, 14319353728U,
|
||||||
|
14327738752U, 14336130944U, 14344518784U, 14352906368U, 14361296512U,
|
||||||
|
14369685376U, 14378071424U, 14386462592U, 14394848128U, 14403230848U,
|
||||||
|
14411627392U, 14420013952U, 14428402304U, 14436793472U, 14445181568U,
|
||||||
|
14453569664U, 14461959808U, 14470347904U, 14478737024U, 14487122816U,
|
||||||
|
14495511424U, 14503901824U, 14512291712U, 14520677504U, 14529064832U,
|
||||||
|
14537456768U, 14545845632U, 14554234496U, 14562618496U, 14571011456U,
|
||||||
|
14579398784U, 14587789184U, 14596172672U, 14604564608U, 14612953984U,
|
||||||
|
14621341312U, 14629724288U, 14638120832U, 14646503296U, 14654897536U,
|
||||||
|
14663284864U, 14671675264U, 14680061056U, 14688447616U, 14696835968U,
|
||||||
|
14705228416U, 14713616768U, 14722003328U, 14730392192U, 14738784128U,
|
||||||
|
14747172736U, 14755561088U, 14763947648U, 14772336512U, 14780725376U,
|
||||||
|
14789110144U, 14797499776U, 14805892736U, 14814276992U, 14822670208U,
|
||||||
|
14831056256U, 14839444352U, 14847836032U, 14856222848U, 14864612992U,
|
||||||
|
14872997504U, 14881388672U, 14889775744U, 14898165376U, 14906553472U,
|
||||||
|
14914944896U, 14923329664U, 14931721856U, 14940109696U, 14948497024U,
|
||||||
|
14956887424U, 14965276544U, 14973663616U, 14982053248U, 14990439808U,
|
||||||
|
14998830976U, 15007216768U, 15015605888U, 15023995264U, 15032385152U,
|
||||||
|
15040768384U, 15049154944U, 15057549184U, 15065939072U, 15074328448U,
|
||||||
|
15082715008U, 15091104128U, 15099493504U, 15107879296U, 15116269184U,
|
||||||
|
15124659584U, 15133042304U, 15141431936U, 15149824384U, 15158214272U,
|
||||||
|
15166602368U, 15174991232U, 15183378304U, 15191760512U, 15200154496U,
|
||||||
|
15208542592U, 15216931712U, 15225323392U, 15233708416U, 15242098048U,
|
||||||
|
15250489216U, 15258875264U, 15267265408U, 15275654528U, 15284043136U,
|
||||||
|
15292431488U, 15300819584U, 15309208192U, 15317596544U, 15325986176U,
|
||||||
|
15334374784U, 15342763648U, 15351151744U, 15359540608U, 15367929728U,
|
||||||
|
15376318336U, 15384706432U, 15393092992U, 15401481856U, 15409869952U,
|
||||||
|
15418258816U, 15426649984U, 15435037568U, 15443425664U, 15451815296U,
|
||||||
|
15460203392U, 15468589184U, 15476979328U, 15485369216U, 15493755776U,
|
||||||
|
15502146944U, 15510534272U, 15518924416U, 15527311232U, 15535699072U,
|
||||||
|
15544089472U, 15552478336U, 15560866688U, 15569254528U, 15577642624U,
|
||||||
|
15586031488U, 15594419072U, 15602809472U, 15611199104U, 15619586432U,
|
||||||
|
15627975296U, 15636364928U, 15644753792U, 15653141888U, 15661529216U,
|
||||||
|
15669918848U, 15678305152U, 15686696576U, 15695083136U, 15703474048U,
|
||||||
|
15711861632U, 15720251264U, 15728636288U, 15737027456U, 15745417088U,
|
||||||
|
15753804928U, 15762194048U, 15770582656U, 15778971008U, 15787358336U,
|
||||||
|
15795747712U, 15804132224U, 15812523392U, 15820909696U, 15829300096U,
|
||||||
|
15837691264U, 15846071936U, 15854466944U, 15862855808U, 15871244672U,
|
||||||
|
15879634816U, 15888020608U, 15896409728U, 15904799104U, 15913185152U,
|
||||||
|
15921577088U, 15929966464U, 15938354816U, 15946743424U, 15955129472U,
|
||||||
|
15963519872U, 15971907968U, 15980296064U, 15988684928U, 15997073024U,
|
||||||
|
16005460864U, 16013851264U, 16022241152U, 16030629248U, 16039012736U,
|
||||||
|
16047406976U, 16055794816U, 16064181376U, 16072571264U, 16080957824U,
|
||||||
|
16089346688U, 16097737856U, 16106125184U, 16114514816U, 16122904192U,
|
||||||
|
16131292544U, 16139678848U, 16148066944U, 16156453504U, 16164839552U,
|
||||||
|
16173236096U, 16181623424U, 16190012032U, 16198401152U, 16206790528U,
|
||||||
|
16215177344U, 16223567744U, 16231956352U, 16240344704U, 16248731008U,
|
||||||
|
16257117824U, 16265504384U, 16273898624U, 16282281856U, 16290668672U,
|
||||||
|
16299064192U, 16307449216U, 16315842176U, 16324230016U, 16332613504U,
|
||||||
|
16341006464U, 16349394304U, 16357783168U, 16366172288U, 16374561664U,
|
||||||
|
16382951296U, 16391337856U, 16399726208U, 16408116352U, 16416505472U,
|
||||||
|
16424892032U, 16433282176U, 16441668224U, 16450058624U, 16458448768U,
|
||||||
|
16466836864U, 16475224448U, 16483613056U, 16492001408U, 16500391808U,
|
||||||
|
16508779648U, 16517166976U, 16525555328U, 16533944192U, 16542330752U,
|
||||||
|
16550719616U, 16559110528U, 16567497088U, 16575888512U, 16584274816U,
|
||||||
|
16592665472U, 16601051008U, 16609442944U, 16617832064U, 16626218624U,
|
||||||
|
16634607488U, 16642996096U, 16651385728U, 16659773824U, 16668163712U,
|
||||||
|
16676552576U, 16684938112U, 16693328768U, 16701718144U, 16710095488U,
|
||||||
|
16718492288U, 16726883968U, 16735272832U, 16743661184U, 16752049792U,
|
||||||
|
16760436608U, 16768827008U, 16777214336U, 16785599104U, 16793992832U,
|
||||||
|
16802381696U, 16810768768U, 16819151744U, 16827542656U, 16835934848U,
|
||||||
|
16844323712U, 16852711552U, 16861101952U, 16869489536U, 16877876864U,
|
||||||
|
16886265728U, 16894653056U, 16903044736U, 16911431296U, 16919821696U,
|
||||||
|
16928207488U, 16936592768U, 16944987776U, 16953375616U, 16961763968U,
|
||||||
|
16970152832U, 16978540928U, 16986929536U, 16995319168U, 17003704448U,
|
||||||
|
17012096896U, 17020481152U, 17028870784U, 17037262208U, 17045649536U,
|
||||||
|
17054039936U, 17062426496U, 17070814336U, 17079205504U, 17087592064U,
|
||||||
|
17095978112U, 17104369024U, 17112759424U, 17121147776U, 17129536384U,
|
||||||
|
17137926016U, 17146314368U, 17154700928U, 17163089792U, 17171480192U,
|
||||||
|
17179864192U, 17188256896U, 17196644992U, 17205033856U, 17213423488U,
|
||||||
|
17221811072U, 17230198912U, 17238588032U, 17246976896U, 17255360384U,
|
||||||
|
17263754624U, 17272143232U, 17280530048U, 17288918912U, 17297309312U,
|
||||||
|
17305696384U, 17314085504U, 17322475136U, 17330863744U, 17339252096U,
|
||||||
|
17347640192U, 17356026496U, 17364413824U, 17372796544U, 17381190016U,
|
||||||
|
17389583488U, 17397972608U, 17406360704U, 17414748544U, 17423135872U,
|
||||||
|
17431527296U, 17439915904U, 17448303232U, 17456691584U, 17465081728U,
|
||||||
|
17473468288U, 17481857408U, 17490247552U, 17498635904U, 17507022464U,
|
||||||
|
17515409024U, 17523801728U, 17532189824U, 17540577664U, 17548966016U,
|
||||||
|
17557353344U, 17565741184U, 17574131584U, 17582519168U, 17590907008U,
|
||||||
|
17599296128U, 17607687808U, 17616076672U, 17624455808U, 17632852352U,
|
||||||
|
17641238656U, 17649630848U, 17658018944U, 17666403968U, 17674794112U,
|
||||||
|
17683178368U, 17691573376U, 17699962496U, 17708350592U, 17716739968U,
|
||||||
|
17725126528U, 17733517184U, 17741898112U, 17750293888U, 17758673024U,
|
||||||
|
17767070336U, 17775458432U, 17783848832U, 17792236928U, 17800625536U,
|
||||||
|
17809012352U, 17817402752U, 17825785984U, 17834178944U, 17842563968U,
|
||||||
|
17850955648U, 17859344512U, 17867732864U, 17876119424U, 17884511872U,
|
||||||
|
17892900224U, 17901287296U, 17909677696U, 17918058112U, 17926451072U,
|
||||||
|
17934843776U, 17943230848U, 17951609216U, 17960008576U, 17968397696U,
|
||||||
|
17976784256U, 17985175424U, 17993564032U, 18001952128U, 18010339712U,
|
||||||
|
18018728576U, 18027116672U, 18035503232U, 18043894144U, 18052283264U,
|
||||||
|
18060672128U, 18069056384U, 18077449856U, 18085837184U, 18094225792U,
|
||||||
|
18102613376U, 18111004544U, 18119388544U, 18127781248U, 18136170368U,
|
||||||
|
18144558976U, 18152947328U, 18161336192U, 18169724288U, 18178108544U,
|
||||||
|
18186498944U, 18194886784U, 18203275648U, 18211666048U, 18220048768U,
|
||||||
|
18228444544U, 18236833408U, 18245220736U
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Generated with the following Mathematica Code:
|
||||||
|
|
||||||
|
// GetCacheSizes[n_] := Module[{
|
||||||
|
// DataSetSizeBytesInit = 2^30,
|
||||||
|
// MixBytes = 128,
|
||||||
|
// DataSetGrowth = 2^23,
|
||||||
|
// HashBytes = 64,
|
||||||
|
// CacheMultiplier = 1024,
|
||||||
|
// j = 0},
|
||||||
|
// Reap[
|
||||||
|
// While[j < n,
|
||||||
|
// Module[{i = Floor[(DataSetSizeBytesInit + DataSetGrowth * j) / (CacheMultiplier * HashBytes)]},
|
||||||
|
// While[! PrimeQ[i], i--];
|
||||||
|
// Sow[i*HashBytes]; j++]]]][[2]][[1]]
|
||||||
|
|
||||||
|
const uint64_t cache_sizes[2048] = {
|
||||||
|
16776896U, 16907456U, 17039296U, 17170112U, 17301056U, 17432512U, 17563072U,
|
||||||
|
17693888U, 17824192U, 17955904U, 18087488U, 18218176U, 18349504U, 18481088U,
|
||||||
|
18611392U, 18742336U, 18874304U, 19004224U, 19135936U, 19267264U, 19398208U,
|
||||||
|
19529408U, 19660096U, 19791424U, 19922752U, 20053952U, 20184896U, 20315968U,
|
||||||
|
20446912U, 20576576U, 20709184U, 20840384U, 20971072U, 21102272U, 21233216U,
|
||||||
|
21364544U, 21494848U, 21626816U, 21757376U, 21887552U, 22019392U, 22151104U,
|
||||||
|
22281536U, 22412224U, 22543936U, 22675264U, 22806464U, 22935872U, 23068096U,
|
||||||
|
23198272U, 23330752U, 23459008U, 23592512U, 23723968U, 23854912U, 23986112U,
|
||||||
|
24116672U, 24247616U, 24378688U, 24509504U, 24640832U, 24772544U, 24903488U,
|
||||||
|
25034432U, 25165376U, 25296704U, 25427392U, 25558592U, 25690048U, 25820096U,
|
||||||
|
25951936U, 26081728U, 26214208U, 26345024U, 26476096U, 26606656U, 26737472U,
|
||||||
|
26869184U, 26998208U, 27131584U, 27262528U, 27393728U, 27523904U, 27655744U,
|
||||||
|
27786688U, 27917888U, 28049344U, 28179904U, 28311488U, 28441792U, 28573504U,
|
||||||
|
28700864U, 28835648U, 28966208U, 29096768U, 29228608U, 29359808U, 29490752U,
|
||||||
|
29621824U, 29752256U, 29882816U, 30014912U, 30144448U, 30273728U, 30406976U,
|
||||||
|
30538432U, 30670784U, 30799936U, 30932672U, 31063744U, 31195072U, 31325248U,
|
||||||
|
31456192U, 31588288U, 31719232U, 31850432U, 31981504U, 32110784U, 32243392U,
|
||||||
|
32372672U, 32505664U, 32636608U, 32767808U, 32897344U, 33029824U, 33160768U,
|
||||||
|
33289664U, 33423296U, 33554368U, 33683648U, 33816512U, 33947456U, 34076992U,
|
||||||
|
34208704U, 34340032U, 34471744U, 34600256U, 34734016U, 34864576U, 34993984U,
|
||||||
|
35127104U, 35258176U, 35386688U, 35518528U, 35650624U, 35782336U, 35910976U,
|
||||||
|
36044608U, 36175808U, 36305728U, 36436672U, 36568384U, 36699968U, 36830656U,
|
||||||
|
36961984U, 37093312U, 37223488U, 37355072U, 37486528U, 37617472U, 37747904U,
|
||||||
|
37879232U, 38009792U, 38141888U, 38272448U, 38403392U, 38535104U, 38660672U,
|
||||||
|
38795584U, 38925632U, 39059264U, 39190336U, 39320768U, 39452096U, 39581632U,
|
||||||
|
39713984U, 39844928U, 39974848U, 40107968U, 40238144U, 40367168U, 40500032U,
|
||||||
|
40631744U, 40762816U, 40894144U, 41023552U, 41155904U, 41286208U, 41418304U,
|
||||||
|
41547712U, 41680448U, 41811904U, 41942848U, 42073792U, 42204992U, 42334912U,
|
||||||
|
42467008U, 42597824U, 42729152U, 42860096U, 42991552U, 43122368U, 43253696U,
|
||||||
|
43382848U, 43515712U, 43646912U, 43777088U, 43907648U, 44039104U, 44170432U,
|
||||||
|
44302144U, 44433344U, 44564288U, 44694976U, 44825152U, 44956864U, 45088448U,
|
||||||
|
45219008U, 45350464U, 45481024U, 45612608U, 45744064U, 45874496U, 46006208U,
|
||||||
|
46136768U, 46267712U, 46399424U, 46529344U, 46660672U, 46791488U, 46923328U,
|
||||||
|
47053504U, 47185856U, 47316928U, 47447872U, 47579072U, 47710144U, 47839936U,
|
||||||
|
47971648U, 48103232U, 48234176U, 48365248U, 48496192U, 48627136U, 48757312U,
|
||||||
|
48889664U, 49020736U, 49149248U, 49283008U, 49413824U, 49545152U, 49675712U,
|
||||||
|
49807168U, 49938368U, 50069056U, 50200256U, 50331584U, 50462656U, 50593472U,
|
||||||
|
50724032U, 50853952U, 50986048U, 51117632U, 51248576U, 51379904U, 51510848U,
|
||||||
|
51641792U, 51773248U, 51903296U, 52035136U, 52164032U, 52297664U, 52427968U,
|
||||||
|
52557376U, 52690112U, 52821952U, 52952896U, 53081536U, 53213504U, 53344576U,
|
||||||
|
53475776U, 53608384U, 53738816U, 53870528U, 54000832U, 54131776U, 54263744U,
|
||||||
|
54394688U, 54525248U, 54655936U, 54787904U, 54918592U, 55049152U, 55181248U,
|
||||||
|
55312064U, 55442752U, 55574336U, 55705024U, 55836224U, 55967168U, 56097856U,
|
||||||
|
56228672U, 56358592U, 56490176U, 56621888U, 56753728U, 56884928U, 57015488U,
|
||||||
|
57146816U, 57278272U, 57409216U, 57540416U, 57671104U, 57802432U, 57933632U,
|
||||||
|
58064576U, 58195264U, 58326976U, 58457408U, 58588864U, 58720192U, 58849984U,
|
||||||
|
58981696U, 59113024U, 59243456U, 59375552U, 59506624U, 59637568U, 59768512U,
|
||||||
|
59897792U, 60030016U, 60161984U, 60293056U, 60423872U, 60554432U, 60683968U,
|
||||||
|
60817216U, 60948032U, 61079488U, 61209664U, 61341376U, 61471936U, 61602752U,
|
||||||
|
61733696U, 61865792U, 61996736U, 62127808U, 62259136U, 62389568U, 62520512U,
|
||||||
|
62651584U, 62781632U, 62910784U, 63045056U, 63176128U, 63307072U, 63438656U,
|
||||||
|
63569216U, 63700928U, 63831616U, 63960896U, 64093888U, 64225088U, 64355392U,
|
||||||
|
64486976U, 64617664U, 64748608U, 64879424U, 65009216U, 65142464U, 65273792U,
|
||||||
|
65402816U, 65535424U, 65666752U, 65797696U, 65927744U, 66060224U, 66191296U,
|
||||||
|
66321344U, 66453056U, 66584384U, 66715328U, 66846656U, 66977728U, 67108672U,
|
||||||
|
67239104U, 67370432U, 67501888U, 67631296U, 67763776U, 67895104U, 68026304U,
|
||||||
|
68157248U, 68287936U, 68419264U, 68548288U, 68681408U, 68811968U, 68942912U,
|
||||||
|
69074624U, 69205568U, 69337024U, 69467584U, 69599168U, 69729472U, 69861184U,
|
||||||
|
69989824U, 70122944U, 70253888U, 70385344U, 70515904U, 70647232U, 70778816U,
|
||||||
|
70907968U, 71040832U, 71171648U, 71303104U, 71432512U, 71564992U, 71695168U,
|
||||||
|
71826368U, 71958464U, 72089536U, 72219712U, 72350144U, 72482624U, 72613568U,
|
||||||
|
72744512U, 72875584U, 73006144U, 73138112U, 73268672U, 73400128U, 73530944U,
|
||||||
|
73662272U, 73793344U, 73924544U, 74055104U, 74185792U, 74316992U, 74448832U,
|
||||||
|
74579392U, 74710976U, 74841664U, 74972864U, 75102784U, 75233344U, 75364544U,
|
||||||
|
75497024U, 75627584U, 75759296U, 75890624U, 76021696U, 76152256U, 76283072U,
|
||||||
|
76414144U, 76545856U, 76676672U, 76806976U, 76937792U, 77070016U, 77200832U,
|
||||||
|
77331392U, 77462464U, 77593664U, 77725376U, 77856448U, 77987776U, 78118336U,
|
||||||
|
78249664U, 78380992U, 78511424U, 78642496U, 78773056U, 78905152U, 79033664U,
|
||||||
|
79166656U, 79297472U, 79429568U, 79560512U, 79690816U, 79822784U, 79953472U,
|
||||||
|
80084672U, 80214208U, 80346944U, 80477632U, 80608576U, 80740288U, 80870848U,
|
||||||
|
81002048U, 81133504U, 81264448U, 81395648U, 81525952U, 81657536U, 81786304U,
|
||||||
|
81919808U, 82050112U, 82181312U, 82311616U, 82443968U, 82573376U, 82705984U,
|
||||||
|
82835776U, 82967744U, 83096768U, 83230528U, 83359552U, 83491264U, 83622464U,
|
||||||
|
83753536U, 83886016U, 84015296U, 84147776U, 84277184U, 84409792U, 84540608U,
|
||||||
|
84672064U, 84803008U, 84934336U, 85065152U, 85193792U, 85326784U, 85458496U,
|
||||||
|
85589312U, 85721024U, 85851968U, 85982656U, 86112448U, 86244416U, 86370112U,
|
||||||
|
86506688U, 86637632U, 86769344U, 86900672U, 87031744U, 87162304U, 87293632U,
|
||||||
|
87424576U, 87555392U, 87687104U, 87816896U, 87947968U, 88079168U, 88211264U,
|
||||||
|
88341824U, 88473152U, 88603712U, 88735424U, 88862912U, 88996672U, 89128384U,
|
||||||
|
89259712U, 89390272U, 89521984U, 89652544U, 89783872U, 89914816U, 90045376U,
|
||||||
|
90177088U, 90307904U, 90438848U, 90569152U, 90700096U, 90832832U, 90963776U,
|
||||||
|
91093696U, 91223744U, 91356992U, 91486784U, 91618496U, 91749824U, 91880384U,
|
||||||
|
92012224U, 92143552U, 92273344U, 92405696U, 92536768U, 92666432U, 92798912U,
|
||||||
|
92926016U, 93060544U, 93192128U, 93322816U, 93453632U, 93583936U, 93715136U,
|
||||||
|
93845056U, 93977792U, 94109504U, 94240448U, 94371776U, 94501184U, 94632896U,
|
||||||
|
94764224U, 94895552U, 95023424U, 95158208U, 95287744U, 95420224U, 95550016U,
|
||||||
|
95681216U, 95811904U, 95943872U, 96075328U, 96203584U, 96337856U, 96468544U,
|
||||||
|
96599744U, 96731072U, 96860992U, 96992576U, 97124288U, 97254848U, 97385536U,
|
||||||
|
97517248U, 97647808U, 97779392U, 97910464U, 98041408U, 98172608U, 98303168U,
|
||||||
|
98434496U, 98565568U, 98696768U, 98827328U, 98958784U, 99089728U, 99220928U,
|
||||||
|
99352384U, 99482816U, 99614272U, 99745472U, 99876416U, 100007104U,
|
||||||
|
100138048U, 100267072U, 100401088U, 100529984U, 100662592U, 100791872U,
|
||||||
|
100925248U, 101056064U, 101187392U, 101317952U, 101449408U, 101580608U,
|
||||||
|
101711296U, 101841728U, 101973824U, 102104896U, 102235712U, 102366016U,
|
||||||
|
102498112U, 102628672U, 102760384U, 102890432U, 103021888U, 103153472U,
|
||||||
|
103284032U, 103415744U, 103545152U, 103677248U, 103808576U, 103939648U,
|
||||||
|
104070976U, 104201792U, 104332736U, 104462528U, 104594752U, 104725952U,
|
||||||
|
104854592U, 104988608U, 105118912U, 105247808U, 105381184U, 105511232U,
|
||||||
|
105643072U, 105774784U, 105903296U, 106037056U, 106167872U, 106298944U,
|
||||||
|
106429504U, 106561472U, 106691392U, 106822592U, 106954304U, 107085376U,
|
||||||
|
107216576U, 107346368U, 107478464U, 107609792U, 107739712U, 107872192U,
|
||||||
|
108003136U, 108131392U, 108265408U, 108396224U, 108527168U, 108657344U,
|
||||||
|
108789568U, 108920384U, 109049792U, 109182272U, 109312576U, 109444928U,
|
||||||
|
109572928U, 109706944U, 109837888U, 109969088U, 110099648U, 110230976U,
|
||||||
|
110362432U, 110492992U, 110624704U, 110755264U, 110886208U, 111017408U,
|
||||||
|
111148864U, 111279296U, 111410752U, 111541952U, 111673024U, 111803456U,
|
||||||
|
111933632U, 112066496U, 112196416U, 112328512U, 112457792U, 112590784U,
|
||||||
|
112715968U, 112852672U, 112983616U, 113114944U, 113244224U, 113376448U,
|
||||||
|
113505472U, 113639104U, 113770304U, 113901376U, 114031552U, 114163264U,
|
||||||
|
114294592U, 114425536U, 114556864U, 114687424U, 114818624U, 114948544U,
|
||||||
|
115080512U, 115212224U, 115343296U, 115473472U, 115605184U, 115736128U,
|
||||||
|
115867072U, 115997248U, 116128576U, 116260288U, 116391488U, 116522944U,
|
||||||
|
116652992U, 116784704U, 116915648U, 117046208U, 117178304U, 117308608U,
|
||||||
|
117440192U, 117569728U, 117701824U, 117833024U, 117964096U, 118094656U,
|
||||||
|
118225984U, 118357312U, 118489024U, 118617536U, 118749632U, 118882112U,
|
||||||
|
119012416U, 119144384U, 119275328U, 119406016U, 119537344U, 119668672U,
|
||||||
|
119798464U, 119928896U, 120061376U, 120192832U, 120321728U, 120454336U,
|
||||||
|
120584512U, 120716608U, 120848192U, 120979136U, 121109056U, 121241408U,
|
||||||
|
121372352U, 121502912U, 121634752U, 121764416U, 121895744U, 122027072U,
|
||||||
|
122157632U, 122289088U, 122421184U, 122550592U, 122682944U, 122813888U,
|
||||||
|
122945344U, 123075776U, 123207488U, 123338048U, 123468736U, 123600704U,
|
||||||
|
123731264U, 123861952U, 123993664U, 124124608U, 124256192U, 124386368U,
|
||||||
|
124518208U, 124649024U, 124778048U, 124911296U, 125041088U, 125173696U,
|
||||||
|
125303744U, 125432896U, 125566912U, 125696576U, 125829056U, 125958592U,
|
||||||
|
126090304U, 126221248U, 126352832U, 126483776U, 126615232U, 126746432U,
|
||||||
|
126876608U, 127008704U, 127139392U, 127270336U, 127401152U, 127532224U,
|
||||||
|
127663552U, 127794752U, 127925696U, 128055232U, 128188096U, 128319424U,
|
||||||
|
128449856U, 128581312U, 128712256U, 128843584U, 128973632U, 129103808U,
|
||||||
|
129236288U, 129365696U, 129498944U, 129629888U, 129760832U, 129892288U,
|
||||||
|
130023104U, 130154048U, 130283968U, 130416448U, 130547008U, 130678336U,
|
||||||
|
130807616U, 130939456U, 131071552U, 131202112U, 131331776U, 131464384U,
|
||||||
|
131594048U, 131727296U, 131858368U, 131987392U, 132120256U, 132250816U,
|
||||||
|
132382528U, 132513728U, 132644672U, 132774976U, 132905792U, 133038016U,
|
||||||
|
133168832U, 133299392U, 133429312U, 133562048U, 133692992U, 133823296U,
|
||||||
|
133954624U, 134086336U, 134217152U, 134348608U, 134479808U, 134607296U,
|
||||||
|
134741056U, 134872384U, 135002944U, 135134144U, 135265472U, 135396544U,
|
||||||
|
135527872U, 135659072U, 135787712U, 135921472U, 136052416U, 136182848U,
|
||||||
|
136313792U, 136444864U, 136576448U, 136707904U, 136837952U, 136970048U,
|
||||||
|
137099584U, 137232064U, 137363392U, 137494208U, 137625536U, 137755712U,
|
||||||
|
137887424U, 138018368U, 138149824U, 138280256U, 138411584U, 138539584U,
|
||||||
|
138672832U, 138804928U, 138936128U, 139066688U, 139196864U, 139328704U,
|
||||||
|
139460032U, 139590208U, 139721024U, 139852864U, 139984576U, 140115776U,
|
||||||
|
140245696U, 140376512U, 140508352U, 140640064U, 140769856U, 140902336U,
|
||||||
|
141032768U, 141162688U, 141294016U, 141426496U, 141556544U, 141687488U,
|
||||||
|
141819584U, 141949888U, 142080448U, 142212544U, 142342336U, 142474432U,
|
||||||
|
142606144U, 142736192U, 142868288U, 142997824U, 143129408U, 143258944U,
|
||||||
|
143392448U, 143523136U, 143653696U, 143785024U, 143916992U, 144045632U,
|
||||||
|
144177856U, 144309184U, 144440768U, 144570688U, 144701888U, 144832448U,
|
||||||
|
144965056U, 145096384U, 145227584U, 145358656U, 145489856U, 145620928U,
|
||||||
|
145751488U, 145883072U, 146011456U, 146144704U, 146275264U, 146407232U,
|
||||||
|
146538176U, 146668736U, 146800448U, 146931392U, 147062336U, 147193664U,
|
||||||
|
147324224U, 147455936U, 147586624U, 147717056U, 147848768U, 147979456U,
|
||||||
|
148110784U, 148242368U, 148373312U, 148503232U, 148635584U, 148766144U,
|
||||||
|
148897088U, 149028416U, 149159488U, 149290688U, 149420224U, 149551552U,
|
||||||
|
149683136U, 149814976U, 149943616U, 150076352U, 150208064U, 150338624U,
|
||||||
|
150470464U, 150600256U, 150732224U, 150862784U, 150993088U, 151125952U,
|
||||||
|
151254976U, 151388096U, 151519168U, 151649728U, 151778752U, 151911104U,
|
||||||
|
152042944U, 152174144U, 152304704U, 152435648U, 152567488U, 152698816U,
|
||||||
|
152828992U, 152960576U, 153091648U, 153222976U, 153353792U, 153484096U,
|
||||||
|
153616192U, 153747008U, 153878336U, 154008256U, 154139968U, 154270912U,
|
||||||
|
154402624U, 154533824U, 154663616U, 154795712U, 154926272U, 155057984U,
|
||||||
|
155188928U, 155319872U, 155450816U, 155580608U, 155712064U, 155843392U,
|
||||||
|
155971136U, 156106688U, 156237376U, 156367424U, 156499264U, 156630976U,
|
||||||
|
156761536U, 156892352U, 157024064U, 157155008U, 157284416U, 157415872U,
|
||||||
|
157545536U, 157677248U, 157810496U, 157938112U, 158071744U, 158203328U,
|
||||||
|
158334656U, 158464832U, 158596288U, 158727616U, 158858048U, 158988992U,
|
||||||
|
159121216U, 159252416U, 159381568U, 159513152U, 159645632U, 159776192U,
|
||||||
|
159906496U, 160038464U, 160169536U, 160300352U, 160430656U, 160563008U,
|
||||||
|
160693952U, 160822208U, 160956352U, 161086784U, 161217344U, 161349184U,
|
||||||
|
161480512U, 161611456U, 161742272U, 161873216U, 162002752U, 162135872U,
|
||||||
|
162266432U, 162397888U, 162529216U, 162660032U, 162790976U, 162922048U,
|
||||||
|
163052096U, 163184576U, 163314752U, 163446592U, 163577408U, 163707968U,
|
||||||
|
163839296U, 163969984U, 164100928U, 164233024U, 164364224U, 164494912U,
|
||||||
|
164625856U, 164756672U, 164887616U, 165019072U, 165150016U, 165280064U,
|
||||||
|
165412672U, 165543104U, 165674944U, 165805888U, 165936832U, 166067648U,
|
||||||
|
166198336U, 166330048U, 166461248U, 166591552U, 166722496U, 166854208U,
|
||||||
|
166985408U, 167116736U, 167246656U, 167378368U, 167508416U, 167641024U,
|
||||||
|
167771584U, 167903168U, 168034112U, 168164032U, 168295744U, 168427456U,
|
||||||
|
168557632U, 168688448U, 168819136U, 168951616U, 169082176U, 169213504U,
|
||||||
|
169344832U, 169475648U, 169605952U, 169738048U, 169866304U, 169999552U,
|
||||||
|
170131264U, 170262464U, 170393536U, 170524352U, 170655424U, 170782016U,
|
||||||
|
170917696U, 171048896U, 171179072U, 171310784U, 171439936U, 171573184U,
|
||||||
|
171702976U, 171835072U, 171966272U, 172097216U, 172228288U, 172359232U,
|
||||||
|
172489664U, 172621376U, 172747712U, 172883264U, 173014208U, 173144512U,
|
||||||
|
173275072U, 173407424U, 173539136U, 173669696U, 173800768U, 173931712U,
|
||||||
|
174063424U, 174193472U, 174325696U, 174455744U, 174586816U, 174718912U,
|
||||||
|
174849728U, 174977728U, 175109696U, 175242688U, 175374272U, 175504832U,
|
||||||
|
175636288U, 175765696U, 175898432U, 176028992U, 176159936U, 176291264U,
|
||||||
|
176422592U, 176552512U, 176684864U, 176815424U, 176946496U, 177076544U,
|
||||||
|
177209152U, 177340096U, 177470528U, 177600704U, 177731648U, 177864256U,
|
||||||
|
177994816U, 178126528U, 178257472U, 178387648U, 178518464U, 178650176U,
|
||||||
|
178781888U, 178912064U, 179044288U, 179174848U, 179305024U, 179436736U,
|
||||||
|
179568448U, 179698496U, 179830208U, 179960512U, 180092608U, 180223808U,
|
||||||
|
180354752U, 180485696U, 180617152U, 180748096U, 180877504U, 181009984U,
|
||||||
|
181139264U, 181272512U, 181402688U, 181532608U, 181663168U, 181795136U,
|
||||||
|
181926592U, 182057536U, 182190016U, 182320192U, 182451904U, 182582336U,
|
||||||
|
182713792U, 182843072U, 182976064U, 183107264U, 183237056U, 183368384U,
|
||||||
|
183494848U, 183631424U, 183762752U, 183893824U, 184024768U, 184154816U,
|
||||||
|
184286656U, 184417984U, 184548928U, 184680128U, 184810816U, 184941248U,
|
||||||
|
185072704U, 185203904U, 185335616U, 185465408U, 185596352U, 185727296U,
|
||||||
|
185859904U, 185989696U, 186121664U, 186252992U, 186383552U, 186514112U,
|
||||||
|
186645952U, 186777152U, 186907328U, 187037504U, 187170112U, 187301824U,
|
||||||
|
187429184U, 187562048U, 187693504U, 187825472U, 187957184U, 188087104U,
|
||||||
|
188218304U, 188349376U, 188481344U, 188609728U, 188743616U, 188874304U,
|
||||||
|
189005248U, 189136448U, 189265088U, 189396544U, 189528128U, 189660992U,
|
||||||
|
189791936U, 189923264U, 190054208U, 190182848U, 190315072U, 190447424U,
|
||||||
|
190577984U, 190709312U, 190840768U, 190971328U, 191102656U, 191233472U,
|
||||||
|
191364032U, 191495872U, 191626816U, 191758016U, 191888192U, 192020288U,
|
||||||
|
192148928U, 192282176U, 192413504U, 192542528U, 192674752U, 192805952U,
|
||||||
|
192937792U, 193068608U, 193198912U, 193330496U, 193462208U, 193592384U,
|
||||||
|
193723456U, 193854272U, 193985984U, 194116672U, 194247232U, 194379712U,
|
||||||
|
194508352U, 194641856U, 194772544U, 194900672U, 195035072U, 195166016U,
|
||||||
|
195296704U, 195428032U, 195558592U, 195690304U, 195818176U, 195952576U,
|
||||||
|
196083392U, 196214336U, 196345792U, 196476736U, 196607552U, 196739008U,
|
||||||
|
196869952U, 197000768U, 197130688U, 197262784U, 197394368U, 197523904U,
|
||||||
|
197656384U, 197787584U, 197916608U, 198049472U, 198180544U, 198310208U,
|
||||||
|
198442432U, 198573632U, 198705088U, 198834368U, 198967232U, 199097792U,
|
||||||
|
199228352U, 199360192U, 199491392U, 199621696U, 199751744U, 199883968U,
|
||||||
|
200014016U, 200146624U, 200276672U, 200408128U, 200540096U, 200671168U,
|
||||||
|
200801984U, 200933312U, 201062464U, 201194944U, 201326144U, 201457472U,
|
||||||
|
201588544U, 201719744U, 201850816U, 201981632U, 202111552U, 202244032U,
|
||||||
|
202374464U, 202505152U, 202636352U, 202767808U, 202898368U, 203030336U,
|
||||||
|
203159872U, 203292608U, 203423296U, 203553472U, 203685824U, 203816896U,
|
||||||
|
203947712U, 204078272U, 204208192U, 204341056U, 204472256U, 204603328U,
|
||||||
|
204733888U, 204864448U, 204996544U, 205125568U, 205258304U, 205388864U,
|
||||||
|
205517632U, 205650112U, 205782208U, 205913536U, 206044736U, 206176192U,
|
||||||
|
206307008U, 206434496U, 206569024U, 206700224U, 206831168U, 206961856U,
|
||||||
|
207093056U, 207223616U, 207355328U, 207486784U, 207616832U, 207749056U,
|
||||||
|
207879104U, 208010048U, 208141888U, 208273216U, 208404032U, 208534336U,
|
||||||
|
208666048U, 208796864U, 208927424U, 209059264U, 209189824U, 209321792U,
|
||||||
|
209451584U, 209582656U, 209715136U, 209845568U, 209976896U, 210106432U,
|
||||||
|
210239296U, 210370112U, 210501568U, 210630976U, 210763712U, 210894272U,
|
||||||
|
211024832U, 211156672U, 211287616U, 211418176U, 211549376U, 211679296U,
|
||||||
|
211812032U, 211942592U, 212074432U, 212204864U, 212334016U, 212467648U,
|
||||||
|
212597824U, 212727616U, 212860352U, 212991424U, 213120832U, 213253952U,
|
||||||
|
213385024U, 213515584U, 213645632U, 213777728U, 213909184U, 214040128U,
|
||||||
|
214170688U, 214302656U, 214433728U, 214564544U, 214695232U, 214826048U,
|
||||||
|
214956992U, 215089088U, 215219776U, 215350592U, 215482304U, 215613248U,
|
||||||
|
215743552U, 215874752U, 216005312U, 216137024U, 216267328U, 216399296U,
|
||||||
|
216530752U, 216661696U, 216790592U, 216923968U, 217054528U, 217183168U,
|
||||||
|
217316672U, 217448128U, 217579072U, 217709504U, 217838912U, 217972672U,
|
||||||
|
218102848U, 218233024U, 218364736U, 218496832U, 218627776U, 218759104U,
|
||||||
|
218888896U, 219021248U, 219151936U, 219281728U, 219413056U, 219545024U,
|
||||||
|
219675968U, 219807296U, 219938624U, 220069312U, 220200128U, 220331456U,
|
||||||
|
220461632U, 220592704U, 220725184U, 220855744U, 220987072U, 221117888U,
|
||||||
|
221249216U, 221378368U, 221510336U, 221642048U, 221772736U, 221904832U,
|
||||||
|
222031808U, 222166976U, 222297536U, 222428992U, 222559936U, 222690368U,
|
||||||
|
222820672U, 222953152U, 223083968U, 223213376U, 223345984U, 223476928U,
|
||||||
|
223608512U, 223738688U, 223869376U, 224001472U, 224132672U, 224262848U,
|
||||||
|
224394944U, 224524864U, 224657344U, 224788288U, 224919488U, 225050432U,
|
||||||
|
225181504U, 225312704U, 225443776U, 225574592U, 225704768U, 225834176U,
|
||||||
|
225966784U, 226097216U, 226229824U, 226360384U, 226491712U, 226623424U,
|
||||||
|
226754368U, 226885312U, 227015104U, 227147456U, 227278528U, 227409472U,
|
||||||
|
227539904U, 227669696U, 227802944U, 227932352U, 228065216U, 228196288U,
|
||||||
|
228326464U, 228457792U, 228588736U, 228720064U, 228850112U, 228981056U,
|
||||||
|
229113152U, 229243328U, 229375936U, 229505344U, 229636928U, 229769152U,
|
||||||
|
229894976U, 230030272U, 230162368U, 230292416U, 230424512U, 230553152U,
|
||||||
|
230684864U, 230816704U, 230948416U, 231079616U, 231210944U, 231342016U,
|
||||||
|
231472448U, 231603776U, 231733952U, 231866176U, 231996736U, 232127296U,
|
||||||
|
232259392U, 232388672U, 232521664U, 232652608U, 232782272U, 232914496U,
|
||||||
|
233043904U, 233175616U, 233306816U, 233438528U, 233569984U, 233699776U,
|
||||||
|
233830592U, 233962688U, 234092224U, 234221888U, 234353984U, 234485312U,
|
||||||
|
234618304U, 234749888U, 234880832U, 235011776U, 235142464U, 235274048U,
|
||||||
|
235403456U, 235535936U, 235667392U, 235797568U, 235928768U, 236057152U,
|
||||||
|
236190272U, 236322752U, 236453312U, 236583616U, 236715712U, 236846528U,
|
||||||
|
236976448U, 237108544U, 237239104U, 237371072U, 237501632U, 237630784U,
|
||||||
|
237764416U, 237895232U, 238026688U, 238157632U, 238286912U, 238419392U,
|
||||||
|
238548032U, 238681024U, 238812608U, 238941632U, 239075008U, 239206336U,
|
||||||
|
239335232U, 239466944U, 239599168U, 239730496U, 239861312U, 239992384U,
|
||||||
|
240122816U, 240254656U, 240385856U, 240516928U, 240647872U, 240779072U,
|
||||||
|
240909632U, 241040704U, 241171904U, 241302848U, 241433408U, 241565248U,
|
||||||
|
241696192U, 241825984U, 241958848U, 242088256U, 242220224U, 242352064U,
|
||||||
|
242481856U, 242611648U, 242744896U, 242876224U, 243005632U, 243138496U,
|
||||||
|
243268672U, 243400384U, 243531712U, 243662656U, 243793856U, 243924544U,
|
||||||
|
244054592U, 244187072U, 244316608U, 244448704U, 244580032U, 244710976U,
|
||||||
|
244841536U, 244972864U, 245104448U, 245233984U, 245365312U, 245497792U,
|
||||||
|
245628736U, 245759936U, 245889856U, 246021056U, 246152512U, 246284224U,
|
||||||
|
246415168U, 246545344U, 246675904U, 246808384U, 246939584U, 247070144U,
|
||||||
|
247199552U, 247331648U, 247463872U, 247593536U, 247726016U, 247857088U,
|
||||||
|
247987648U, 248116928U, 248249536U, 248380736U, 248512064U, 248643008U,
|
||||||
|
248773312U, 248901056U, 249036608U, 249167552U, 249298624U, 249429184U,
|
||||||
|
249560512U, 249692096U, 249822784U, 249954112U, 250085312U, 250215488U,
|
||||||
|
250345792U, 250478528U, 250608704U, 250739264U, 250870976U, 251002816U,
|
||||||
|
251133632U, 251263552U, 251395136U, 251523904U, 251657792U, 251789248U,
|
||||||
|
251919424U, 252051392U, 252182464U, 252313408U, 252444224U, 252575552U,
|
||||||
|
252706624U, 252836032U, 252968512U, 253099712U, 253227584U, 253361728U,
|
||||||
|
253493056U, 253623488U, 253754432U, 253885504U, 254017216U, 254148032U,
|
||||||
|
254279488U, 254410432U, 254541376U, 254672576U, 254803264U, 254933824U,
|
||||||
|
255065792U, 255196736U, 255326528U, 255458752U, 255589952U, 255721408U,
|
||||||
|
255851072U, 255983296U, 256114624U, 256244416U, 256374208U, 256507712U,
|
||||||
|
256636096U, 256768832U, 256900544U, 257031616U, 257162176U, 257294272U,
|
||||||
|
257424448U, 257555776U, 257686976U, 257818432U, 257949632U, 258079552U,
|
||||||
|
258211136U, 258342464U, 258473408U, 258603712U, 258734656U, 258867008U,
|
||||||
|
258996544U, 259127744U, 259260224U, 259391296U, 259522112U, 259651904U,
|
||||||
|
259784384U, 259915328U, 260045888U, 260175424U, 260308544U, 260438336U,
|
||||||
|
260570944U, 260700992U, 260832448U, 260963776U, 261092672U, 261226304U,
|
||||||
|
261356864U, 261487936U, 261619648U, 261750592U, 261879872U, 262011968U,
|
||||||
|
262143424U, 262274752U, 262404416U, 262537024U, 262667968U, 262799296U,
|
||||||
|
262928704U, 263061184U, 263191744U, 263322944U, 263454656U, 263585216U,
|
||||||
|
263716672U, 263847872U, 263978944U, 264108608U, 264241088U, 264371648U,
|
||||||
|
264501184U, 264632768U, 264764096U, 264895936U, 265024576U, 265158464U,
|
||||||
|
265287488U, 265418432U, 265550528U, 265681216U, 265813312U, 265943488U,
|
||||||
|
266075968U, 266206144U, 266337728U, 266468032U, 266600384U, 266731072U,
|
||||||
|
266862272U, 266993344U, 267124288U, 267255616U, 267386432U, 267516992U,
|
||||||
|
267648704U, 267777728U, 267910592U, 268040512U, 268172096U, 268302784U,
|
||||||
|
268435264U, 268566208U, 268696256U, 268828096U, 268959296U, 269090368U,
|
||||||
|
269221312U, 269352256U, 269482688U, 269614784U, 269745856U, 269876416U,
|
||||||
|
270007616U, 270139328U, 270270272U, 270401216U, 270531904U, 270663616U,
|
||||||
|
270791744U, 270924736U, 271056832U, 271186112U, 271317184U, 271449536U,
|
||||||
|
271580992U, 271711936U, 271843136U, 271973056U, 272105408U, 272236352U,
|
||||||
|
272367296U, 272498368U, 272629568U, 272759488U, 272891456U, 273022784U,
|
||||||
|
273153856U, 273284672U, 273415616U, 273547072U, 273677632U, 273808448U,
|
||||||
|
273937088U, 274071488U, 274200896U, 274332992U, 274463296U, 274595392U,
|
||||||
|
274726208U, 274857536U, 274988992U, 275118656U, 275250496U, 275382208U,
|
||||||
|
275513024U, 275643968U, 275775296U, 275906368U, 276037184U, 276167872U,
|
||||||
|
276297664U, 276429376U, 276560576U, 276692672U, 276822976U, 276955072U,
|
||||||
|
277085632U, 277216832U, 277347008U, 277478848U, 277609664U, 277740992U,
|
||||||
|
277868608U, 278002624U, 278134336U, 278265536U, 278395328U, 278526784U,
|
||||||
|
278657728U, 278789824U, 278921152U, 279052096U, 279182912U, 279313088U,
|
||||||
|
279443776U, 279576256U, 279706048U, 279838528U, 279969728U, 280099648U,
|
||||||
|
280230976U, 280361408U, 280493632U, 280622528U, 280755392U, 280887104U,
|
||||||
|
281018176U, 281147968U, 281278912U, 281411392U, 281542592U, 281673152U,
|
||||||
|
281803712U, 281935552U, 282066496U, 282197312U, 282329024U, 282458816U,
|
||||||
|
282590272U, 282720832U, 282853184U, 282983744U, 283115072U, 283246144U,
|
||||||
|
283377344U, 283508416U, 283639744U, 283770304U, 283901504U, 284032576U,
|
||||||
|
284163136U, 284294848U, 284426176U, 284556992U, 284687296U, 284819264U,
|
||||||
|
284950208U, 285081536U
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
77
src/3rdparty/libethash/endian.h
vendored
Normal file
77
src/3rdparty/libethash/endian.h
vendored
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#if defined(__MINGW32__) || defined(_WIN32)
|
||||||
|
# define LITTLE_ENDIAN 1234
|
||||||
|
# define BYTE_ORDER LITTLE_ENDIAN
|
||||||
|
#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__)
|
||||||
|
# include <sys/endian.h>
|
||||||
|
#elif defined(__OpenBSD__) || defined(__SVR4)
|
||||||
|
# include <sys/types.h>
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
# include <machine/endian.h>
|
||||||
|
#elif defined( BSD ) && (BSD >= 199103)
|
||||||
|
# include <machine/endian.h>
|
||||||
|
#elif defined( __QNXNTO__ ) && defined( __LITTLEENDIAN__ )
|
||||||
|
# define LITTLE_ENDIAN 1234
|
||||||
|
# define BYTE_ORDER LITTLE_ENDIAN
|
||||||
|
#elif defined( __QNXNTO__ ) && defined( __BIGENDIAN__ )
|
||||||
|
# define BIG_ENDIAN 1234
|
||||||
|
# define BYTE_ORDER BIG_ENDIAN
|
||||||
|
#else
|
||||||
|
# include <endian.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
#include <stdlib.h>
|
||||||
|
#define ethash_swap_u32(input_) _byteswap_ulong(input_)
|
||||||
|
#define ethash_swap_u64(input_) _byteswap_uint64(input_)
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#include <libkern/OSByteOrder.h>
|
||||||
|
#define ethash_swap_u32(input_) OSSwapInt32(input_)
|
||||||
|
#define ethash_swap_u64(input_) OSSwapInt64(input_)
|
||||||
|
#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__)
|
||||||
|
#define ethash_swap_u32(input_) bswap32(input_)
|
||||||
|
#define ethash_swap_u64(input_) bswap64(input_)
|
||||||
|
#elif defined(__OpenBSD__)
|
||||||
|
#include <endian.h>
|
||||||
|
#define ethash_swap_u32(input_) swap32(input_)
|
||||||
|
#define ethash_swap_u64(input_) swap64(input_)
|
||||||
|
#else // posix
|
||||||
|
#include <byteswap.h>
|
||||||
|
#define ethash_swap_u32(input_) bswap_32(input_)
|
||||||
|
#define ethash_swap_u64(input_) bswap_64(input_)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if LITTLE_ENDIAN == BYTE_ORDER
|
||||||
|
|
||||||
|
#define fix_endian32(dst_ ,src_) dst_ = src_
|
||||||
|
#define fix_endian32_same(val_)
|
||||||
|
#define fix_endian64(dst_, src_) dst_ = src_
|
||||||
|
#define fix_endian64_same(val_)
|
||||||
|
#define fix_endian_arr32(arr_, size_)
|
||||||
|
#define fix_endian_arr64(arr_, size_)
|
||||||
|
|
||||||
|
#elif BIG_ENDIAN == BYTE_ORDER
|
||||||
|
|
||||||
|
#define fix_endian32(dst_, src_) dst_ = ethash_swap_u32(src_)
|
||||||
|
#define fix_endian32_same(val_) val_ = ethash_swap_u32(val_)
|
||||||
|
#define fix_endian64(dst_, src_) dst_ = ethash_swap_u64(src_)
|
||||||
|
#define fix_endian64_same(val_) val_ = ethash_swap_u64(val_)
|
||||||
|
#define fix_endian_arr32(arr_, size_) \
|
||||||
|
do { \
|
||||||
|
for (unsigned i_ = 0; i_ < (size_); ++i_) { \
|
||||||
|
arr_[i_] = ethash_swap_u32(arr_[i_]); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
#define fix_endian_arr64(arr_, size_) \
|
||||||
|
do { \
|
||||||
|
for (unsigned i_ = 0; i_ < (size_); ++i_) { \
|
||||||
|
arr_[i_] = ethash_swap_u64(arr_[i_]); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
# error "endian not supported"
|
||||||
|
#endif // BYTE_ORDER
|
158
src/3rdparty/libethash/ethash.h
vendored
Normal file
158
src/3rdparty/libethash/ethash.h
vendored
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
/*
|
||||||
|
This file is part of ethash.
|
||||||
|
|
||||||
|
ethash is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
ethash is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with ethash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @file ethash.h
|
||||||
|
* @date 2015
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#define ETHASH_REVISION 23
|
||||||
|
#define ETHASH_DATASET_BYTES_INIT 1073741824U // 2**30
|
||||||
|
#define ETHASH_DATASET_BYTES_GROWTH 8388608U // 2**23
|
||||||
|
#define ETHASH_CACHE_BYTES_INIT 1073741824U // 2**24
|
||||||
|
#define ETHASH_CACHE_BYTES_GROWTH 131072U // 2**17
|
||||||
|
#define ETHASH_EPOCH_LENGTH 30000U
|
||||||
|
#define ETHASH_MIX_BYTES 128
|
||||||
|
#define ETHASH_HASH_BYTES 64
|
||||||
|
#define ETHASH_DATASET_PARENTS 256
|
||||||
|
#define ETHASH_CACHE_ROUNDS 3
|
||||||
|
#define ETHASH_ACCESSES 64
|
||||||
|
#define ETHASH_DAG_MAGIC_NUM_SIZE 8
|
||||||
|
#define ETHASH_DAG_MAGIC_NUM 0xFEE1DEADBADDCAFE
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// Type of a seedhash/blockhash e.t.c.
|
||||||
|
typedef struct ethash_h256 { uint8_t b[32]; } ethash_h256_t;
|
||||||
|
|
||||||
|
// convenience macro to statically initialize an h256_t
|
||||||
|
// usage:
|
||||||
|
// ethash_h256_t a = ethash_h256_static_init(1, 2, 3, ... )
|
||||||
|
// have to provide all 32 values. If you don't provide all the rest
|
||||||
|
// will simply be unitialized (not guranteed to be 0)
|
||||||
|
#define ethash_h256_static_init(...) \
|
||||||
|
{ {__VA_ARGS__} }
|
||||||
|
|
||||||
|
struct ethash_light;
|
||||||
|
typedef struct ethash_light* ethash_light_t;
|
||||||
|
struct ethash_full;
|
||||||
|
typedef struct ethash_full* ethash_full_t;
|
||||||
|
typedef int(*ethash_callback_t)(unsigned);
|
||||||
|
|
||||||
|
typedef struct ethash_return_value {
|
||||||
|
ethash_h256_t result;
|
||||||
|
ethash_h256_t mix_hash;
|
||||||
|
bool success;
|
||||||
|
} ethash_return_value_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and initialize a new ethash_light handler
|
||||||
|
*
|
||||||
|
* @param block_number The block number for which to create the handler
|
||||||
|
* @return Newly allocated ethash_light handler or NULL in case of
|
||||||
|
* ERRNOMEM or invalid parameters used for @ref ethash_compute_cache_nodes()
|
||||||
|
*/
|
||||||
|
ethash_light_t ethash_light_new(uint64_t block_number);
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
bool ethash_compute_cache_nodes(
|
||||||
|
void* nodes,
|
||||||
|
uint64_t cache_size,
|
||||||
|
ethash_h256_t const* seed
|
||||||
|
);
|
||||||
|
/**
|
||||||
|
* Frees a previously allocated ethash_light handler
|
||||||
|
* @param light The light handler to free
|
||||||
|
*/
|
||||||
|
void ethash_light_delete(ethash_light_t light);
|
||||||
|
/**
|
||||||
|
* Calculate the light client data
|
||||||
|
*
|
||||||
|
* @param light The light client handler
|
||||||
|
* @param header_hash The header hash to pack into the mix
|
||||||
|
* @param nonce The nonce to pack into the mix
|
||||||
|
* @return an object of ethash_return_value_t holding the return values
|
||||||
|
*/
|
||||||
|
ethash_return_value_t ethash_light_compute(
|
||||||
|
ethash_light_t light,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t nonce
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and initialize a new ethash_full handler
|
||||||
|
*
|
||||||
|
* @param light The light handler containing the cache.
|
||||||
|
* @param callback A callback function with signature of @ref ethash_callback_t
|
||||||
|
* It accepts an unsigned with which a progress of DAG calculation
|
||||||
|
* can be displayed. If all goes well the callback should return 0.
|
||||||
|
* If a non-zero value is returned then DAG generation will stop.
|
||||||
|
* Be advised. A progress value of 100 means that DAG creation is
|
||||||
|
* almost complete and that this function will soon return succesfully.
|
||||||
|
* It does not mean that the function has already had a succesfull return.
|
||||||
|
* @return Newly allocated ethash_full handler or NULL in case of
|
||||||
|
* ERRNOMEM or invalid parameters used for @ref ethash_compute_full_data()
|
||||||
|
*/
|
||||||
|
ethash_full_t ethash_full_new(ethash_light_t light, ethash_callback_t callback);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees a previously allocated ethash_full handler
|
||||||
|
* @param full The light handler to free
|
||||||
|
*/
|
||||||
|
void ethash_full_delete(ethash_full_t full);
|
||||||
|
/**
|
||||||
|
* Calculate the full client data
|
||||||
|
*
|
||||||
|
* @param full The full client handler
|
||||||
|
* @param header_hash The header hash to pack into the mix
|
||||||
|
* @param nonce The nonce to pack into the mix
|
||||||
|
* @return An object of ethash_return_value to hold the return value
|
||||||
|
*/
|
||||||
|
ethash_return_value_t ethash_full_compute(
|
||||||
|
ethash_full_t full,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t nonce
|
||||||
|
);
|
||||||
|
/**
|
||||||
|
* Get a pointer to the full DAG data
|
||||||
|
*/
|
||||||
|
void const* ethash_full_dag(ethash_full_t full);
|
||||||
|
/**
|
||||||
|
* Get the size of the DAG data
|
||||||
|
*/
|
||||||
|
uint64_t ethash_full_dag_size(ethash_full_t full);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the seedhash for a given epoch
|
||||||
|
*/
|
||||||
|
ethash_h256_t ethash_get_seedhash(uint64_t epoch);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* KeccakF800 for ProgPoW
|
||||||
|
*/
|
||||||
|
void ethash_keccakf800(uint32_t state[25]);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
444
src/3rdparty/libethash/ethash_internal.c
vendored
Normal file
444
src/3rdparty/libethash/ethash_internal.c
vendored
Normal file
|
@ -0,0 +1,444 @@
|
||||||
|
/*
|
||||||
|
This file is part of ethash.
|
||||||
|
|
||||||
|
ethash is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
ethash is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/** @file internal.c
|
||||||
|
* @author Tim Hughes <tim@twistedfury.com>
|
||||||
|
* @author Matthew Wampler-Doty
|
||||||
|
* @date 2015
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "ethash.h"
|
||||||
|
#include "fnv.h"
|
||||||
|
#include "endian.h"
|
||||||
|
#include "ethash_internal.h"
|
||||||
|
#include "data_sizes.h"
|
||||||
|
#include "base/crypto/sha3.h"
|
||||||
|
|
||||||
|
#define SHA3_256(a, b, c) sha3_HashBuffer(256, SHA3_FLAGS_KECCAK, b, c, a, 32)
|
||||||
|
#define SHA3_512(a, b, c) sha3_HashBuffer(512, SHA3_FLAGS_KECCAK, b, c, a, 64)
|
||||||
|
|
||||||
|
uint64_t ethash_get_datasize(uint64_t const block_number)
|
||||||
|
{
|
||||||
|
assert(block_number / ETHASH_EPOCH_LENGTH < 2048);
|
||||||
|
return dag_sizes[block_number / ETHASH_EPOCH_LENGTH];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t ethash_get_cachesize(uint64_t const block_number)
|
||||||
|
{
|
||||||
|
assert(block_number / ETHASH_EPOCH_LENGTH < 2048);
|
||||||
|
return cache_sizes[block_number / ETHASH_EPOCH_LENGTH];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Follows Sergio's "STRICT MEMORY HARD HASHING FUNCTIONS" (2014)
|
||||||
|
// https://bitslog.files.wordpress.com/2013/12/memohash-v0-3.pdf
|
||||||
|
// SeqMemoHash(s, R, N)
|
||||||
|
bool ethash_compute_cache_nodes(
|
||||||
|
void* nodes_ptr,
|
||||||
|
uint64_t cache_size,
|
||||||
|
ethash_h256_t const* seed
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (cache_size % sizeof(node) != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint32_t const num_nodes = (uint32_t) (cache_size / sizeof(node));
|
||||||
|
|
||||||
|
node* nodes = (node*)nodes_ptr;
|
||||||
|
SHA3_512(nodes[0].bytes, (uint8_t*)seed, 32);
|
||||||
|
|
||||||
|
for (uint32_t i = 1; i != num_nodes; ++i) {
|
||||||
|
SHA3_512(nodes[i].bytes, nodes[i - 1].bytes, 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t j = 0; j != ETHASH_CACHE_ROUNDS; j++) {
|
||||||
|
for (uint32_t i = 0; i != num_nodes; i++) {
|
||||||
|
uint32_t const idx = nodes[i].words[0] % num_nodes;
|
||||||
|
node data;
|
||||||
|
data = nodes[(num_nodes - 1 + i) % num_nodes];
|
||||||
|
for (uint32_t w = 0; w != NODE_WORDS; ++w) {
|
||||||
|
data.words[w] ^= nodes[idx].words[w];
|
||||||
|
}
|
||||||
|
SHA3_512(nodes[i].bytes, data.bytes, sizeof(data));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// now perform endian conversion
|
||||||
|
fix_endian_arr32(nodes->words, num_nodes * NODE_WORDS);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ethash_calculate_dag_item(
|
||||||
|
node* const ret,
|
||||||
|
uint32_t node_index,
|
||||||
|
uint32_t num_parents,
|
||||||
|
ethash_light_t const light
|
||||||
|
)
|
||||||
|
{
|
||||||
|
uint32_t num_parent_nodes = (uint32_t) (light->cache_size / sizeof(node));
|
||||||
|
node const* cache_nodes = (node const *) light->cache;
|
||||||
|
node const* init = &cache_nodes[node_index % num_parent_nodes];
|
||||||
|
memcpy(ret, init, sizeof(node));
|
||||||
|
ret->words[0] ^= node_index;
|
||||||
|
SHA3_512(ret->bytes, ret->bytes, sizeof(node));
|
||||||
|
#if defined(_M_X64) && ENABLE_SSE
|
||||||
|
__m128i const fnv_prime = _mm_set1_epi32(FNV_PRIME);
|
||||||
|
__m128i xmm0 = ret->xmm[0];
|
||||||
|
__m128i xmm1 = ret->xmm[1];
|
||||||
|
__m128i xmm2 = ret->xmm[2];
|
||||||
|
__m128i xmm3 = ret->xmm[3];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i != num_parents; ++i) {
|
||||||
|
uint32_t parent_index = fnv_hash(node_index ^ i, ret->words[i % NODE_WORDS]) % num_parent_nodes;
|
||||||
|
node const *parent = &cache_nodes[parent_index];
|
||||||
|
|
||||||
|
#if defined(_M_X64) && ENABLE_SSE
|
||||||
|
{
|
||||||
|
xmm0 = _mm_mullo_epi32(xmm0, fnv_prime);
|
||||||
|
xmm1 = _mm_mullo_epi32(xmm1, fnv_prime);
|
||||||
|
xmm2 = _mm_mullo_epi32(xmm2, fnv_prime);
|
||||||
|
xmm3 = _mm_mullo_epi32(xmm3, fnv_prime);
|
||||||
|
xmm0 = _mm_xor_si128(xmm0, parent->xmm[0]);
|
||||||
|
xmm1 = _mm_xor_si128(xmm1, parent->xmm[1]);
|
||||||
|
xmm2 = _mm_xor_si128(xmm2, parent->xmm[2]);
|
||||||
|
xmm3 = _mm_xor_si128(xmm3, parent->xmm[3]);
|
||||||
|
|
||||||
|
// have to write to ret as values are used to compute index
|
||||||
|
ret->xmm[0] = xmm0;
|
||||||
|
ret->xmm[1] = xmm1;
|
||||||
|
ret->xmm[2] = xmm2;
|
||||||
|
ret->xmm[3] = xmm3;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
for (unsigned w = 0; w != NODE_WORDS; ++w) {
|
||||||
|
ret->words[w] = fnv_hash(ret->words[w], parent->words[w]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
SHA3_512(ret->bytes, ret->bytes, sizeof(node));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t fast_mod(uint64_t a, uint64_t d, uint64_t r, uint64_t i, uint64_t s)
|
||||||
|
{
|
||||||
|
const uint32_t q = ((a + i) * r) >> s;
|
||||||
|
return a - q * d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ethash_calculate_dag_item_opt(
|
||||||
|
node* const ret,
|
||||||
|
uint32_t node_index,
|
||||||
|
uint32_t num_parents,
|
||||||
|
ethash_light_t const light
|
||||||
|
)
|
||||||
|
{
|
||||||
|
node const* cache_nodes = (node const*)light->cache;
|
||||||
|
node const* init = &cache_nodes[fast_mod(node_index, light->num_parent_nodes, light->reciprocal, light->increment, light->shift)];
|
||||||
|
memcpy(ret, init, sizeof(node));
|
||||||
|
ret->words[0] ^= node_index;
|
||||||
|
SHA3_512(ret->bytes, ret->bytes, sizeof(node));
|
||||||
|
#if defined(_M_X64) && ENABLE_SSE
|
||||||
|
__m128i const fnv_prime = _mm_set1_epi32(FNV_PRIME);
|
||||||
|
__m128i xmm0 = ret->xmm[0];
|
||||||
|
__m128i xmm1 = ret->xmm[1];
|
||||||
|
__m128i xmm2 = ret->xmm[2];
|
||||||
|
__m128i xmm3 = ret->xmm[3];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i != num_parents; ++i) {
|
||||||
|
uint32_t parent_index = fast_mod(fnv_hash(node_index ^ i, ret->words[i % NODE_WORDS]), light->num_parent_nodes, light->reciprocal, light->increment, light->shift);
|
||||||
|
node const* parent = &cache_nodes[parent_index];
|
||||||
|
|
||||||
|
#if defined(_M_X64) && ENABLE_SSE
|
||||||
|
{
|
||||||
|
xmm0 = _mm_mullo_epi32(xmm0, fnv_prime);
|
||||||
|
xmm1 = _mm_mullo_epi32(xmm1, fnv_prime);
|
||||||
|
xmm2 = _mm_mullo_epi32(xmm2, fnv_prime);
|
||||||
|
xmm3 = _mm_mullo_epi32(xmm3, fnv_prime);
|
||||||
|
xmm0 = _mm_xor_si128(xmm0, parent->xmm[0]);
|
||||||
|
xmm1 = _mm_xor_si128(xmm1, parent->xmm[1]);
|
||||||
|
xmm2 = _mm_xor_si128(xmm2, parent->xmm[2]);
|
||||||
|
xmm3 = _mm_xor_si128(xmm3, parent->xmm[3]);
|
||||||
|
|
||||||
|
// have to write to ret as values are used to compute index
|
||||||
|
ret->xmm[0] = xmm0;
|
||||||
|
ret->xmm[1] = xmm1;
|
||||||
|
ret->xmm[2] = xmm2;
|
||||||
|
ret->xmm[3] = xmm3;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
for (unsigned w = 0; w != NODE_WORDS; ++w) {
|
||||||
|
ret->words[w] = fnv_hash(ret->words[w], parent->words[w]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
SHA3_512(ret->bytes, ret->bytes, sizeof(node));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ethash_compute_full_data(
|
||||||
|
void* mem,
|
||||||
|
uint64_t full_size,
|
||||||
|
ethash_light_t const light,
|
||||||
|
ethash_callback_t callback
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (full_size % (sizeof(uint32_t) * MIX_WORDS) != 0 ||
|
||||||
|
(full_size % sizeof(node)) != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint32_t const max_n = (uint32_t)(full_size / sizeof(node));
|
||||||
|
node* full_nodes = (node*) mem;
|
||||||
|
double const progress_change = 1.0f / max_n;
|
||||||
|
double progress = 0.0f;
|
||||||
|
// now compute full nodes
|
||||||
|
for (uint32_t n = 0; n != max_n; ++n) {
|
||||||
|
if (callback &&
|
||||||
|
n % (max_n / 100) == 0 &&
|
||||||
|
callback((unsigned int)(ceil(progress * 100.0f))) != 0) {
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
progress += progress_change;
|
||||||
|
ethash_calculate_dag_item(&(full_nodes[n]), n, ETHASH_DATASET_PARENTS, light);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ethash_hash(
|
||||||
|
ethash_return_value_t* ret,
|
||||||
|
node const* full_nodes,
|
||||||
|
ethash_light_t const light,
|
||||||
|
uint64_t full_size,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t const nonce
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (full_size % MIX_WORDS != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// pack hash and nonce together into first 40 bytes of s_mix
|
||||||
|
assert(sizeof(node) * 8 == 512);
|
||||||
|
node s_mix[MIX_NODES + 1];
|
||||||
|
memcpy(s_mix[0].bytes, &header_hash, 32);
|
||||||
|
fix_endian64(s_mix[0].double_words[4], nonce);
|
||||||
|
|
||||||
|
// compute sha3-512 hash and replicate across mix
|
||||||
|
SHA3_512(s_mix->bytes, s_mix->bytes, 40);
|
||||||
|
fix_endian_arr32(s_mix[0].words, 16);
|
||||||
|
|
||||||
|
node* const mix = s_mix + 1;
|
||||||
|
for (uint32_t w = 0; w != MIX_WORDS; ++w) {
|
||||||
|
mix->words[w] = s_mix[0].words[w % NODE_WORDS];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned const page_size = sizeof(uint32_t) * MIX_WORDS;
|
||||||
|
unsigned const num_full_pages = (unsigned) (full_size / page_size);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i != ETHASH_ACCESSES; ++i) {
|
||||||
|
uint32_t const index = fnv_hash(s_mix->words[0] ^ i, mix->words[i % MIX_WORDS]) % num_full_pages;
|
||||||
|
|
||||||
|
for (unsigned n = 0; n != MIX_NODES; ++n) {
|
||||||
|
node const* dag_node;
|
||||||
|
node tmp_node;
|
||||||
|
if (full_nodes) {
|
||||||
|
dag_node = &full_nodes[MIX_NODES * index + n];
|
||||||
|
} else {
|
||||||
|
ethash_calculate_dag_item(&tmp_node, index * MIX_NODES + n, ETHASH_DATASET_PARENTS, light);
|
||||||
|
dag_node = &tmp_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_M_X64) && ENABLE_SSE
|
||||||
|
{
|
||||||
|
__m128i fnv_prime = _mm_set1_epi32(FNV_PRIME);
|
||||||
|
__m128i xmm0 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[0]);
|
||||||
|
__m128i xmm1 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[1]);
|
||||||
|
__m128i xmm2 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[2]);
|
||||||
|
__m128i xmm3 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[3]);
|
||||||
|
mix[n].xmm[0] = _mm_xor_si128(xmm0, dag_node->xmm[0]);
|
||||||
|
mix[n].xmm[1] = _mm_xor_si128(xmm1, dag_node->xmm[1]);
|
||||||
|
mix[n].xmm[2] = _mm_xor_si128(xmm2, dag_node->xmm[2]);
|
||||||
|
mix[n].xmm[3] = _mm_xor_si128(xmm3, dag_node->xmm[3]);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
for (unsigned w = 0; w != NODE_WORDS; ++w) {
|
||||||
|
mix[n].words[w] = fnv_hash(mix[n].words[w], dag_node->words[w]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// compress mix
|
||||||
|
for (uint32_t w = 0; w != MIX_WORDS; w += 4) {
|
||||||
|
uint32_t reduction = mix->words[w + 0];
|
||||||
|
reduction = reduction * FNV_PRIME ^ mix->words[w + 1];
|
||||||
|
reduction = reduction * FNV_PRIME ^ mix->words[w + 2];
|
||||||
|
reduction = reduction * FNV_PRIME ^ mix->words[w + 3];
|
||||||
|
mix->words[w / 4] = reduction;
|
||||||
|
}
|
||||||
|
|
||||||
|
fix_endian_arr32(mix->words, MIX_WORDS / 4);
|
||||||
|
memcpy(&ret->mix_hash, mix->bytes, 32);
|
||||||
|
// final Keccak hash
|
||||||
|
SHA3_256(&ret->result, s_mix->bytes, 64 + 32); // Keccak-256(s + compressed_mix)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ethash_quick_hash(
|
||||||
|
ethash_h256_t* return_hash,
|
||||||
|
ethash_h256_t const* header_hash,
|
||||||
|
uint64_t nonce,
|
||||||
|
ethash_h256_t const* mix_hash
|
||||||
|
)
|
||||||
|
{
|
||||||
|
uint8_t buf[64 + 32];
|
||||||
|
memcpy(buf, header_hash, 32);
|
||||||
|
fix_endian64_same(nonce);
|
||||||
|
memcpy(&(buf[32]), &nonce, 8);
|
||||||
|
SHA3_512(buf, buf, 40);
|
||||||
|
memcpy(&(buf[64]), mix_hash, 32);
|
||||||
|
SHA3_256(return_hash, buf, 64 + 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
ethash_h256_t ethash_get_seedhash(uint64_t epoch)
|
||||||
|
{
|
||||||
|
ethash_h256_t ret;
|
||||||
|
ethash_h256_reset(&ret);
|
||||||
|
for (uint32_t i = 0; i < epoch; ++i)
|
||||||
|
SHA3_256(&ret, (uint8_t*)&ret, 32);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ethash_quick_check_difficulty(
|
||||||
|
ethash_h256_t const* header_hash,
|
||||||
|
uint64_t const nonce,
|
||||||
|
ethash_h256_t const* mix_hash,
|
||||||
|
ethash_h256_t const* boundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ethash_h256_t return_hash;
|
||||||
|
ethash_quick_hash(&return_hash, header_hash, nonce, mix_hash);
|
||||||
|
return ethash_check_difficulty(&return_hash, boundary);
|
||||||
|
}
|
||||||
|
|
||||||
|
ethash_light_t ethash_light_new_internal(uint64_t cache_size, ethash_h256_t const* seed)
|
||||||
|
{
|
||||||
|
struct ethash_light *ret;
|
||||||
|
ret = (struct ethash_light*)calloc(sizeof(*ret), 1);
|
||||||
|
if (!ret) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ret->cache = malloc((size_t)cache_size);
|
||||||
|
if (!ret->cache) {
|
||||||
|
goto fail_free_light;
|
||||||
|
}
|
||||||
|
node* nodes = (node*)ret->cache;
|
||||||
|
if (!ethash_compute_cache_nodes(nodes, cache_size, seed)) {
|
||||||
|
goto fail_free_cache_mem;
|
||||||
|
}
|
||||||
|
ret->cache_size = cache_size;
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
fail_free_cache_mem:
|
||||||
|
free(ret->cache);
|
||||||
|
fail_free_light:
|
||||||
|
free(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ethash_light_t ethash_light_new(uint64_t block_number)
|
||||||
|
{
|
||||||
|
ethash_h256_t seedhash = ethash_get_seedhash(block_number / ETHASH_EPOCH_LENGTH);
|
||||||
|
ethash_light_t ret;
|
||||||
|
ret = ethash_light_new_internal(ethash_get_cachesize(block_number), &seedhash);
|
||||||
|
ret->block_number = block_number;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ethash_light_delete(ethash_light_t light)
|
||||||
|
{
|
||||||
|
if (light->cache) {
|
||||||
|
free(light->cache);
|
||||||
|
}
|
||||||
|
free(light);
|
||||||
|
}
|
||||||
|
|
||||||
|
ethash_return_value_t ethash_light_compute_internal(
|
||||||
|
ethash_light_t light,
|
||||||
|
uint64_t full_size,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t nonce
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ethash_return_value_t ret;
|
||||||
|
ret.success = true;
|
||||||
|
if (!ethash_hash(&ret, NULL, light, full_size, header_hash, nonce)) {
|
||||||
|
ret.success = false;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ethash_return_value_t ethash_light_compute(
|
||||||
|
ethash_light_t light,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t nonce
|
||||||
|
)
|
||||||
|
{
|
||||||
|
uint64_t full_size = ethash_get_datasize(light->block_number);
|
||||||
|
return ethash_light_compute_internal(light, full_size, header_hash, nonce);
|
||||||
|
}
|
||||||
|
|
||||||
|
ethash_return_value_t ethash_full_compute(
|
||||||
|
ethash_full_t full,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t nonce
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ethash_return_value_t ret;
|
||||||
|
ret.success = true;
|
||||||
|
if (!ethash_hash(
|
||||||
|
&ret,
|
||||||
|
(node const*)full->data,
|
||||||
|
NULL,
|
||||||
|
full->file_size,
|
||||||
|
header_hash,
|
||||||
|
nonce)) {
|
||||||
|
ret.success = false;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void const* ethash_full_dag(ethash_full_t full)
|
||||||
|
{
|
||||||
|
return full->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t ethash_full_dag_size(ethash_full_t full)
|
||||||
|
{
|
||||||
|
return full->file_size;
|
||||||
|
}
|
192
src/3rdparty/libethash/ethash_internal.h
vendored
Normal file
192
src/3rdparty/libethash/ethash_internal.h
vendored
Normal file
|
@ -0,0 +1,192 @@
|
||||||
|
#pragma once
|
||||||
|
#include "endian.h"
|
||||||
|
#include "ethash.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define ENABLE_SSE 0
|
||||||
|
|
||||||
|
#if defined(_M_X64) && ENABLE_SSE
|
||||||
|
#include <smmintrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// compile time settings
|
||||||
|
#define NODE_WORDS (64/4)
|
||||||
|
#define MIX_WORDS (ETHASH_MIX_BYTES/4)
|
||||||
|
#define MIX_NODES (MIX_WORDS / NODE_WORDS)
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef union node {
|
||||||
|
uint8_t bytes[NODE_WORDS * 4];
|
||||||
|
uint32_t words[NODE_WORDS];
|
||||||
|
uint64_t double_words[NODE_WORDS / 2];
|
||||||
|
|
||||||
|
#if defined(_M_X64) && ENABLE_SSE
|
||||||
|
__m128i xmm[NODE_WORDS/4];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} node;
|
||||||
|
|
||||||
|
static inline uint8_t ethash_h256_get(ethash_h256_t const* hash, unsigned int i)
|
||||||
|
{
|
||||||
|
return hash->b[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ethash_h256_set(ethash_h256_t* hash, unsigned int i, uint8_t v)
|
||||||
|
{
|
||||||
|
hash->b[i] = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ethash_h256_reset(ethash_h256_t* hash)
|
||||||
|
{
|
||||||
|
memset(hash, 0, 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns if hash is less than or equal to boundary (2^256/difficulty)
|
||||||
|
static inline bool ethash_check_difficulty(
|
||||||
|
ethash_h256_t const* hash,
|
||||||
|
ethash_h256_t const* boundary
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Boundary is big endian
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
if (ethash_h256_get(hash, i) == ethash_h256_get(boundary, i)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return ethash_h256_get(hash, i) < ethash_h256_get(boundary, i);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Difficulty quick check for POW preverification
|
||||||
|
*
|
||||||
|
* @param header_hash The hash of the header
|
||||||
|
* @param nonce The block's nonce
|
||||||
|
* @param mix_hash The mix digest hash
|
||||||
|
* @param boundary The boundary is defined as (2^256 / difficulty)
|
||||||
|
* @return true for succesful pre-verification and false otherwise
|
||||||
|
*/
|
||||||
|
bool ethash_quick_check_difficulty(
|
||||||
|
ethash_h256_t const* header_hash,
|
||||||
|
uint64_t const nonce,
|
||||||
|
ethash_h256_t const* mix_hash,
|
||||||
|
ethash_h256_t const* boundary
|
||||||
|
);
|
||||||
|
|
||||||
|
struct ethash_light {
|
||||||
|
void* cache;
|
||||||
|
uint64_t cache_size;
|
||||||
|
uint64_t block_number;
|
||||||
|
|
||||||
|
// Used for fast division
|
||||||
|
uint32_t num_parent_nodes;
|
||||||
|
uint32_t reciprocal;
|
||||||
|
uint32_t increment;
|
||||||
|
uint32_t shift;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and initialize a new ethash_light handler. Internal version
|
||||||
|
*
|
||||||
|
* @param cache_size The size of the cache in bytes
|
||||||
|
* @param seed Block seedhash to be used during the computation of the
|
||||||
|
* cache nodes
|
||||||
|
* @return Newly allocated ethash_light handler or NULL in case of
|
||||||
|
* ERRNOMEM or invalid parameters used for @ref ethash_compute_cache_nodes()
|
||||||
|
*/
|
||||||
|
ethash_light_t ethash_light_new_internal(uint64_t cache_size, ethash_h256_t const* seed);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the light client data. Internal version.
|
||||||
|
*
|
||||||
|
* @param light The light client handler
|
||||||
|
* @param full_size The size of the full data in bytes.
|
||||||
|
* @param header_hash The header hash to pack into the mix
|
||||||
|
* @param nonce The nonce to pack into the mix
|
||||||
|
* @return The resulting hash.
|
||||||
|
*/
|
||||||
|
ethash_return_value_t ethash_light_compute_internal(
|
||||||
|
ethash_light_t light,
|
||||||
|
uint64_t full_size,
|
||||||
|
ethash_h256_t const header_hash,
|
||||||
|
uint64_t nonce
|
||||||
|
);
|
||||||
|
|
||||||
|
struct ethash_full {
|
||||||
|
FILE* file;
|
||||||
|
uint64_t file_size;
|
||||||
|
node* data;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and initialize a new ethash_full handler. Internal version.
|
||||||
|
*
|
||||||
|
* @param dirname The directory in which to put the DAG file.
|
||||||
|
* @param seedhash The seed hash of the block. Used in the DAG file naming.
|
||||||
|
* @param full_size The size of the full data in bytes.
|
||||||
|
* @param cache A cache object to use that was allocated with @ref ethash_cache_new().
|
||||||
|
* Iff this function succeeds the ethash_full_t will take memory
|
||||||
|
* memory ownership of the cache and free it at deletion. If
|
||||||
|
* not then the user still has to handle freeing of the cache himself.
|
||||||
|
* @param callback A callback function with signature of @ref ethash_callback_t
|
||||||
|
* It accepts an unsigned with which a progress of DAG calculation
|
||||||
|
* can be displayed. If all goes well the callback should return 0.
|
||||||
|
* If a non-zero value is returned then DAG generation will stop.
|
||||||
|
* @return Newly allocated ethash_full handler or NULL in case of
|
||||||
|
* ERRNOMEM or invalid parameters used for @ref ethash_compute_full_data()
|
||||||
|
*/
|
||||||
|
ethash_full_t ethash_full_new_internal(
|
||||||
|
char const* dirname,
|
||||||
|
ethash_h256_t const seed_hash,
|
||||||
|
uint64_t full_size,
|
||||||
|
ethash_light_t const light,
|
||||||
|
ethash_callback_t callback
|
||||||
|
);
|
||||||
|
|
||||||
|
void ethash_calculate_dag_item(
|
||||||
|
node* const ret,
|
||||||
|
uint32_t node_index,
|
||||||
|
uint32_t num_parents,
|
||||||
|
ethash_light_t const cache
|
||||||
|
);
|
||||||
|
|
||||||
|
void ethash_calculate_dag_item_opt(
|
||||||
|
node* const ret,
|
||||||
|
uint32_t node_index,
|
||||||
|
uint32_t num_parents,
|
||||||
|
ethash_light_t const cache
|
||||||
|
);
|
||||||
|
|
||||||
|
void ethash_quick_hash(
|
||||||
|
ethash_h256_t* return_hash,
|
||||||
|
ethash_h256_t const* header_hash,
|
||||||
|
const uint64_t nonce,
|
||||||
|
ethash_h256_t const* mix_hash
|
||||||
|
);
|
||||||
|
|
||||||
|
uint64_t ethash_get_datasize(uint64_t const block_number);
|
||||||
|
uint64_t ethash_get_cachesize(uint64_t const block_number);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the memory data for a full node's memory
|
||||||
|
*
|
||||||
|
* @param mem A pointer to an ethash full's memory
|
||||||
|
* @param full_size The size of the full data in bytes
|
||||||
|
* @param cache A cache object to use in the calculation
|
||||||
|
* @param callback The callback function. Check @ref ethash_full_new() for details.
|
||||||
|
* @return true if all went fine and false for invalid parameters
|
||||||
|
*/
|
||||||
|
bool ethash_compute_full_data(
|
||||||
|
void* mem,
|
||||||
|
uint64_t full_size,
|
||||||
|
ethash_light_t const light,
|
||||||
|
ethash_callback_t callback
|
||||||
|
);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
42
src/3rdparty/libethash/fnv.h
vendored
Normal file
42
src/3rdparty/libethash/fnv.h
vendored
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
This file is part of cpp-ethereum.
|
||||||
|
|
||||||
|
cpp-ethereum is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
cpp-ethereum is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/** @file fnv.h
|
||||||
|
* @author Matthew Wampler-Doty <negacthulhu@gmail.com>
|
||||||
|
* @date 2015
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FNV_PRIME 0x01000193
|
||||||
|
|
||||||
|
/* The FNV-1 spec multiplies the prime with the input one byte (octet) in turn.
|
||||||
|
We instead multiply it with the full 32-bit input.
|
||||||
|
This gives a different result compared to a canonical FNV-1 implementation.
|
||||||
|
*/
|
||||||
|
static inline uint32_t fnv_hash(uint32_t const x, uint32_t const y)
|
||||||
|
{
|
||||||
|
return x * FNV_PRIME ^ y;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
253
src/3rdparty/libethash/keccakf800.c
vendored
Normal file
253
src/3rdparty/libethash/keccakf800.c
vendored
Normal file
|
@ -0,0 +1,253 @@
|
||||||
|
/* ethash: C/C++ implementation of Ethash, the Ethereum Proof of Work algorithm.
|
||||||
|
* Copyright 2018-2019 Pawel Bylica.
|
||||||
|
* Licensed under the Apache License, Version 2.0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
static uint32_t rol(uint32_t x, unsigned s)
|
||||||
|
{
|
||||||
|
return (x << s) | (x >> (32 - s));
|
||||||
|
}
|
||||||
|
|
||||||
|
static const uint32_t round_constants[22] = {
|
||||||
|
0x00000001,
|
||||||
|
0x00008082,
|
||||||
|
0x0000808A,
|
||||||
|
0x80008000,
|
||||||
|
0x0000808B,
|
||||||
|
0x80000001,
|
||||||
|
0x80008081,
|
||||||
|
0x00008009,
|
||||||
|
0x0000008A,
|
||||||
|
0x00000088,
|
||||||
|
0x80008009,
|
||||||
|
0x8000000A,
|
||||||
|
0x8000808B,
|
||||||
|
0x0000008B,
|
||||||
|
0x00008089,
|
||||||
|
0x00008003,
|
||||||
|
0x00008002,
|
||||||
|
0x00000080,
|
||||||
|
0x0000800A,
|
||||||
|
0x8000000A,
|
||||||
|
0x80008081,
|
||||||
|
0x00008080,
|
||||||
|
};
|
||||||
|
|
||||||
|
void ethash_keccakf800(uint32_t state[25])
|
||||||
|
{
|
||||||
|
/* The implementation directly translated from ethash_keccakf1600. */
|
||||||
|
|
||||||
|
int round;
|
||||||
|
|
||||||
|
uint32_t Aba, Abe, Abi, Abo, Abu;
|
||||||
|
uint32_t Aga, Age, Agi, Ago, Agu;
|
||||||
|
uint32_t Aka, Ake, Aki, Ako, Aku;
|
||||||
|
uint32_t Ama, Ame, Ami, Amo, Amu;
|
||||||
|
uint32_t Asa, Ase, Asi, Aso, Asu;
|
||||||
|
|
||||||
|
uint32_t Eba, Ebe, Ebi, Ebo, Ebu;
|
||||||
|
uint32_t Ega, Ege, Egi, Ego, Egu;
|
||||||
|
uint32_t Eka, Eke, Eki, Eko, Eku;
|
||||||
|
uint32_t Ema, Eme, Emi, Emo, Emu;
|
||||||
|
uint32_t Esa, Ese, Esi, Eso, Esu;
|
||||||
|
|
||||||
|
uint32_t Ba, Be, Bi, Bo, Bu;
|
||||||
|
|
||||||
|
uint32_t Da, De, Di, Do, Du;
|
||||||
|
|
||||||
|
Aba = state[0];
|
||||||
|
Abe = state[1];
|
||||||
|
Abi = state[2];
|
||||||
|
Abo = state[3];
|
||||||
|
Abu = state[4];
|
||||||
|
Aga = state[5];
|
||||||
|
Age = state[6];
|
||||||
|
Agi = state[7];
|
||||||
|
Ago = state[8];
|
||||||
|
Agu = state[9];
|
||||||
|
Aka = state[10];
|
||||||
|
Ake = state[11];
|
||||||
|
Aki = state[12];
|
||||||
|
Ako = state[13];
|
||||||
|
Aku = state[14];
|
||||||
|
Ama = state[15];
|
||||||
|
Ame = state[16];
|
||||||
|
Ami = state[17];
|
||||||
|
Amo = state[18];
|
||||||
|
Amu = state[19];
|
||||||
|
Asa = state[20];
|
||||||
|
Ase = state[21];
|
||||||
|
Asi = state[22];
|
||||||
|
Aso = state[23];
|
||||||
|
Asu = state[24];
|
||||||
|
|
||||||
|
for (round = 0; round < 22; round += 2)
|
||||||
|
{
|
||||||
|
/* Round (round + 0): Axx -> Exx */
|
||||||
|
|
||||||
|
Ba = Aba ^ Aga ^ Aka ^ Ama ^ Asa;
|
||||||
|
Be = Abe ^ Age ^ Ake ^ Ame ^ Ase;
|
||||||
|
Bi = Abi ^ Agi ^ Aki ^ Ami ^ Asi;
|
||||||
|
Bo = Abo ^ Ago ^ Ako ^ Amo ^ Aso;
|
||||||
|
Bu = Abu ^ Agu ^ Aku ^ Amu ^ Asu;
|
||||||
|
|
||||||
|
Da = Bu ^ rol(Be, 1);
|
||||||
|
De = Ba ^ rol(Bi, 1);
|
||||||
|
Di = Be ^ rol(Bo, 1);
|
||||||
|
Do = Bi ^ rol(Bu, 1);
|
||||||
|
Du = Bo ^ rol(Ba, 1);
|
||||||
|
|
||||||
|
Ba = Aba ^ Da;
|
||||||
|
Be = rol(Age ^ De, 12);
|
||||||
|
Bi = rol(Aki ^ Di, 11);
|
||||||
|
Bo = rol(Amo ^ Do, 21);
|
||||||
|
Bu = rol(Asu ^ Du, 14);
|
||||||
|
Eba = Ba ^ (~Be & Bi) ^ round_constants[round];
|
||||||
|
Ebe = Be ^ (~Bi & Bo);
|
||||||
|
Ebi = Bi ^ (~Bo & Bu);
|
||||||
|
Ebo = Bo ^ (~Bu & Ba);
|
||||||
|
Ebu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Abo ^ Do, 28);
|
||||||
|
Be = rol(Agu ^ Du, 20);
|
||||||
|
Bi = rol(Aka ^ Da, 3);
|
||||||
|
Bo = rol(Ame ^ De, 13);
|
||||||
|
Bu = rol(Asi ^ Di, 29);
|
||||||
|
Ega = Ba ^ (~Be & Bi);
|
||||||
|
Ege = Be ^ (~Bi & Bo);
|
||||||
|
Egi = Bi ^ (~Bo & Bu);
|
||||||
|
Ego = Bo ^ (~Bu & Ba);
|
||||||
|
Egu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Abe ^ De, 1);
|
||||||
|
Be = rol(Agi ^ Di, 6);
|
||||||
|
Bi = rol(Ako ^ Do, 25);
|
||||||
|
Bo = rol(Amu ^ Du, 8);
|
||||||
|
Bu = rol(Asa ^ Da, 18);
|
||||||
|
Eka = Ba ^ (~Be & Bi);
|
||||||
|
Eke = Be ^ (~Bi & Bo);
|
||||||
|
Eki = Bi ^ (~Bo & Bu);
|
||||||
|
Eko = Bo ^ (~Bu & Ba);
|
||||||
|
Eku = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Abu ^ Du, 27);
|
||||||
|
Be = rol(Aga ^ Da, 4);
|
||||||
|
Bi = rol(Ake ^ De, 10);
|
||||||
|
Bo = rol(Ami ^ Di, 15);
|
||||||
|
Bu = rol(Aso ^ Do, 24);
|
||||||
|
Ema = Ba ^ (~Be & Bi);
|
||||||
|
Eme = Be ^ (~Bi & Bo);
|
||||||
|
Emi = Bi ^ (~Bo & Bu);
|
||||||
|
Emo = Bo ^ (~Bu & Ba);
|
||||||
|
Emu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Abi ^ Di, 30);
|
||||||
|
Be = rol(Ago ^ Do, 23);
|
||||||
|
Bi = rol(Aku ^ Du, 7);
|
||||||
|
Bo = rol(Ama ^ Da, 9);
|
||||||
|
Bu = rol(Ase ^ De, 2);
|
||||||
|
Esa = Ba ^ (~Be & Bi);
|
||||||
|
Ese = Be ^ (~Bi & Bo);
|
||||||
|
Esi = Bi ^ (~Bo & Bu);
|
||||||
|
Eso = Bo ^ (~Bu & Ba);
|
||||||
|
Esu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
|
||||||
|
/* Round (round + 1): Exx -> Axx */
|
||||||
|
|
||||||
|
Ba = Eba ^ Ega ^ Eka ^ Ema ^ Esa;
|
||||||
|
Be = Ebe ^ Ege ^ Eke ^ Eme ^ Ese;
|
||||||
|
Bi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi;
|
||||||
|
Bo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso;
|
||||||
|
Bu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu;
|
||||||
|
|
||||||
|
Da = Bu ^ rol(Be, 1);
|
||||||
|
De = Ba ^ rol(Bi, 1);
|
||||||
|
Di = Be ^ rol(Bo, 1);
|
||||||
|
Do = Bi ^ rol(Bu, 1);
|
||||||
|
Du = Bo ^ rol(Ba, 1);
|
||||||
|
|
||||||
|
Ba = Eba ^ Da;
|
||||||
|
Be = rol(Ege ^ De, 12);
|
||||||
|
Bi = rol(Eki ^ Di, 11);
|
||||||
|
Bo = rol(Emo ^ Do, 21);
|
||||||
|
Bu = rol(Esu ^ Du, 14);
|
||||||
|
Aba = Ba ^ (~Be & Bi) ^ round_constants[round + 1];
|
||||||
|
Abe = Be ^ (~Bi & Bo);
|
||||||
|
Abi = Bi ^ (~Bo & Bu);
|
||||||
|
Abo = Bo ^ (~Bu & Ba);
|
||||||
|
Abu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Ebo ^ Do, 28);
|
||||||
|
Be = rol(Egu ^ Du, 20);
|
||||||
|
Bi = rol(Eka ^ Da, 3);
|
||||||
|
Bo = rol(Eme ^ De, 13);
|
||||||
|
Bu = rol(Esi ^ Di, 29);
|
||||||
|
Aga = Ba ^ (~Be & Bi);
|
||||||
|
Age = Be ^ (~Bi & Bo);
|
||||||
|
Agi = Bi ^ (~Bo & Bu);
|
||||||
|
Ago = Bo ^ (~Bu & Ba);
|
||||||
|
Agu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Ebe ^ De, 1);
|
||||||
|
Be = rol(Egi ^ Di, 6);
|
||||||
|
Bi = rol(Eko ^ Do, 25);
|
||||||
|
Bo = rol(Emu ^ Du, 8);
|
||||||
|
Bu = rol(Esa ^ Da, 18);
|
||||||
|
Aka = Ba ^ (~Be & Bi);
|
||||||
|
Ake = Be ^ (~Bi & Bo);
|
||||||
|
Aki = Bi ^ (~Bo & Bu);
|
||||||
|
Ako = Bo ^ (~Bu & Ba);
|
||||||
|
Aku = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Ebu ^ Du, 27);
|
||||||
|
Be = rol(Ega ^ Da, 4);
|
||||||
|
Bi = rol(Eke ^ De, 10);
|
||||||
|
Bo = rol(Emi ^ Di, 15);
|
||||||
|
Bu = rol(Eso ^ Do, 24);
|
||||||
|
Ama = Ba ^ (~Be & Bi);
|
||||||
|
Ame = Be ^ (~Bi & Bo);
|
||||||
|
Ami = Bi ^ (~Bo & Bu);
|
||||||
|
Amo = Bo ^ (~Bu & Ba);
|
||||||
|
Amu = Bu ^ (~Ba & Be);
|
||||||
|
|
||||||
|
Ba = rol(Ebi ^ Di, 30);
|
||||||
|
Be = rol(Ego ^ Do, 23);
|
||||||
|
Bi = rol(Eku ^ Du, 7);
|
||||||
|
Bo = rol(Ema ^ Da, 9);
|
||||||
|
Bu = rol(Ese ^ De, 2);
|
||||||
|
Asa = Ba ^ (~Be & Bi);
|
||||||
|
Ase = Be ^ (~Bi & Bo);
|
||||||
|
Asi = Bi ^ (~Bo & Bu);
|
||||||
|
Aso = Bo ^ (~Bu & Ba);
|
||||||
|
Asu = Bu ^ (~Ba & Be);
|
||||||
|
}
|
||||||
|
|
||||||
|
state[0] = Aba;
|
||||||
|
state[1] = Abe;
|
||||||
|
state[2] = Abi;
|
||||||
|
state[3] = Abo;
|
||||||
|
state[4] = Abu;
|
||||||
|
state[5] = Aga;
|
||||||
|
state[6] = Age;
|
||||||
|
state[7] = Agi;
|
||||||
|
state[8] = Ago;
|
||||||
|
state[9] = Agu;
|
||||||
|
state[10] = Aka;
|
||||||
|
state[11] = Ake;
|
||||||
|
state[12] = Aki;
|
||||||
|
state[13] = Ako;
|
||||||
|
state[14] = Aku;
|
||||||
|
state[15] = Ama;
|
||||||
|
state[16] = Ame;
|
||||||
|
state[17] = Ami;
|
||||||
|
state[18] = Amo;
|
||||||
|
state[19] = Amu;
|
||||||
|
state[20] = Asa;
|
||||||
|
state[21] = Ase;
|
||||||
|
state[22] = Asi;
|
||||||
|
state[23] = Aso;
|
||||||
|
state[24] = Asu;
|
||||||
|
}
|
11
src/App.cpp
11
src/App.cpp
|
@ -32,6 +32,7 @@
|
||||||
#include "backend/cpu/Cpu.h"
|
#include "backend/cpu/Cpu.h"
|
||||||
#include "base/io/Console.h"
|
#include "base/io/Console.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
#include "base/io/Signals.h"
|
#include "base/io/Signals.h"
|
||||||
#include "base/kernel/Platform.h"
|
#include "base/kernel/Platform.h"
|
||||||
#include "core/config/Config.h"
|
#include "core/config/Config.h"
|
||||||
|
@ -85,7 +86,7 @@ int xmrig::App::exec()
|
||||||
Summary::print(m_controller);
|
Summary::print(m_controller);
|
||||||
|
|
||||||
if (m_controller->config()->isDryRun()) {
|
if (m_controller->config()->isDryRun()) {
|
||||||
LOG_NOTICE("OK");
|
LOG_NOTICE("%s " WHITE_BOLD("OK"), Tags::config());
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -102,7 +103,7 @@ int xmrig::App::exec()
|
||||||
void xmrig::App::onConsoleCommand(char command)
|
void xmrig::App::onConsoleCommand(char command)
|
||||||
{
|
{
|
||||||
if (command == 3) {
|
if (command == 3) {
|
||||||
LOG_WARN("Ctrl+C received, exiting");
|
LOG_WARN("%s " YELLOW("Ctrl+C received, exiting"), Tags::signal());
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -116,15 +117,15 @@ void xmrig::App::onSignal(int signum)
|
||||||
switch (signum)
|
switch (signum)
|
||||||
{
|
{
|
||||||
case SIGHUP:
|
case SIGHUP:
|
||||||
LOG_WARN("SIGHUP received, exiting");
|
LOG_WARN("%s " YELLOW("SIGHUP received, exiting"), Tags::signal());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIGTERM:
|
case SIGTERM:
|
||||||
LOG_WARN("SIGTERM received, exiting");
|
LOG_WARN("%s " YELLOW("SIGTERM received, exiting"), Tags::signal());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIGINT:
|
case SIGINT:
|
||||||
LOG_WARN("SIGINT received, exiting");
|
LOG_WARN("%s " YELLOW("SIGINT received, exiting"), Tags::signal());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
inline static const char *format(double h, char *buf, size_t size)
|
inline static const char *format(double h, char *buf, size_t size)
|
||||||
{
|
{
|
||||||
if (std::isnormal(h)) {
|
if (std::isnormal(h)) {
|
||||||
snprintf(buf, size, "%03.1f", h);
|
snprintf(buf, size, (h < 100.0) ? "%04.2f" : "%03.1f", h);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -23,8 +23,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XMRIG_TAGS_H
|
#ifndef XMRIG_BACKEND_TAGS_H
|
||||||
#define XMRIG_TAGS_H
|
#define XMRIG_BACKEND_TAGS_H
|
||||||
|
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
@ -35,7 +35,6 @@ namespace xmrig {
|
||||||
|
|
||||||
const char *backend_tag(uint32_t backend);
|
const char *backend_tag(uint32_t backend);
|
||||||
const char *cpu_tag();
|
const char *cpu_tag();
|
||||||
const char *net_tag();
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_OPENCL
|
#ifdef XMRIG_FEATURE_OPENCL
|
||||||
|
@ -48,7 +47,6 @@ const char *cuda_tag();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_RANDOMX
|
#ifdef XMRIG_ALGO_RANDOMX
|
||||||
const char *rx_tag();
|
const char *rx_tag();
|
||||||
#endif
|
#endif
|
||||||
|
@ -57,4 +55,4 @@ const char *rx_tag();
|
||||||
} // namespace xmrig
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
#endif /* XMRIG_TAGS_H */
|
#endif /* XMRIG_BACKEND_TAGS_H */
|
||||||
|
|
|
@ -42,10 +42,11 @@ class Worker : public IWorker
|
||||||
public:
|
public:
|
||||||
Worker(size_t id, int64_t affinity, int priority);
|
Worker(size_t id, int64_t affinity, int priority);
|
||||||
|
|
||||||
inline const VirtualMemory *memory() const override { return nullptr; }
|
inline const VirtualMemory *memory() const override { return nullptr; }
|
||||||
inline size_t id() const override { return m_id; }
|
inline size_t id() const override { return m_id; }
|
||||||
inline uint64_t hashCount() const override { return m_hashCount.load(std::memory_order_relaxed); }
|
inline uint64_t hashCount() const override { return m_hashCount.load(std::memory_order_relaxed); }
|
||||||
inline uint64_t timestamp() const override { return m_timestamp.load(std::memory_order_relaxed); }
|
inline uint64_t timestamp() const override { return m_timestamp.load(std::memory_order_relaxed); }
|
||||||
|
inline void jobEarlyNotification(const Job&) override {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void storeStats();
|
void storeStats();
|
||||||
|
|
|
@ -41,7 +41,7 @@ class WorkerJob
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline const Job ¤tJob() const { return m_jobs[index()]; }
|
inline const Job ¤tJob() const { return m_jobs[index()]; }
|
||||||
inline uint32_t *nonce(size_t i = 0) { return reinterpret_cast<uint32_t*>(blob() + (i * currentJob().size()) + 39); }
|
inline uint32_t *nonce(size_t i = 0) { return reinterpret_cast<uint32_t*>(blob() + (i * currentJob().size()) + nonceOffset()); }
|
||||||
inline uint64_t sequence() const { return m_sequence; }
|
inline uint64_t sequence() const { return m_sequence; }
|
||||||
inline uint8_t *blob() { return m_blobs[index()]; }
|
inline uint8_t *blob() { return m_blobs[index()]; }
|
||||||
inline uint8_t index() const { return m_index; }
|
inline uint8_t index() const { return m_index; }
|
||||||
|
@ -88,6 +88,9 @@ public:
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
inline int32_t nonceOffset() const { return currentJob().nonceOffset(); }
|
||||||
|
inline size_t nonceSize() const { return currentJob().nonceSize(); }
|
||||||
|
|
||||||
inline void save(const Job &job, uint32_t reserveCount, Nonce::Backend backend)
|
inline void save(const Job &job, uint32_t reserveCount, Nonce::Backend backend)
|
||||||
{
|
{
|
||||||
m_index = job.index();
|
m_index = job.index();
|
||||||
|
@ -115,7 +118,7 @@ private:
|
||||||
template<>
|
template<>
|
||||||
inline uint32_t *xmrig::WorkerJob<1>::nonce(size_t)
|
inline uint32_t *xmrig::WorkerJob<1>::nonce(size_t)
|
||||||
{
|
{
|
||||||
return reinterpret_cast<uint32_t*>(blob() + 39);
|
return reinterpret_cast<uint32_t*>(blob() + nonceOffset());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -125,11 +128,22 @@ inline bool xmrig::WorkerJob<1>::nextRound(uint32_t rounds, uint32_t roundSize)
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
m_rounds[index()]++;
|
m_rounds[index()]++;
|
||||||
|
|
||||||
|
uint32_t* n = nonce();
|
||||||
|
const uint32_t prev_nonce = *n;
|
||||||
|
|
||||||
if ((m_rounds[index()] % rounds) == 0) {
|
if ((m_rounds[index()] % rounds) == 0) {
|
||||||
*nonce() = Nonce::next(index(), *nonce(), rounds * roundSize, currentJob().isNicehash(), &ok);
|
*n = Nonce::next(index(), *n, rounds * roundSize, currentJob().isNicehash(), &ok);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*nonce() += roundSize;
|
*n += roundSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Increment higher 32 bits of a 64-bit nonce when lower 32 bits overflow
|
||||||
|
if (!currentJob().isNicehash() && (nonceSize() == sizeof(uint64_t)) && (*n < prev_nonce)) {
|
||||||
|
++n[1];
|
||||||
|
|
||||||
|
Job& job = m_jobs[index()];
|
||||||
|
memcpy(job.blob(), blob(), job.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
return ok;
|
return ok;
|
||||||
|
|
|
@ -47,6 +47,7 @@ namespace xmrig {
|
||||||
|
|
||||||
class Hashrate;
|
class Hashrate;
|
||||||
class WorkersPrivate;
|
class WorkersPrivate;
|
||||||
|
class Job;
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
|
@ -63,6 +64,7 @@ public:
|
||||||
void start(const std::vector<T> &data);
|
void start(const std::vector<T> &data);
|
||||||
void stop();
|
void stop();
|
||||||
void tick(uint64_t ticks);
|
void tick(uint64_t ticks);
|
||||||
|
void jobEarlyNotification(const Job&);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static IWorker *create(Thread<T> *handle);
|
static IWorker *create(Thread<T> *handle);
|
||||||
|
@ -73,6 +75,17 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void xmrig::Workers<T>::jobEarlyNotification(const Job& job)
|
||||||
|
{
|
||||||
|
for (Thread<T>* t : m_workers) {
|
||||||
|
if (t->worker()) {
|
||||||
|
t->worker()->jobEarlyNotification(job);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
IWorker *Workers<CpuLaunchData>::create(Thread<CpuLaunchData> *handle);
|
IWorker *Workers<CpuLaunchData>::create(Thread<CpuLaunchData> *handle);
|
||||||
extern template class Workers<CpuLaunchData>;
|
extern template class Workers<CpuLaunchData>;
|
||||||
|
|
|
@ -34,6 +34,7 @@ namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
class VirtualMemory;
|
class VirtualMemory;
|
||||||
|
class Job;
|
||||||
|
|
||||||
|
|
||||||
class IWorker
|
class IWorker
|
||||||
|
@ -48,6 +49,7 @@ public:
|
||||||
virtual uint64_t hashCount() const = 0;
|
virtual uint64_t hashCount() const = 0;
|
||||||
virtual uint64_t timestamp() const = 0;
|
virtual uint64_t timestamp() const = 0;
|
||||||
virtual void start() = 0;
|
virtual void start() = 0;
|
||||||
|
virtual void jobEarlyNotification(const Job&) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include "backend/common/Workers.h"
|
#include "backend/common/Workers.h"
|
||||||
#include "backend/cpu/Cpu.h"
|
#include "backend/cpu/Cpu.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
#include "base/net/stratum/Job.h"
|
#include "base/net/stratum/Job.h"
|
||||||
#include "base/tools/Chrono.h"
|
#include "base/tools/Chrono.h"
|
||||||
#include "base/tools/String.h"
|
#include "base/tools/String.h"
|
||||||
|
@ -60,7 +61,6 @@ namespace xmrig {
|
||||||
extern template class Threads<CpuThreads>;
|
extern template class Threads<CpuThreads>;
|
||||||
|
|
||||||
|
|
||||||
static const char *tag = CYAN_BG_BOLD(WHITE_BOLD_S " cpu ");
|
|
||||||
static const String kType = "cpu";
|
static const String kType = "cpu";
|
||||||
static std::mutex mutex;
|
static std::mutex mutex;
|
||||||
|
|
||||||
|
@ -102,13 +102,13 @@ public:
|
||||||
inline void print() const
|
inline void print() const
|
||||||
{
|
{
|
||||||
if (m_started == 0) {
|
if (m_started == 0) {
|
||||||
LOG_ERR("%s " RED_BOLD("disabled") YELLOW(" (failed to start threads)"), tag);
|
LOG_ERR("%s " RED_BOLD("disabled") YELLOW(" (failed to start threads)"), Tags::cpu());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO("%s" GREEN_BOLD(" READY") " threads %s%zu/%zu (%zu)" CLEAR " huge pages %s%1.0f%% %zu/%zu" CLEAR " memory " CYAN_BOLD("%zu KB") BLACK_BOLD(" (%" PRIu64 " ms)"),
|
LOG_INFO("%s" GREEN_BOLD(" READY") " threads %s%zu/%zu (%zu)" CLEAR " huge pages %s%1.0f%% %zu/%zu" CLEAR " memory " CYAN_BOLD("%zu KB") BLACK_BOLD(" (%" PRIu64 " ms)"),
|
||||||
tag,
|
Tags::cpu(),
|
||||||
m_errors == 0 ? CYAN_BOLD_S : YELLOW_BOLD_S,
|
m_errors == 0 ? CYAN_BOLD_S : YELLOW_BOLD_S,
|
||||||
m_started, m_threads, m_ways,
|
m_started, m_threads, m_ways,
|
||||||
(m_hugePages.isFullyAllocated() ? GREEN_BOLD_S : (m_hugePages.allocated == 0 ? RED_BOLD_S : YELLOW_BOLD_S)),
|
(m_hugePages.isFullyAllocated() ? GREEN_BOLD_S : (m_hugePages.allocated == 0 ? RED_BOLD_S : YELLOW_BOLD_S)),
|
||||||
|
@ -142,7 +142,7 @@ public:
|
||||||
inline void start()
|
inline void start()
|
||||||
{
|
{
|
||||||
LOG_INFO("%s use profile " BLUE_BG(WHITE_BOLD_S " %s ") WHITE_BOLD_S " (" CYAN_BOLD("%zu") WHITE_BOLD(" thread%s)") " scratchpad " CYAN_BOLD("%zu KB"),
|
LOG_INFO("%s use profile " BLUE_BG(WHITE_BOLD_S " %s ") WHITE_BOLD_S " (" CYAN_BOLD("%zu") WHITE_BOLD(" thread%s)") " scratchpad " CYAN_BOLD("%zu KB"),
|
||||||
tag,
|
Tags::cpu(),
|
||||||
profileName.data(),
|
profileName.data(),
|
||||||
threads.size(),
|
threads.size(),
|
||||||
threads.size() > 1 ? "s" : "",
|
threads.size() > 1 ? "s" : "",
|
||||||
|
@ -219,13 +219,13 @@ const char *xmrig::backend_tag(uint32_t backend)
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
return tag;
|
return Tags::cpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *xmrig::cpu_tag()
|
const char *xmrig::cpu_tag()
|
||||||
{
|
{
|
||||||
return tag;
|
return Tags::cpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -279,7 +279,7 @@ void xmrig::CpuBackend::prepare(const Job &nextJob)
|
||||||
if ((f == Algorithm::ARGON2) || (f == Algorithm::RANDOM_X)) {
|
if ((f == Algorithm::ARGON2) || (f == Algorithm::RANDOM_X)) {
|
||||||
if (argon2::Impl::select(d_ptr->controller->config()->cpu().argon2Impl())) {
|
if (argon2::Impl::select(d_ptr->controller->config()->cpu().argon2Impl())) {
|
||||||
LOG_INFO("%s use " WHITE_BOLD("argon2") " implementation " CSI "1;%dm" "%s",
|
LOG_INFO("%s use " WHITE_BOLD("argon2") " implementation " CSI "1;%dm" "%s",
|
||||||
tag,
|
Tags::cpu(),
|
||||||
argon2::Impl::name() == "default" ? 33 : 32,
|
argon2::Impl::name() == "default" ? 33 : 32,
|
||||||
argon2::Impl::name().data()
|
argon2::Impl::name().data()
|
||||||
);
|
);
|
||||||
|
@ -344,7 +344,7 @@ void xmrig::CpuBackend::setJob(const Job &job)
|
||||||
d_ptr->profileName = cpu.threads().profileName(job.algorithm());
|
d_ptr->profileName = cpu.threads().profileName(job.algorithm());
|
||||||
|
|
||||||
if (d_ptr->profileName.isNull() || threads.empty()) {
|
if (d_ptr->profileName.isNull() || threads.empty()) {
|
||||||
LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (no suitable configuration found)"), tag);
|
LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (no suitable configuration found)"), Tags::cpu());
|
||||||
|
|
||||||
return stop();
|
return stop();
|
||||||
}
|
}
|
||||||
|
@ -383,7 +383,7 @@ void xmrig::CpuBackend::stop()
|
||||||
d_ptr->workers.stop();
|
d_ptr->workers.stop();
|
||||||
d_ptr->threads.clear();
|
d_ptr->threads.clear();
|
||||||
|
|
||||||
LOG_INFO("%s" YELLOW(" stopped") BLACK_BOLD(" (%" PRIu64 " ms)"), tag, Chrono::steadyMSecs() - ts);
|
LOG_INFO("%s" YELLOW(" stopped") BLACK_BOLD(" (%" PRIu64 " ms)"), Tags::cpu(), Chrono::steadyMSecs() - ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -60,10 +60,6 @@ size_t inline generate<Algorithm::CN>(Threads<CpuThreads> &threads, uint32_t lim
|
||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
count += generate("cn/gpu", threads, Algorithm::CN_GPU, limit);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -146,17 +146,10 @@ bool xmrig::CpuWorker<N>::selfTest()
|
||||||
verify2(Algorithm::CN_R, test_output_r) &&
|
verify2(Algorithm::CN_R, test_output_r) &&
|
||||||
verify(Algorithm::CN_RWZ, test_output_rwz) &&
|
verify(Algorithm::CN_RWZ, test_output_rwz) &&
|
||||||
verify(Algorithm::CN_ZLS, test_output_zls) &&
|
verify(Algorithm::CN_ZLS, test_output_zls) &&
|
||||||
|
verify(Algorithm::CN_CCX, test_output_ccx) &&
|
||||||
verify(Algorithm::CN_DOUBLE, test_output_double);
|
verify(Algorithm::CN_DOUBLE, test_output_double);
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
if (!rc || N > 1) {
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
return verify(Algorithm::CN_GPU, test_output_gpu);
|
|
||||||
# else
|
|
||||||
return rc;
|
return rc;
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_LITE
|
# ifdef XMRIG_ALGO_CN_LITE
|
||||||
|
|
|
@ -61,6 +61,7 @@ public:
|
||||||
FLAG_SSE2,
|
FLAG_SSE2,
|
||||||
FLAG_SSSE3,
|
FLAG_SSSE3,
|
||||||
FLAG_XOP,
|
FLAG_XOP,
|
||||||
|
FLAG_POPCNT,
|
||||||
FLAG_MAX
|
FLAG_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -76,12 +76,6 @@ xmrig::CpuThreads xmrig::AdvancedCpuInfo::threads(const Algorithm &algorithm, ui
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
if (algorithm == Algorithm::CN_GPU) {
|
|
||||||
return CpuThreads(threads());
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
size_t cache = 0;
|
size_t cache = 0;
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
|
|
||||||
|
|
|
@ -142,6 +142,7 @@ static inline bool has_pdpe1gb() { return has_feature(PROCESSOR_EXT_INFO,
|
||||||
static inline bool has_sse2() { return has_feature(PROCESSOR_INFO, EDX_Reg, 1 << 26); }
|
static inline bool has_sse2() { return has_feature(PROCESSOR_INFO, EDX_Reg, 1 << 26); }
|
||||||
static inline bool has_ssse3() { return has_feature(PROCESSOR_INFO, ECX_Reg, 1 << 9); }
|
static inline bool has_ssse3() { return has_feature(PROCESSOR_INFO, ECX_Reg, 1 << 9); }
|
||||||
static inline bool has_xop() { return has_feature(0x80000001, ECX_Reg, 1 << 11); }
|
static inline bool has_xop() { return has_feature(0x80000001, ECX_Reg, 1 << 11); }
|
||||||
|
static inline bool has_popcnt() { return has_feature(PROCESSOR_INFO, ECX_Reg, 1 << 23); }
|
||||||
|
|
||||||
|
|
||||||
} // namespace xmrig
|
} // namespace xmrig
|
||||||
|
@ -176,6 +177,7 @@ xmrig::BasicCpuInfo::BasicCpuInfo() :
|
||||||
m_flags.set(FLAG_SSE2, has_sse2());
|
m_flags.set(FLAG_SSE2, has_sse2());
|
||||||
m_flags.set(FLAG_SSSE3, has_ssse3());
|
m_flags.set(FLAG_SSSE3, has_ssse3());
|
||||||
m_flags.set(FLAG_XOP, has_xop());
|
m_flags.set(FLAG_XOP, has_xop());
|
||||||
|
m_flags.set(FLAG_POPCNT, has_popcnt());
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_ASM
|
# ifdef XMRIG_FEATURE_ASM
|
||||||
if (hasAES()) {
|
if (hasAES()) {
|
||||||
|
@ -226,12 +228,6 @@ xmrig::CpuThreads xmrig::BasicCpuInfo::threads(const Algorithm &algorithm, uint3
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
if (algorithm == Algorithm::CN_GPU) {
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_LITE
|
# ifdef XMRIG_ALGO_CN_LITE
|
||||||
if (algorithm.family() == Algorithm::CN_LITE) {
|
if (algorithm.family() == Algorithm::CN_LITE) {
|
||||||
return CpuThreads(count, 1);
|
return CpuThreads(count, 1);
|
||||||
|
|
|
@ -318,12 +318,6 @@ void xmrig::HwlocCpuInfo::processTopLevelCache(hwloc_obj_t cache, const Algorith
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
if (algorithm == Algorithm::CN_GPU) {
|
|
||||||
cacheHashes = PUs;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
if (extra == 0 && algorithm.l2() > 0) {
|
if (extra == 0 && algorithm.l2() > 0) {
|
||||||
cacheHashes = std::min<size_t>(std::max<size_t>(L2 / algorithm.l2(), cores.size()), cacheHashes);
|
cacheHashes = std::min<size_t>(std::max<size_t>(L2 / algorithm.l2(), cores.size()), cacheHashes);
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include "backend/cuda/wrappers/CudaDevice.h"
|
#include "backend/cuda/wrappers/CudaDevice.h"
|
||||||
#include "backend/cuda/wrappers/CudaLib.h"
|
#include "backend/cuda/wrappers/CudaLib.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
#include "base/net/stratum/Job.h"
|
#include "base/net/stratum/Job.h"
|
||||||
#include "base/tools/Chrono.h"
|
#include "base/tools/Chrono.h"
|
||||||
#include "base/tools/String.h"
|
#include "base/tools/String.h"
|
||||||
|
@ -51,6 +52,12 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
# include "crypto/kawpow/KPCache.h"
|
||||||
|
# include "crypto/kawpow/KPHash.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_API
|
#ifdef XMRIG_FEATURE_API
|
||||||
# include "base/api/interfaces/IApiRequest.h"
|
# include "base/api/interfaces/IApiRequest.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -71,7 +78,6 @@ extern template class Threads<CudaThreads>;
|
||||||
|
|
||||||
constexpr const size_t oneMiB = 1024U * 1024U;
|
constexpr const size_t oneMiB = 1024U * 1024U;
|
||||||
static const char *kLabel = "CUDA";
|
static const char *kLabel = "CUDA";
|
||||||
static const char *tag = GREEN_BG_BOLD(WHITE_BOLD_S " nv ");
|
|
||||||
static const String kType = "cuda";
|
static const String kType = "cuda";
|
||||||
static std::mutex mutex;
|
static std::mutex mutex;
|
||||||
|
|
||||||
|
@ -107,13 +113,13 @@ public:
|
||||||
inline void print() const
|
inline void print() const
|
||||||
{
|
{
|
||||||
if (m_started == 0) {
|
if (m_started == 0) {
|
||||||
LOG_ERR("%s " RED_BOLD("disabled") YELLOW(" (failed to start threads)"), tag);
|
LOG_ERR("%s " RED_BOLD("disabled") YELLOW(" (failed to start threads)"), Tags::nvidia());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO("%s" GREEN_BOLD(" READY") " threads " "%s%zu/%zu" BLACK_BOLD(" (%" PRIu64 " ms)"),
|
LOG_INFO("%s" GREEN_BOLD(" READY") " threads " "%s%zu/%zu" BLACK_BOLD(" (%" PRIu64 " ms)"),
|
||||||
tag,
|
Tags::nvidia(),
|
||||||
m_errors == 0 ? CYAN_BOLD_S : YELLOW_BOLD_S,
|
m_errors == 0 ? CYAN_BOLD_S : YELLOW_BOLD_S,
|
||||||
m_started,
|
m_started,
|
||||||
m_threads,
|
m_threads,
|
||||||
|
@ -205,17 +211,17 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void start(const Job &)
|
inline void start(const Job &job)
|
||||||
{
|
{
|
||||||
LOG_INFO("%s use profile " BLUE_BG(WHITE_BOLD_S " %s ") WHITE_BOLD_S " (" CYAN_BOLD("%zu") WHITE_BOLD(" thread%s)") " scratchpad " CYAN_BOLD("%zu KB"),
|
LOG_INFO("%s use profile " BLUE_BG(WHITE_BOLD_S " %s ") WHITE_BOLD_S " (" CYAN_BOLD("%zu") WHITE_BOLD(" thread%s)") " scratchpad " CYAN_BOLD("%zu KB"),
|
||||||
tag,
|
Tags::nvidia(),
|
||||||
profileName.data(),
|
profileName.data(),
|
||||||
threads.size(),
|
threads.size(),
|
||||||
threads.size() > 1 ? "s" : "",
|
threads.size() > 1 ? "s" : "",
|
||||||
algo.l3() / 1024
|
algo.l3() / 1024
|
||||||
);
|
);
|
||||||
|
|
||||||
Log::print(WHITE_BOLD("| # | GPU | BUS ID | I | T | B | BF | BS | MEM | NAME"));
|
Log::print(WHITE_BOLD("| # | GPU | BUS ID | INTENSITY | THREADS | BLOCKS | BF | BS | MEMORY | NAME"));
|
||||||
|
|
||||||
size_t algo_l3 = algo.l3();
|
size_t algo_l3 = algo.l3();
|
||||||
|
|
||||||
|
@ -227,8 +233,17 @@ public:
|
||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (const auto &data : threads) {
|
for (const auto &data : threads) {
|
||||||
Log::print("|" CYAN_BOLD("%3zu") " |" CYAN_BOLD("%4u") " |" YELLOW(" %7s") " |" CYAN_BOLD("%5d") " |" CYAN_BOLD("%4d") " |"
|
size_t mem_used = (data.thread.threads() * data.thread.blocks()) * algo_l3 / oneMiB;
|
||||||
CYAN_BOLD("%4d") " |" CYAN_BOLD("%3d") " |" CYAN_BOLD("%4d") " |" CYAN("%5zu") " | " GREEN("%s"),
|
|
||||||
|
# ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
if (algo.family() == Algorithm::KAWPOW) {
|
||||||
|
const uint32_t epoch = job.height() / KPHash::EPOCH_LENGTH;
|
||||||
|
mem_used = (KPCache::dag_size(epoch) + oneMiB - 1) / oneMiB;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
Log::print("|" CYAN_BOLD("%3zu") " |" CYAN_BOLD("%4u") " |" YELLOW(" %7s") " |" CYAN_BOLD("%10d") " |" CYAN_BOLD("%8d") " |"
|
||||||
|
CYAN_BOLD("%7d") " |" CYAN_BOLD("%3d") " |" CYAN_BOLD("%4d") " |" CYAN("%7zu") " | " GREEN("%s"),
|
||||||
i,
|
i,
|
||||||
data.thread.index(),
|
data.thread.index(),
|
||||||
data.device.topology().toString().data(),
|
data.device.topology().toString().data(),
|
||||||
|
@ -237,7 +252,7 @@ public:
|
||||||
data.thread.blocks(),
|
data.thread.blocks(),
|
||||||
data.thread.bfactor(),
|
data.thread.bfactor(),
|
||||||
data.thread.bsleep(),
|
data.thread.bsleep(),
|
||||||
(data.thread.threads() * data.thread.blocks()) * algo_l3 / oneMiB,
|
mem_used,
|
||||||
data.device.name().data()
|
data.device.name().data()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -268,7 +283,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO("%s" CYAN_BOLD(" #%u") YELLOW(" %s") MAGENTA_BOLD("%4uW") CSI "1;%um %2uC" CLEAR WHITE_BOLD("%s") "%s",
|
LOG_INFO("%s" CYAN_BOLD(" #%u") YELLOW(" %s") MAGENTA_BOLD("%4uW") CSI "1;%um %2uC" CLEAR WHITE_BOLD("%s") "%s",
|
||||||
tag,
|
Tags::nvidia(),
|
||||||
device.index(),
|
device.index(),
|
||||||
device.topology().toString().data(),
|
device.topology().toString().data(),
|
||||||
health.power,
|
health.power,
|
||||||
|
@ -299,7 +314,7 @@ public:
|
||||||
|
|
||||||
const char *xmrig::cuda_tag()
|
const char *xmrig::cuda_tag()
|
||||||
{
|
{
|
||||||
return tag;
|
return Tags::nvidia();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -357,8 +372,11 @@ void xmrig::CudaBackend::execCommand(char)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void xmrig::CudaBackend::prepare(const Job &)
|
void xmrig::CudaBackend::prepare(const Job &job)
|
||||||
{
|
{
|
||||||
|
if (d_ptr) {
|
||||||
|
d_ptr->workers.jobEarlyNotification(job);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -368,18 +386,30 @@ void xmrig::CudaBackend::printHashrate(bool details)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
char num[8 * 3] = { 0 };
|
char num[16 * 3] = { 0 };
|
||||||
|
|
||||||
Log::print(WHITE_BOLD_S "| CUDA # | AFFINITY | 10s H/s | 60s H/s | 15m H/s |");
|
const double hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
||||||
|
const double hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
||||||
|
const double hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
||||||
|
|
||||||
|
double scale = 1.0;
|
||||||
|
const char* h = " H/s";
|
||||||
|
|
||||||
|
if ((hashrate_short >= 1e6) || (hashrate_medium >= 1e6) || (hashrate_large >= 1e6)) {
|
||||||
|
scale = 1e-6;
|
||||||
|
h = "MH/s";
|
||||||
|
}
|
||||||
|
|
||||||
|
Log::print(WHITE_BOLD_S "| CUDA # | AFFINITY | 10s %s | 60s %s | 15m %s |", h, h, h);
|
||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (const auto &data : d_ptr->threads) {
|
for (const auto& data : d_ptr->threads) {
|
||||||
Log::print("| %8zu | %8" PRId64 " | %7s | %7s | %7s |" CYAN_BOLD(" #%u") YELLOW(" %s") GREEN(" %s"),
|
Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") GREEN(" %s"),
|
||||||
i,
|
i,
|
||||||
data.thread.affinity(),
|
data.thread.affinity(),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval), num, sizeof num / 3),
|
Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval) * scale, num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval), num + 8, sizeof num / 3),
|
Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval) * scale, num + 16, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval), num + 8 * 2, sizeof num / 3),
|
Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval) * scale, num + 16 * 2, sizeof num / 3),
|
||||||
data.device.index(),
|
data.device.index(),
|
||||||
data.device.topology().toString().data(),
|
data.device.topology().toString().data(),
|
||||||
data.device.name().data()
|
data.device.name().data()
|
||||||
|
@ -388,10 +418,10 @@ void xmrig::CudaBackend::printHashrate(bool details)
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log::print(WHITE_BOLD_S "| - | - | %7s | %7s | %7s |",
|
Log::print(WHITE_BOLD_S "| - | - | %8s | %8s | %8s |",
|
||||||
Hashrate::format(hashrate()->calc(Hashrate::ShortInterval), num, sizeof num / 3),
|
Hashrate::format(hashrate()->calc(Hashrate::ShortInterval) * scale, num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(Hashrate::MediumInterval), num + 8, sizeof num / 3),
|
Hashrate::format(hashrate()->calc(Hashrate::MediumInterval) * scale, num + 16, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(Hashrate::LargeInterval), num + 8 * 2, sizeof num / 3)
|
Hashrate::format(hashrate()->calc(Hashrate::LargeInterval) * scale, num + 16 * 2, sizeof num / 3)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -424,7 +454,7 @@ void xmrig::CudaBackend::setJob(const Job &job)
|
||||||
d_ptr->profileName = cuda.threads().profileName(job.algorithm());
|
d_ptr->profileName = cuda.threads().profileName(job.algorithm());
|
||||||
|
|
||||||
if (d_ptr->profileName.isNull() || threads.empty()) {
|
if (d_ptr->profileName.isNull() || threads.empty()) {
|
||||||
LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (no suitable configuration found)"), tag);
|
LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (no suitable configuration found)"), Tags::nvidia());
|
||||||
|
|
||||||
return stop();
|
return stop();
|
||||||
}
|
}
|
||||||
|
@ -465,7 +495,7 @@ void xmrig::CudaBackend::stop()
|
||||||
d_ptr->workers.stop();
|
d_ptr->workers.stop();
|
||||||
d_ptr->threads.clear();
|
d_ptr->threads.clear();
|
||||||
|
|
||||||
LOG_INFO("%s" YELLOW(" stopped") BLACK_BOLD(" (%" PRIu64 " ms)"), tag, Chrono::steadyMSecs() - ts);
|
LOG_INFO("%s" YELLOW(" stopped") BLACK_BOLD(" (%" PRIu64 " ms)"), Tags::nvidia(), Chrono::steadyMSecs() - ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -181,6 +181,7 @@ void xmrig::CudaConfig::generate()
|
||||||
count += xmrig::generate<Algorithm::CN_PICO>(m_threads, devices);
|
count += xmrig::generate<Algorithm::CN_PICO>(m_threads, devices);
|
||||||
count += xmrig::generate<Algorithm::RANDOM_X>(m_threads, devices);
|
count += xmrig::generate<Algorithm::RANDOM_X>(m_threads, devices);
|
||||||
count += xmrig::generate<Algorithm::ASTROBWT>(m_threads, devices);
|
count += xmrig::generate<Algorithm::ASTROBWT>(m_threads, devices);
|
||||||
|
count += xmrig::generate<Algorithm::KAWPOW>(m_threads, devices);
|
||||||
|
|
||||||
generated = true;
|
generated = true;
|
||||||
m_shouldSave = count > 0;
|
m_shouldSave = count > 0;
|
||||||
|
|
|
@ -64,10 +64,6 @@ size_t inline generate<Algorithm::CN>(Threads<CudaThreads> &threads, const std::
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
count += generate("cn/gpu", threads, Algorithm::CN_GPU, devices);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,6 +141,15 @@ size_t inline generate<Algorithm::ASTROBWT>(Threads<CudaThreads> &threads, const
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::KAWPOW>(Threads<CudaThreads> &threads, const std::vector<CudaDevice> &devices)
|
||||||
|
{
|
||||||
|
return generate("kawpow", threads, Algorithm::KAWPOW_RVN, devices);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
} /* namespace xmrig */
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "backend/cuda/CudaWorker.h"
|
#include "backend/cuda/CudaWorker.h"
|
||||||
#include "backend/common/Tags.h"
|
#include "backend/common/Tags.h"
|
||||||
#include "backend/cuda/runners/CudaCnRunner.h"
|
#include "backend/cuda/runners/CudaCnRunner.h"
|
||||||
|
#include "backend/cuda/wrappers/CudaDevice.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
#include "base/tools/Chrono.h"
|
#include "base/tools/Chrono.h"
|
||||||
#include "core/Miner.h"
|
#include "core/Miner.h"
|
||||||
|
@ -44,6 +45,11 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
# include "backend/cuda/runners/CudaKawPowRunner.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
|
@ -66,7 +72,8 @@ static inline uint32_t roundSize(uint32_t intensity) { return kReserveCount / in
|
||||||
xmrig::CudaWorker::CudaWorker(size_t id, const CudaLaunchData &data) :
|
xmrig::CudaWorker::CudaWorker(size_t id, const CudaLaunchData &data) :
|
||||||
Worker(id, data.thread.affinity(), -1),
|
Worker(id, data.thread.affinity(), -1),
|
||||||
m_algorithm(data.algorithm),
|
m_algorithm(data.algorithm),
|
||||||
m_miner(data.miner)
|
m_miner(data.miner),
|
||||||
|
m_deviceIndex(data.device.index())
|
||||||
{
|
{
|
||||||
switch (m_algorithm.family()) {
|
switch (m_algorithm.family()) {
|
||||||
case Algorithm::RANDOM_X:
|
case Algorithm::RANDOM_X:
|
||||||
|
@ -84,6 +91,12 @@ xmrig::CudaWorker::CudaWorker(size_t id, const CudaLaunchData &data) :
|
||||||
# endif
|
# endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Algorithm::KAWPOW:
|
||||||
|
# ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
m_runner = new CudaKawPowRunner(id, data);
|
||||||
|
# endif
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
m_runner = new CudaCnRunner(id, data);
|
m_runner = new CudaCnRunner(id, data);
|
||||||
break;
|
break;
|
||||||
|
@ -107,6 +120,14 @@ xmrig::CudaWorker::~CudaWorker()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::CudaWorker::jobEarlyNotification(const Job& job)
|
||||||
|
{
|
||||||
|
if (m_runner) {
|
||||||
|
m_runner->jobEarlyNotification(job);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool xmrig::CudaWorker::selfTest()
|
bool xmrig::CudaWorker::selfTest()
|
||||||
{
|
{
|
||||||
return m_runner != nullptr;
|
return m_runner != nullptr;
|
||||||
|
@ -138,7 +159,7 @@ void xmrig::CudaWorker::start()
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!Nonce::isOutdated(Nonce::CUDA, m_job.sequence())) {
|
while (!Nonce::isOutdated(Nonce::CUDA, m_job.sequence())) {
|
||||||
uint32_t foundNonce[10] = { 0 };
|
uint32_t foundNonce[16] = { 0 };
|
||||||
uint32_t foundCount = 0;
|
uint32_t foundCount = 0;
|
||||||
|
|
||||||
if (!m_runner->run(*m_job.nonce(), &foundCount, foundNonce)) {
|
if (!m_runner->run(*m_job.nonce(), &foundCount, foundNonce)) {
|
||||||
|
@ -146,11 +167,11 @@ void xmrig::CudaWorker::start()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (foundCount) {
|
if (foundCount) {
|
||||||
JobResults::submit(m_job.currentJob(), foundNonce, foundCount);
|
JobResults::submit(m_job.currentJob(), foundNonce, foundCount, m_deviceIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t batch_size = intensity();
|
const size_t batch_size = intensity();
|
||||||
if (!m_job.nextRound(roundSize(batch_size), batch_size)) {
|
if (!Nonce::isOutdated(Nonce::CUDA, m_job.sequence()) && !m_job.nextRound(roundSize(batch_size), batch_size)) {
|
||||||
JobResults::done(m_job.currentJob());
|
JobResults::done(m_job.currentJob());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,7 +195,7 @@ bool xmrig::CudaWorker::consumeJob()
|
||||||
const size_t batch_size = intensity();
|
const size_t batch_size = intensity();
|
||||||
m_job.add(m_miner->job(), roundSize(batch_size) * batch_size, Nonce::CUDA);
|
m_job.add(m_miner->job(), roundSize(batch_size) * batch_size, Nonce::CUDA);
|
||||||
|
|
||||||
return m_runner->set(m_job.currentJob(), m_job.blob());;
|
return m_runner->set(m_job.currentJob(), m_job.blob());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,8 @@ public:
|
||||||
|
|
||||||
~CudaWorker() override;
|
~CudaWorker() override;
|
||||||
|
|
||||||
|
void jobEarlyNotification(const Job&) override;
|
||||||
|
|
||||||
static std::atomic<bool> ready;
|
static std::atomic<bool> ready;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -64,6 +66,7 @@ private:
|
||||||
const Miner *m_miner;
|
const Miner *m_miner;
|
||||||
ICudaRunner *m_runner = nullptr;
|
ICudaRunner *m_runner = nullptr;
|
||||||
WorkerJob<1> m_job;
|
WorkerJob<1> m_job;
|
||||||
|
uint32_t m_deviceIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,11 @@ if (WITH_CUDA)
|
||||||
list(APPEND HEADERS_BACKEND_CUDA src/backend/cuda/runners/CudaAstroBWTRunner.h)
|
list(APPEND HEADERS_BACKEND_CUDA src/backend/cuda/runners/CudaAstroBWTRunner.h)
|
||||||
list(APPEND SOURCES_BACKEND_CUDA src/backend/cuda/runners/CudaAstroBWTRunner.cpp)
|
list(APPEND SOURCES_BACKEND_CUDA src/backend/cuda/runners/CudaAstroBWTRunner.cpp)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (WITH_KAWPOW)
|
||||||
|
list(APPEND HEADERS_BACKEND_CUDA src/backend/cuda/runners/CudaKawPowRunner.h)
|
||||||
|
list(APPEND SOURCES_BACKEND_CUDA src/backend/cuda/runners/CudaKawPowRunner.cpp)
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
remove_definitions(/DXMRIG_FEATURE_CUDA)
|
remove_definitions(/DXMRIG_FEATURE_CUDA)
|
||||||
remove_definitions(/DXMRIG_FEATURE_NVML)
|
remove_definitions(/DXMRIG_FEATURE_NVML)
|
||||||
|
|
|
@ -52,6 +52,7 @@ public:
|
||||||
virtual bool init() = 0;
|
virtual bool init() = 0;
|
||||||
virtual bool run(uint32_t startNonce, uint32_t *rescount, uint32_t *resnonce) = 0;
|
virtual bool run(uint32_t startNonce, uint32_t *rescount, uint32_t *resnonce) = 0;
|
||||||
virtual bool set(const Job &job, uint8_t *blob) = 0;
|
virtual bool set(const Job &job, uint8_t *blob) = 0;
|
||||||
|
virtual void jobEarlyNotification(const Job&) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,8 +27,6 @@
|
||||||
#include "backend/cuda/CudaLaunchData.h"
|
#include "backend/cuda/CudaLaunchData.h"
|
||||||
#include "backend/cuda/wrappers/CudaLib.h"
|
#include "backend/cuda/wrappers/CudaLib.h"
|
||||||
#include "base/net/stratum/Job.h"
|
#include "base/net/stratum/Job.h"
|
||||||
#include "crypto/rx/Rx.h"
|
|
||||||
#include "crypto/rx/RxDataset.h"
|
|
||||||
|
|
||||||
|
|
||||||
constexpr uint32_t xmrig::CudaAstroBWTRunner::BWT_DATA_STRIDE;
|
constexpr uint32_t xmrig::CudaAstroBWTRunner::BWT_DATA_STRIDE;
|
||||||
|
|
|
@ -52,6 +52,7 @@ protected:
|
||||||
size_t intensity() const override;
|
size_t intensity() const override;
|
||||||
size_t roundSize() const override { return intensity(); }
|
size_t roundSize() const override { return intensity(); }
|
||||||
size_t processedHashes() const override { return intensity(); }
|
size_t processedHashes() const override { return intensity(); }
|
||||||
|
void jobEarlyNotification(const Job&) override {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool callWrapper(bool result) const;
|
bool callWrapper(bool result) const;
|
||||||
|
|
87
src/backend/cuda/runners/CudaKawPowRunner.cpp
Normal file
87
src/backend/cuda/runners/CudaKawPowRunner.cpp
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "backend/cuda/runners/CudaKawPowRunner.h"
|
||||||
|
#include "3rdparty/libethash/data_sizes.h"
|
||||||
|
#include "backend/cuda/CudaLaunchData.h"
|
||||||
|
#include "backend/cuda/wrappers/CudaLib.h"
|
||||||
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
|
#include "base/net/stratum/Job.h"
|
||||||
|
#include "base/tools/Chrono.h"
|
||||||
|
#include "crypto/kawpow/KPCache.h"
|
||||||
|
#include "crypto/kawpow/KPHash.h"
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::CudaKawPowRunner::CudaKawPowRunner(size_t index, const CudaLaunchData &data) :
|
||||||
|
CudaBaseRunner(index, data)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::CudaKawPowRunner::run(uint32_t /*startNonce*/, uint32_t *rescount, uint32_t *resnonce)
|
||||||
|
{
|
||||||
|
return callWrapper(CudaLib::kawPowHash(m_ctx, m_jobBlob, m_target, rescount, resnonce, &m_skippedHashes));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::CudaKawPowRunner::set(const Job &job, uint8_t *blob)
|
||||||
|
{
|
||||||
|
if (!CudaBaseRunner::set(job, blob)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_jobBlob = blob;
|
||||||
|
|
||||||
|
const uint64_t height = job.height();
|
||||||
|
const uint32_t epoch = height / KPHash::EPOCH_LENGTH;
|
||||||
|
|
||||||
|
KPCache& cache = KPCache::s_cache;
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(KPCache::s_cacheMutex);
|
||||||
|
cache.init(epoch);
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint64_t start_ms = Chrono::steadyMSecs();
|
||||||
|
|
||||||
|
const bool result = CudaLib::kawPowPrepare(m_ctx, cache.data(), cache.size(), cache.l1_cache(), cache.dag_size(epoch), height, dag_sizes);
|
||||||
|
if (!result) {
|
||||||
|
LOG_ERR("%s " YELLOW("KawPow") RED(" failed to initialize DAG: ") RED_BOLD("%s"), Tags::nvidia(), CudaLib::lastError(m_ctx));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const int64_t dt = Chrono::steadyMSecs() - start_ms;
|
||||||
|
if (dt > 1000) {
|
||||||
|
LOG_INFO("%s " YELLOW("KawPow") " DAG for epoch " WHITE_BOLD("%u") " calculated " BLACK_BOLD("(%" PRIu64 "ms)"), Tags::nvidia(), epoch, dt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::CudaKawPowRunner::jobEarlyNotification(const Job&)
|
||||||
|
{
|
||||||
|
CudaLib::kawPowStopHash(m_ctx);
|
||||||
|
}
|
|
@ -22,49 +22,34 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XMRIG_OCLRYORUNNER_H
|
#ifndef XMRIG_CUDAKAWPOWRUNNER_H
|
||||||
#define XMRIG_OCLRYORUNNER_H
|
#define XMRIG_CUDAKAWPOWRUNNER_H
|
||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/runners/OclBaseRunner.h"
|
#include "backend/cuda/runners/CudaBaseRunner.h"
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
class Cn00RyoKernel;
|
class CudaKawPowRunner : public CudaBaseRunner
|
||||||
class Cn0Kernel;
|
|
||||||
class Cn1RyoKernel;
|
|
||||||
class Cn2RyoKernel;
|
|
||||||
|
|
||||||
|
|
||||||
class OclRyoRunner : public OclBaseRunner
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
XMRIG_DISABLE_COPY_MOVE_DEFAULT(OclRyoRunner)
|
CudaKawPowRunner(size_t index, const CudaLaunchData &data);
|
||||||
|
|
||||||
OclRyoRunner(size_t index, const OclLaunchData &data);
|
|
||||||
|
|
||||||
~OclRyoRunner() override;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
size_t bufferSize() const override;
|
bool run(uint32_t startNonce, uint32_t *rescount, uint32_t *resnonce) override;
|
||||||
void run(uint32_t nonce, uint32_t *hashOutput) override;
|
bool set(const Job &job, uint8_t *blob) override;
|
||||||
void set(const Job &job, uint8_t *blob) override;
|
size_t processedHashes() const override { return intensity() - m_skippedHashes; }
|
||||||
void build() override;
|
void jobEarlyNotification(const Job&) override;
|
||||||
void init() override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cl_mem m_scratchpads = nullptr;
|
uint8_t* m_jobBlob = nullptr;
|
||||||
cl_mem m_states = nullptr;
|
uint32_t m_skippedHashes = 0;
|
||||||
Cn00RyoKernel *m_cn00 = nullptr;
|
|
||||||
Cn0Kernel *m_cn0 = nullptr;
|
|
||||||
Cn1RyoKernel *m_cn1 = nullptr;
|
|
||||||
Cn2RyoKernel *m_cn2 = nullptr;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
} /* namespace xmrig */
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
#endif // XMRIG_OCLRYORUNNER_H
|
#endif // XMRIG_CUDAKAWPOWRUNNER_H
|
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#include "backend/cuda/wrappers/CudaLib.h"
|
#include "backend/cuda/wrappers/CudaLib.h"
|
||||||
#include "base/io/Env.h"
|
#include "base/io/Env.h"
|
||||||
|
#include "base/io/log/Log.h"
|
||||||
#include "crypto/rx/RxAlgo.h"
|
#include "crypto/rx/RxAlgo.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -64,9 +65,11 @@ static const char *kPluginVersion = "pluginVersion";
|
||||||
static const char *kRelease = "release";
|
static const char *kRelease = "release";
|
||||||
static const char *kRxHash = "rxHash";
|
static const char *kRxHash = "rxHash";
|
||||||
static const char *kRxPrepare = "rxPrepare";
|
static const char *kRxPrepare = "rxPrepare";
|
||||||
|
static const char *kKawPowHash = "kawPowHash";
|
||||||
|
static const char *kKawPowPrepare_v2 = "kawPowPrepare_v2";
|
||||||
|
static const char *kKawPowStopHash = "kawPowStopHash";
|
||||||
static const char *kSetJob = "setJob";
|
static const char *kSetJob = "setJob";
|
||||||
static const char *kSetJob_v2 = "setJob_v2";
|
static const char *kSetJob_v2 = "setJob_v2";
|
||||||
static const char *kSymbolNotFound = "symbol not found";
|
|
||||||
static const char *kVersion = "version";
|
static const char *kVersion = "version";
|
||||||
|
|
||||||
|
|
||||||
|
@ -88,6 +91,9 @@ using pluginVersion_t = const char * (*)();
|
||||||
using release_t = void (*)(nvid_ctx *);
|
using release_t = void (*)(nvid_ctx *);
|
||||||
using rxHash_t = bool (*)(nvid_ctx *, uint32_t, uint64_t, uint32_t *, uint32_t *);
|
using rxHash_t = bool (*)(nvid_ctx *, uint32_t, uint64_t, uint32_t *, uint32_t *);
|
||||||
using rxPrepare_t = bool (*)(nvid_ctx *, const void *, size_t, bool, uint32_t);
|
using rxPrepare_t = bool (*)(nvid_ctx *, const void *, size_t, bool, uint32_t);
|
||||||
|
using kawPowHash_t = bool (*)(nvid_ctx *, uint8_t*, uint64_t, uint32_t *, uint32_t *, uint32_t *);
|
||||||
|
using kawPowPrepare_v2_t = bool (*)(nvid_ctx *, const void *, size_t, const void *, size_t, uint32_t, const uint64_t*);
|
||||||
|
using kawPowStopHash_t = bool (*)(nvid_ctx *);
|
||||||
using setJob_t = bool (*)(nvid_ctx *, const void *, size_t, int32_t);
|
using setJob_t = bool (*)(nvid_ctx *, const void *, size_t, int32_t);
|
||||||
using setJob_v2_t = bool (*)(nvid_ctx *, const void *, size_t, const char *);
|
using setJob_v2_t = bool (*)(nvid_ctx *, const void *, size_t, const char *);
|
||||||
using version_t = uint32_t (*)(Version);
|
using version_t = uint32_t (*)(Version);
|
||||||
|
@ -111,12 +117,15 @@ static pluginVersion_t pPluginVersion = nullptr;
|
||||||
static release_t pRelease = nullptr;
|
static release_t pRelease = nullptr;
|
||||||
static rxHash_t pRxHash = nullptr;
|
static rxHash_t pRxHash = nullptr;
|
||||||
static rxPrepare_t pRxPrepare = nullptr;
|
static rxPrepare_t pRxPrepare = nullptr;
|
||||||
|
static kawPowHash_t pKawPowHash = nullptr;
|
||||||
|
static kawPowPrepare_v2_t pKawPowPrepare_v2 = nullptr;
|
||||||
|
static kawPowStopHash_t pKawPowStopHash = nullptr;
|
||||||
static setJob_t pSetJob = nullptr;
|
static setJob_t pSetJob = nullptr;
|
||||||
static setJob_v2_t pSetJob_v2 = nullptr;
|
static setJob_v2_t pSetJob_v2 = nullptr;
|
||||||
static version_t pVersion = nullptr;
|
static version_t pVersion = nullptr;
|
||||||
|
|
||||||
|
|
||||||
#define DLSYM(x) if (uv_dlsym(&cudaLib, k##x, reinterpret_cast<void**>(&p##x)) == -1) { throw std::runtime_error(kSymbolNotFound); }
|
#define DLSYM(x) if (uv_dlsym(&cudaLib, k##x, reinterpret_cast<void**>(&p##x)) == -1) { throw std::runtime_error("symbol not found (" #x ")"); }
|
||||||
|
|
||||||
|
|
||||||
bool CudaLib::m_initialized = false;
|
bool CudaLib::m_initialized = false;
|
||||||
|
@ -199,6 +208,24 @@ bool xmrig::CudaLib::rxPrepare(nvid_ctx *ctx, const void *dataset, size_t datase
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::CudaLib::kawPowHash(nvid_ctx *ctx, uint8_t* job_blob, uint64_t target, uint32_t *rescount, uint32_t *resnonce, uint32_t *skipped_hashes) noexcept
|
||||||
|
{
|
||||||
|
return pKawPowHash(ctx, job_blob, target, rescount, resnonce, skipped_hashes);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::CudaLib::kawPowPrepare(nvid_ctx *ctx, const void* cache, size_t cache_size, const void* dag_precalc, size_t dag_size, uint32_t height, const uint64_t* dag_sizes) noexcept
|
||||||
|
{
|
||||||
|
return pKawPowPrepare_v2(ctx, cache, cache_size, dag_precalc, dag_size, height, dag_sizes);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::CudaLib::kawPowStopHash(nvid_ctx *ctx) noexcept
|
||||||
|
{
|
||||||
|
return pKawPowStopHash(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool xmrig::CudaLib::setJob(nvid_ctx *ctx, const void *data, size_t size, const Algorithm &algorithm) noexcept
|
bool xmrig::CudaLib::setJob(nvid_ctx *ctx, const void *data, size_t size, const Algorithm &algorithm) noexcept
|
||||||
{
|
{
|
||||||
const Algorithm algo = RxAlgo::id(algorithm);
|
const Algorithm algo = RxAlgo::id(algorithm);
|
||||||
|
@ -323,7 +350,7 @@ bool xmrig::CudaLib::load()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pVersion(ApiVersion) != 3u) {
|
if (pVersion(ApiVersion) != 3U) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,6 +374,9 @@ bool xmrig::CudaLib::load()
|
||||||
DLSYM(RxPrepare);
|
DLSYM(RxPrepare);
|
||||||
DLSYM(AstroBWTHash);
|
DLSYM(AstroBWTHash);
|
||||||
DLSYM(AstroBWTPrepare);
|
DLSYM(AstroBWTPrepare);
|
||||||
|
DLSYM(KawPowHash);
|
||||||
|
DLSYM(KawPowPrepare_v2);
|
||||||
|
DLSYM(KawPowStopHash);
|
||||||
DLSYM(Version);
|
DLSYM(Version);
|
||||||
|
|
||||||
if (!pDeviceInfo_v2) {
|
if (!pDeviceInfo_v2) {
|
||||||
|
@ -357,6 +387,7 @@ bool xmrig::CudaLib::load()
|
||||||
DLSYM(SetJob);
|
DLSYM(SetJob);
|
||||||
}
|
}
|
||||||
} catch (std::exception &ex) {
|
} catch (std::exception &ex) {
|
||||||
|
LOG_ERR("Error loading CUDA library: %s", ex.what());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,9 @@ public:
|
||||||
static bool deviceInit(nvid_ctx *ctx) noexcept;
|
static bool deviceInit(nvid_ctx *ctx) noexcept;
|
||||||
static bool rxHash(nvid_ctx *ctx, uint32_t startNonce, uint64_t target, uint32_t *rescount, uint32_t *resnonce) noexcept;
|
static bool rxHash(nvid_ctx *ctx, uint32_t startNonce, uint64_t target, uint32_t *rescount, uint32_t *resnonce) noexcept;
|
||||||
static bool rxPrepare(nvid_ctx *ctx, const void *dataset, size_t datasetSize, bool dataset_host, uint32_t batchSize) noexcept;
|
static bool rxPrepare(nvid_ctx *ctx, const void *dataset, size_t datasetSize, bool dataset_host, uint32_t batchSize) noexcept;
|
||||||
|
static bool kawPowHash(nvid_ctx *ctx, uint8_t* job_blob, uint64_t target, uint32_t *rescount, uint32_t *resnonce, uint32_t *skipped_hashes) noexcept;
|
||||||
|
static bool kawPowPrepare(nvid_ctx *ctx, const void* cache, size_t cache_size, const void* dag_precalc, size_t dag_size, uint32_t height, const uint64_t* dag_sizes) noexcept;
|
||||||
|
static bool kawPowStopHash(nvid_ctx *ctx) noexcept;
|
||||||
static bool setJob(nvid_ctx *ctx, const void *data, size_t size, const Algorithm &algorithm) noexcept;
|
static bool setJob(nvid_ctx *ctx, const void *data, size_t size, const Algorithm &algorithm) noexcept;
|
||||||
static const char *deviceName(nvid_ctx *ctx) noexcept;
|
static const char *deviceName(nvid_ctx *ctx) noexcept;
|
||||||
static const char *lastError(nvid_ctx *ctx) noexcept;
|
static const char *lastError(nvid_ctx *ctx) noexcept;
|
||||||
|
|
|
@ -36,11 +36,12 @@
|
||||||
#include "backend/opencl/OclConfig.h"
|
#include "backend/opencl/OclConfig.h"
|
||||||
#include "backend/opencl/OclLaunchData.h"
|
#include "backend/opencl/OclLaunchData.h"
|
||||||
#include "backend/opencl/OclWorker.h"
|
#include "backend/opencl/OclWorker.h"
|
||||||
#include "backend/opencl/runners/tools/OclSharedState.h"
|
|
||||||
#include "backend/opencl/runners/OclAstroBWTRunner.h"
|
#include "backend/opencl/runners/OclAstroBWTRunner.h"
|
||||||
|
#include "backend/opencl/runners/tools/OclSharedState.h"
|
||||||
#include "backend/opencl/wrappers/OclContext.h"
|
#include "backend/opencl/wrappers/OclContext.h"
|
||||||
#include "backend/opencl/wrappers/OclLib.h"
|
#include "backend/opencl/wrappers/OclLib.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
#include "base/net/stratum/Job.h"
|
#include "base/net/stratum/Job.h"
|
||||||
#include "base/tools/Chrono.h"
|
#include "base/tools/Chrono.h"
|
||||||
#include "base/tools/String.h"
|
#include "base/tools/String.h"
|
||||||
|
@ -48,6 +49,12 @@
|
||||||
#include "core/Controller.h"
|
#include "core/Controller.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
# include "crypto/kawpow/KPCache.h"
|
||||||
|
# include "crypto/kawpow/KPHash.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_API
|
#ifdef XMRIG_FEATURE_API
|
||||||
# include "base/api/interfaces/IApiRequest.h"
|
# include "base/api/interfaces/IApiRequest.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -68,7 +75,6 @@ extern template class Threads<OclThreads>;
|
||||||
|
|
||||||
constexpr const size_t oneMiB = 1024U * 1024U;
|
constexpr const size_t oneMiB = 1024U * 1024U;
|
||||||
static const char *kLabel = "OPENCL";
|
static const char *kLabel = "OPENCL";
|
||||||
static const char *tag = MAGENTA_BG_BOLD(WHITE_BOLD_S " ocl ");
|
|
||||||
static const String kType = "opencl";
|
static const String kType = "opencl";
|
||||||
static std::mutex mutex;
|
static std::mutex mutex;
|
||||||
|
|
||||||
|
@ -103,13 +109,13 @@ public:
|
||||||
inline void print() const
|
inline void print() const
|
||||||
{
|
{
|
||||||
if (m_started == 0) {
|
if (m_started == 0) {
|
||||||
LOG_ERR("%s " RED_BOLD("disabled") YELLOW(" (failed to start threads)"), tag);
|
LOG_ERR("%s " RED_BOLD("disabled") YELLOW(" (failed to start threads)"), Tags::opencl());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO("%s" GREEN_BOLD(" READY") " threads " "%s%zu/%zu" BLACK_BOLD(" (%" PRIu64 " ms)"),
|
LOG_INFO("%s" GREEN_BOLD(" READY") " threads " "%s%zu/%zu" BLACK_BOLD(" (%" PRIu64 " ms)"),
|
||||||
tag,
|
Tags::opencl(),
|
||||||
m_errors == 0 ? CYAN_BOLD_S : YELLOW_BOLD_S,
|
m_errors == 0 ? CYAN_BOLD_S : YELLOW_BOLD_S,
|
||||||
m_started,
|
m_started,
|
||||||
m_threads,
|
m_threads,
|
||||||
|
@ -194,14 +200,14 @@ public:
|
||||||
inline void start(const Job &job)
|
inline void start(const Job &job)
|
||||||
{
|
{
|
||||||
LOG_INFO("%s use profile " BLUE_BG(WHITE_BOLD_S " %s ") WHITE_BOLD_S " (" CYAN_BOLD("%zu") WHITE_BOLD(" thread%s)") " scratchpad " CYAN_BOLD("%zu KB"),
|
LOG_INFO("%s use profile " BLUE_BG(WHITE_BOLD_S " %s ") WHITE_BOLD_S " (" CYAN_BOLD("%zu") WHITE_BOLD(" thread%s)") " scratchpad " CYAN_BOLD("%zu KB"),
|
||||||
tag,
|
Tags::opencl(),
|
||||||
profileName.data(),
|
profileName.data(),
|
||||||
threads.size(),
|
threads.size(),
|
||||||
threads.size() > 1 ? "s" : "",
|
threads.size() > 1 ? "s" : "",
|
||||||
algo.l3() / 1024
|
algo.l3() / 1024
|
||||||
);
|
);
|
||||||
|
|
||||||
Log::print(WHITE_BOLD("| # | GPU | BUS ID | I | W | SI | MC | U | MEM | NAME"));
|
Log::print(WHITE_BOLD("| # | GPU | BUS ID | INTENSITY | WSIZE | MEMORY | NAME"));
|
||||||
|
|
||||||
size_t algo_l3 = algo.l3();
|
size_t algo_l3 = algo.l3();
|
||||||
|
|
||||||
|
@ -213,17 +219,23 @@ public:
|
||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (const auto &data : threads) {
|
for (const auto &data : threads) {
|
||||||
Log::print("|" CYAN_BOLD("%3zu") " |" CYAN_BOLD("%4u") " |" YELLOW(" %7s") " |" CYAN_BOLD("%5u") " |" CYAN_BOLD("%3u") " |"
|
size_t mem_used = data.thread.intensity() * algo_l3 / oneMiB;
|
||||||
CYAN_BOLD("%3u") " |" CYAN_BOLD("%3s") " |" CYAN_BOLD("%3u") " |" CYAN("%5zu") " | %s",
|
|
||||||
|
# ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
if (algo.family() == Algorithm::KAWPOW) {
|
||||||
|
const uint32_t epoch = job.height() / KPHash::EPOCH_LENGTH;
|
||||||
|
mem_used = (KPCache::cache_size(epoch) + KPCache::dag_size(epoch)) / oneMiB;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
Log::print("|" CYAN_BOLD("%3zu") " |" CYAN_BOLD("%4u") " |" YELLOW(" %7s") " |" CYAN_BOLD("%10u") " |" CYAN_BOLD("%6u") " |"
|
||||||
|
CYAN("%7zu") " | %s",
|
||||||
i,
|
i,
|
||||||
data.thread.index(),
|
data.thread.index(),
|
||||||
data.device.topology().toString().data(),
|
data.device.topology().toString().data(),
|
||||||
data.thread.intensity(),
|
data.thread.intensity(),
|
||||||
data.thread.worksize(),
|
data.thread.worksize(),
|
||||||
data.thread.stridedIndex(),
|
mem_used,
|
||||||
data.thread.stridedIndex() == 2 ? std::to_string(data.thread.memChunk()).c_str() : "-",
|
|
||||||
data.thread.unrollFactor(),
|
|
||||||
data.thread.intensity() * algo_l3 / oneMiB,
|
|
||||||
data.device.printableName().data()
|
data.device.printableName().data()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -248,7 +260,7 @@ public:
|
||||||
const auto health = AdlLib::health(device);
|
const auto health = AdlLib::health(device);
|
||||||
|
|
||||||
LOG_INFO("%s" CYAN_BOLD(" #%u") YELLOW(" %s") MAGENTA_BOLD("%4uW") CSI "1;%um %2uC" CYAN_BOLD(" %4u") CYAN("RPM") WHITE_BOLD(" %u/%u") "MHz",
|
LOG_INFO("%s" CYAN_BOLD(" #%u") YELLOW(" %s") MAGENTA_BOLD("%4uW") CSI "1;%um %2uC" CYAN_BOLD(" %4u") CYAN("RPM") WHITE_BOLD(" %u/%u") "MHz",
|
||||||
tag,
|
Tags::opencl(),
|
||||||
device.index(),
|
device.index(),
|
||||||
device.topology().toString().data(),
|
device.topology().toString().data(),
|
||||||
health.power,
|
health.power,
|
||||||
|
@ -280,7 +292,7 @@ public:
|
||||||
|
|
||||||
const char *xmrig::ocl_tag()
|
const char *xmrig::ocl_tag()
|
||||||
{
|
{
|
||||||
return tag;
|
return Tags::opencl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -338,8 +350,11 @@ void xmrig::OclBackend::execCommand(char)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void xmrig::OclBackend::prepare(const Job &)
|
void xmrig::OclBackend::prepare(const Job &job)
|
||||||
{
|
{
|
||||||
|
if (d_ptr) {
|
||||||
|
d_ptr->workers.jobEarlyNotification(job);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -349,18 +364,30 @@ void xmrig::OclBackend::printHashrate(bool details)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
char num[8 * 3] = { 0 };
|
char num[16 * 3] = { 0 };
|
||||||
|
|
||||||
Log::print(WHITE_BOLD_S "| OPENCL # | AFFINITY | 10s H/s | 60s H/s | 15m H/s |");
|
const double hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
||||||
|
const double hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
||||||
|
const double hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
||||||
|
|
||||||
|
double scale = 1.0;
|
||||||
|
const char* h = " H/s";
|
||||||
|
|
||||||
|
if ((hashrate_short >= 1e6) || (hashrate_medium >= 1e6) || (hashrate_large >= 1e6)) {
|
||||||
|
scale = 1e-6;
|
||||||
|
h = "MH/s";
|
||||||
|
}
|
||||||
|
|
||||||
|
Log::print(WHITE_BOLD_S "| OPENCL # | AFFINITY | 10s %s | 60s %s | 15m %s |", h, h, h);
|
||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (const auto &data : d_ptr->threads) {
|
for (const auto& data : d_ptr->threads) {
|
||||||
Log::print("| %8zu | %8" PRId64 " | %7s | %7s | %7s |" CYAN_BOLD(" #%u") YELLOW(" %s") " %s",
|
Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") " %s",
|
||||||
i,
|
i,
|
||||||
data.affinity,
|
data.affinity,
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval), num, sizeof num / 3),
|
Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval) * scale, num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval), num + 8, sizeof num / 3),
|
Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval) * scale, num + 16, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval), num + 8 * 2, sizeof num / 3),
|
Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval) * scale, num + 16 * 2, sizeof num / 3),
|
||||||
data.device.index(),
|
data.device.index(),
|
||||||
data.device.topology().toString().data(),
|
data.device.topology().toString().data(),
|
||||||
data.device.printableName().data()
|
data.device.printableName().data()
|
||||||
|
@ -369,10 +396,10 @@ void xmrig::OclBackend::printHashrate(bool details)
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log::print(WHITE_BOLD_S "| - | - | %7s | %7s | %7s |",
|
Log::print(WHITE_BOLD_S "| - | - | %8s | %8s | %8s |",
|
||||||
Hashrate::format(hashrate()->calc(Hashrate::ShortInterval), num, sizeof num / 3),
|
Hashrate::format(hashrate()->calc(Hashrate::ShortInterval) * scale, num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(Hashrate::MediumInterval), num + 8, sizeof num / 3),
|
Hashrate::format(hashrate()->calc(Hashrate::MediumInterval) * scale, num + 16, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(Hashrate::LargeInterval), num + 8 * 2, sizeof num / 3)
|
Hashrate::format(hashrate()->calc(Hashrate::LargeInterval) * scale, num + 16 * 2, sizeof num / 3)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -405,13 +432,13 @@ void xmrig::OclBackend::setJob(const Job &job)
|
||||||
d_ptr->profileName = cl.threads().profileName(job.algorithm());
|
d_ptr->profileName = cl.threads().profileName(job.algorithm());
|
||||||
|
|
||||||
if (d_ptr->profileName.isNull() || threads.empty()) {
|
if (d_ptr->profileName.isNull() || threads.empty()) {
|
||||||
LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (no suitable configuration found)"), tag);
|
LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (no suitable configuration found)"), Tags::opencl());
|
||||||
|
|
||||||
return stop();
|
return stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!d_ptr->context.init(d_ptr->devices, threads)) {
|
if (!d_ptr->context.init(d_ptr->devices, threads)) {
|
||||||
LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (OpenCL context unavailable)"), tag);
|
LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (OpenCL context unavailable)"), Tags::opencl());
|
||||||
|
|
||||||
return stop();
|
return stop();
|
||||||
}
|
}
|
||||||
|
@ -454,7 +481,7 @@ void xmrig::OclBackend::stop()
|
||||||
|
|
||||||
OclSharedState::release();
|
OclSharedState::release();
|
||||||
|
|
||||||
LOG_INFO("%s" YELLOW(" stopped") BLACK_BOLD(" (%" PRIu64 " ms)"), tag, Chrono::steadyMSecs() - ts);
|
LOG_INFO("%s" YELLOW(" stopped") BLACK_BOLD(" (%" PRIu64 " ms)"), Tags::opencl(), Chrono::steadyMSecs() - ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -221,6 +221,7 @@ void xmrig::OclConfig::generate()
|
||||||
count += xmrig::generate<Algorithm::CN_PICO>(m_threads, devices);
|
count += xmrig::generate<Algorithm::CN_PICO>(m_threads, devices);
|
||||||
count += xmrig::generate<Algorithm::RANDOM_X>(m_threads, devices);
|
count += xmrig::generate<Algorithm::RANDOM_X>(m_threads, devices);
|
||||||
count += xmrig::generate<Algorithm::ASTROBWT>(m_threads, devices);
|
count += xmrig::generate<Algorithm::ASTROBWT>(m_threads, devices);
|
||||||
|
count += xmrig::generate<Algorithm::KAWPOW>(m_threads, devices);
|
||||||
|
|
||||||
m_shouldSave = count > 0;
|
m_shouldSave = count > 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,10 +63,6 @@ size_t inline generate<Algorithm::CN>(Threads<OclThreads> &threads, const std::v
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
count += generate("cn/gpu", threads, Algorithm::CN_GPU, devices);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,6 +135,15 @@ size_t inline generate<Algorithm::ASTROBWT>(Threads<OclThreads>& threads, const
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
template<>
|
||||||
|
size_t inline generate<Algorithm::KAWPOW>(Threads<OclThreads>& threads, const std::vector<OclDevice>& devices)
|
||||||
|
{
|
||||||
|
return generate("kawpow", threads, Algorithm::KAWPOW_RVN, devices);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static inline std::vector<OclDevice> filterDevices(const std::vector<OclDevice> &devices, const std::vector<uint32_t> &hints)
|
static inline std::vector<OclDevice> filterDevices(const std::vector<OclDevice> &devices, const std::vector<uint32_t> &hints)
|
||||||
{
|
{
|
||||||
std::vector<OclDevice> out;
|
std::vector<OclDevice> out;
|
||||||
|
|
|
@ -56,7 +56,7 @@ xmrig::OclThread::OclThread(const rapidjson::Value &value)
|
||||||
}
|
}
|
||||||
|
|
||||||
m_index = Json::getUint(value, kIndex);
|
m_index = Json::getUint(value, kIndex);
|
||||||
m_worksize = std::max(std::min(Json::getUint(value, kWorksize), 128u), 1u);
|
m_worksize = std::max(std::min(Json::getUint(value, kWorksize), 512u), 1u);
|
||||||
m_unrollFactor = std::max(std::min(Json::getUint(value, kUnroll, m_unrollFactor), 128u), 1u);
|
m_unrollFactor = std::max(std::min(Json::getUint(value, kUnroll, m_unrollFactor), 128u), 1u);
|
||||||
|
|
||||||
setIntensity(Json::getUint(value, kIntensity));
|
setIntensity(Json::getUint(value, kIntensity));
|
||||||
|
@ -151,7 +151,7 @@ rapidjson::Value xmrig::OclThread::toJSON(rapidjson::Document &doc) const
|
||||||
out.AddMember(StringRef(kDatasetHost), isDatasetHost(), allocator);
|
out.AddMember(StringRef(kDatasetHost), isDatasetHost(), allocator);
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
else if (!m_fields.test(ASTROBWT_FIELDS)) {
|
else if (!m_fields.test(ASTROBWT_FIELDS) && !m_fields.test(KAWPOW_FIELDS)) {
|
||||||
out.AddMember(StringRef(kUnroll), unrollFactor(), allocator);
|
out.AddMember(StringRef(kUnroll), unrollFactor(), allocator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,20 +51,6 @@ public:
|
||||||
setIntensity(intensity);
|
setIntensity(intensity);
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
OclThread(uint32_t index, uint32_t intensity, uint32_t worksize, uint32_t threads, uint32_t unrollFactor) :
|
|
||||||
m_fields(0),
|
|
||||||
m_threads(threads, -1),
|
|
||||||
m_index(index),
|
|
||||||
m_memChunk(0),
|
|
||||||
m_stridedIndex(0),
|
|
||||||
m_unrollFactor(unrollFactor),
|
|
||||||
m_worksize(worksize)
|
|
||||||
{
|
|
||||||
setIntensity(intensity);
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
OclThread(uint32_t index, uint32_t intensity, uint32_t worksize, uint32_t threads, bool gcnAsm, bool datasetHost, uint32_t bfactor) :
|
OclThread(uint32_t index, uint32_t intensity, uint32_t worksize, uint32_t threads, bool gcnAsm, bool datasetHost, uint32_t bfactor) :
|
||||||
m_datasetHost(datasetHost),
|
m_datasetHost(datasetHost),
|
||||||
|
@ -95,6 +81,20 @@ public:
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
OclThread(uint32_t index, uint32_t intensity, uint32_t worksize, uint32_t threads) :
|
||||||
|
m_fields(8),
|
||||||
|
m_threads(threads, -1),
|
||||||
|
m_index(index),
|
||||||
|
m_memChunk(0),
|
||||||
|
m_stridedIndex(0),
|
||||||
|
m_unrollFactor(1),
|
||||||
|
m_worksize(worksize)
|
||||||
|
{
|
||||||
|
setIntensity(intensity);
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
OclThread(const rapidjson::Value &value);
|
OclThread(const rapidjson::Value &value);
|
||||||
|
|
||||||
inline bool isAsm() const { return m_gcnAsm; }
|
inline bool isAsm() const { return m_gcnAsm; }
|
||||||
|
@ -120,6 +120,7 @@ private:
|
||||||
STRIDED_INDEX_FIELD,
|
STRIDED_INDEX_FIELD,
|
||||||
RANDOMX_FIELDS,
|
RANDOMX_FIELDS,
|
||||||
ASTROBWT_FIELDS,
|
ASTROBWT_FIELDS,
|
||||||
|
KAWPOW_FIELDS,
|
||||||
FIELD_MAX
|
FIELD_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -45,11 +45,10 @@
|
||||||
# include "backend/opencl/runners/OclAstroBWTRunner.h"
|
# include "backend/opencl/runners/OclAstroBWTRunner.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_CN_GPU
|
#ifdef XMRIG_ALGO_KAWPOW
|
||||||
# include "backend/opencl/runners/OclRyoRunner.h"
|
# include "backend/opencl/runners/OclKawPowRunner.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
|
@ -80,7 +79,8 @@ xmrig::OclWorker::OclWorker(size_t id, const OclLaunchData &data) :
|
||||||
m_algorithm(data.algorithm),
|
m_algorithm(data.algorithm),
|
||||||
m_miner(data.miner),
|
m_miner(data.miner),
|
||||||
m_intensity(data.thread.intensity()),
|
m_intensity(data.thread.intensity()),
|
||||||
m_sharedData(OclSharedState::get(data.device.index()))
|
m_sharedData(OclSharedState::get(data.device.index())),
|
||||||
|
m_deviceIndex(data.device.index())
|
||||||
{
|
{
|
||||||
switch (m_algorithm.family()) {
|
switch (m_algorithm.family()) {
|
||||||
case Algorithm::RANDOM_X:
|
case Algorithm::RANDOM_X:
|
||||||
|
@ -106,16 +106,14 @@ xmrig::OclWorker::OclWorker(size_t id, const OclLaunchData &data) :
|
||||||
# endif
|
# endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
case Algorithm::KAWPOW:
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
# ifdef XMRIG_ALGO_KAWPOW
|
||||||
if (m_algorithm == Algorithm::CN_GPU) {
|
m_runner = new OclKawPowRunner(id, data);
|
||||||
m_runner = new OclRyoRunner(id, data);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
# endif
|
# endif
|
||||||
{
|
break;
|
||||||
m_runner = new OclCnRunner(id, data);
|
|
||||||
}
|
default:
|
||||||
|
m_runner = new OclCnRunner(id, data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,6 +140,14 @@ xmrig::OclWorker::~OclWorker()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::OclWorker::jobEarlyNotification(const Job& job)
|
||||||
|
{
|
||||||
|
if (m_runner) {
|
||||||
|
m_runner->jobEarlyNotification(job);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool xmrig::OclWorker::selfTest()
|
bool xmrig::OclWorker::selfTest()
|
||||||
{
|
{
|
||||||
return m_runner != nullptr;
|
return m_runner != nullptr;
|
||||||
|
@ -195,10 +201,10 @@ void xmrig::OclWorker::start()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (results[0xFF] > 0) {
|
if (results[0xFF] > 0) {
|
||||||
JobResults::submit(m_job.currentJob(), results, results[0xFF]);
|
JobResults::submit(m_job.currentJob(), results, results[0xFF], m_deviceIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_job.nextRound(roundSize(runnerRoundSize), runnerRoundSize)) {
|
if (!Nonce::isOutdated(Nonce::OPENCL, m_job.sequence()) && !m_job.nextRound(roundSize(runnerRoundSize), runnerRoundSize)) {
|
||||||
JobResults::done(m_job.currentJob());
|
JobResults::done(m_job.currentJob());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@ namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
class IOclRunner;
|
class IOclRunner;
|
||||||
|
class Job;
|
||||||
|
|
||||||
|
|
||||||
class OclWorker : public Worker
|
class OclWorker : public Worker
|
||||||
|
@ -49,6 +50,8 @@ public:
|
||||||
|
|
||||||
~OclWorker() override;
|
~OclWorker() override;
|
||||||
|
|
||||||
|
void jobEarlyNotification(const Job&) override;
|
||||||
|
|
||||||
static std::atomic<bool> ready;
|
static std::atomic<bool> ready;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -66,6 +69,7 @@ private:
|
||||||
IOclRunner *m_runner = nullptr;
|
IOclRunner *m_runner = nullptr;
|
||||||
OclSharedData &m_sharedData;
|
OclSharedData &m_sharedData;
|
||||||
WorkerJob<1> m_job;
|
WorkerJob<1> m_job;
|
||||||
|
uint32_t m_deviceIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,10 +28,6 @@
|
||||||
#include "base/crypto/Algorithm.h"
|
#include "base/crypto/Algorithm.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
# include "backend/opencl/cl/cn/cryptonight_gpu_cl.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_RANDOMX
|
#ifdef XMRIG_ALGO_RANDOMX
|
||||||
# include "backend/opencl/cl/rx/randomx_cl.h"
|
# include "backend/opencl/cl/rx/randomx_cl.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -40,6 +36,11 @@
|
||||||
# include "backend/opencl/cl/astrobwt/astrobwt_cl.h"
|
# include "backend/opencl/cl/astrobwt/astrobwt_cl.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
# include "backend/opencl/cl/kawpow/kawpow_cl.h"
|
||||||
|
# include "backend/opencl/cl/kawpow/kawpow_dag_cl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
const char *xmrig::OclSource::get(const Algorithm &algorithm)
|
const char *xmrig::OclSource::get(const Algorithm &algorithm)
|
||||||
{
|
{
|
||||||
|
@ -55,9 +56,9 @@ const char *xmrig::OclSource::get(const Algorithm &algorithm)
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
# ifdef XMRIG_ALGO_KAWPOW
|
||||||
if (algorithm == Algorithm::CN_GPU) {
|
if (algorithm.family() == Algorithm::KAWPOW) {
|
||||||
return cryptonight_gpu_cl;
|
return kawpow_dag_cl;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
static char astrobwt_cl[12440] = {
|
static const char astrobwt_cl[12440] = {
|
||||||
0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x75,0x69,0x6e,0x74,0x38,0x5f,0x74,0x3b,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,
|
0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x75,0x69,0x6e,0x74,0x38,0x5f,0x74,0x3b,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,
|
||||||
0x73,0x68,0x6f,0x72,0x74,0x20,0x75,0x69,0x6e,0x74,0x31,0x36,0x5f,0x74,0x3b,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,0x69,0x6e,0x74,0x20,0x75,0x69,0x6e,
|
0x73,0x68,0x6f,0x72,0x74,0x20,0x75,0x69,0x6e,0x74,0x31,0x36,0x5f,0x74,0x3b,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,0x69,0x6e,0x74,0x20,0x75,0x69,0x6e,
|
||||||
0x74,0x33,0x32,0x5f,0x74,0x3b,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x75,0x69,0x6e,0x74,0x36,0x34,0x5f,0x74,0x3b,0x0a,0x74,
|
0x74,0x33,0x32,0x5f,0x74,0x3b,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x75,0x69,0x6e,0x74,0x36,0x34,0x5f,0x74,0x3b,0x0a,0x74,
|
||||||
|
|
|
@ -9,14 +9,14 @@
|
||||||
#define ALGO_CN_RWZ 8
|
#define ALGO_CN_RWZ 8
|
||||||
#define ALGO_CN_ZLS 9
|
#define ALGO_CN_ZLS 9
|
||||||
#define ALGO_CN_DOUBLE 10
|
#define ALGO_CN_DOUBLE 10
|
||||||
#define ALGO_CN_GPU 11
|
#define ALGO_CN_LITE_0 11
|
||||||
#define ALGO_CN_LITE_0 12
|
#define ALGO_CN_LITE_1 12
|
||||||
#define ALGO_CN_LITE_1 13
|
#define ALGO_CN_HEAVY_0 13
|
||||||
#define ALGO_CN_HEAVY_0 14
|
#define ALGO_CN_HEAVY_TUBE 14
|
||||||
#define ALGO_CN_HEAVY_TUBE 15
|
#define ALGO_CN_HEAVY_XHV 15
|
||||||
#define ALGO_CN_HEAVY_XHV 16
|
#define ALGO_CN_PICO_0 16
|
||||||
#define ALGO_CN_PICO_0 17
|
#define ALGO_CN_PICO_TLO 17
|
||||||
#define ALGO_CN_PICO_TLO 18
|
#define ALGO_CN_CCX 18
|
||||||
#define ALGO_RX_0 19
|
#define ALGO_RX_0 19
|
||||||
#define ALGO_RX_WOW 20
|
#define ALGO_RX_WOW 20
|
||||||
#define ALGO_RX_LOKI 21
|
#define ALGO_RX_LOKI 21
|
||||||
|
@ -26,6 +26,7 @@
|
||||||
#define ALGO_AR2_CHUKWA 25
|
#define ALGO_AR2_CHUKWA 25
|
||||||
#define ALGO_AR2_WRKZ 26
|
#define ALGO_AR2_WRKZ 26
|
||||||
#define ALGO_ASTROBWT_DERO 27
|
#define ALGO_ASTROBWT_DERO 27
|
||||||
|
#define ALGO_KAWPOW_RVN 28
|
||||||
|
|
||||||
#define FAMILY_UNKNOWN 0
|
#define FAMILY_UNKNOWN 0
|
||||||
#define FAMILY_CN 1
|
#define FAMILY_CN 1
|
||||||
|
@ -35,3 +36,4 @@
|
||||||
#define FAMILY_RANDOM_X 5
|
#define FAMILY_RANDOM_X 5
|
||||||
#define FAMILY_ARGON2 6
|
#define FAMILY_ARGON2 6
|
||||||
#define FAMILY_ASTROBWT 7
|
#define FAMILY_ASTROBWT 7
|
||||||
|
#define FAMILY_KAWPOW 8
|
||||||
|
|
|
@ -253,11 +253,34 @@ __kernel void cn1(__global ulong *input, __global uint4 *Scratchpad, __global ul
|
||||||
{
|
{
|
||||||
uint idx0 = a[0];
|
uint idx0 = a[0];
|
||||||
|
|
||||||
|
# if (ALGO == ALGO_CN_CCX)
|
||||||
|
float4 conc_var = (float4)(0.0f);
|
||||||
|
const uint4 conc_t = (uint4)(0x807FFFFFU);
|
||||||
|
const uint4 conc_u = (uint4)(0x40000000U);
|
||||||
|
const uint4 conc_v = (uint4)(0x4DFFFFFFU);
|
||||||
|
# endif
|
||||||
|
|
||||||
#pragma unroll CN_UNROLL
|
#pragma unroll CN_UNROLL
|
||||||
for (int i = 0; i < ITERATIONS; ++i) {
|
for (int i = 0; i < ITERATIONS; ++i) {
|
||||||
ulong c[2];
|
ulong c[2];
|
||||||
|
|
||||||
((uint4 *)c)[0] = Scratchpad[IDX((idx0 & MASK) >> 4)];
|
((uint4 *)c)[0] = Scratchpad[IDX((idx0 & MASK) >> 4)];
|
||||||
|
|
||||||
|
# if (ALGO == ALGO_CN_CCX)
|
||||||
|
{
|
||||||
|
float4 r = convert_float4_rte(((int4 *)c)[0]) + conc_var;
|
||||||
|
r = r * r * r;
|
||||||
|
r = as_float4((as_uint4(r) & conc_t) | conc_u);
|
||||||
|
|
||||||
|
float4 c_old = conc_var;
|
||||||
|
conc_var += r;
|
||||||
|
|
||||||
|
c_old = as_float4((as_uint4(c_old) & conc_t) | conc_u);
|
||||||
|
|
||||||
|
((int4 *)c)[0] ^= convert_int4_rtz(c_old * as_float4(conc_v));
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
((uint4 *)c)[0] = AES_Round_Two_Tables(AES0, AES1, ((uint4 *)c)[0], ((uint4 *)a)[0]);
|
((uint4 *)c)[0] = AES_Round_Two_Tables(AES0, AES1, ((uint4 *)c)[0], ((uint4 *)a)[0]);
|
||||||
|
|
||||||
Scratchpad[IDX((idx0 & MASK) >> 4)] = b_x ^ ((uint4 *)c)[0];
|
Scratchpad[IDX((idx0 & MASK) >> 4)] = b_x ^ ((uint4 *)c)[0];
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,520 +0,0 @@
|
||||||
#include "wolf-aes.cl"
|
|
||||||
#include "keccak.cl"
|
|
||||||
|
|
||||||
|
|
||||||
inline uint getIdx()
|
|
||||||
{
|
|
||||||
return get_global_id(0) - get_global_offset(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define IDX(x) (x)
|
|
||||||
|
|
||||||
|
|
||||||
inline float4 _mm_add_ps(float4 a, float4 b)
|
|
||||||
{
|
|
||||||
return a + b;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline float4 _mm_sub_ps(float4 a, float4 b)
|
|
||||||
{
|
|
||||||
return a - b;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline float4 _mm_mul_ps(float4 a, float4 b)
|
|
||||||
{
|
|
||||||
return a * b;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline float4 _mm_div_ps(float4 a, float4 b)
|
|
||||||
{
|
|
||||||
return a / b;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline float4 _mm_and_ps(float4 a, int b)
|
|
||||||
{
|
|
||||||
return as_float4(as_int4(a) & (int4)(b));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline float4 _mm_or_ps(float4 a, int b)
|
|
||||||
{
|
|
||||||
return as_float4(as_int4(a) | (int4)(b));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline float4 _mm_fmod_ps(float4 v, float dc)
|
|
||||||
{
|
|
||||||
float4 d = (float4)(dc);
|
|
||||||
float4 c = _mm_div_ps(v, d);
|
|
||||||
c = trunc(c);
|
|
||||||
c = _mm_mul_ps(c, d);
|
|
||||||
return _mm_sub_ps(v, c);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int4 _mm_xor_si128(int4 a, int4 b)
|
|
||||||
{
|
|
||||||
return a ^ b;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline float4 _mm_xor_ps(float4 a, int b)
|
|
||||||
{
|
|
||||||
return as_float4(as_int4(a) ^ (int4)(b));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int4 _mm_alignr_epi8(int4 a, const uint rot)
|
|
||||||
{
|
|
||||||
const uint right = 8 * rot;
|
|
||||||
const uint left = (32 - 8 * rot);
|
|
||||||
return (int4)(
|
|
||||||
((uint)a.x >> right) | ( a.y << left ),
|
|
||||||
((uint)a.y >> right) | ( a.z << left ),
|
|
||||||
((uint)a.z >> right) | ( a.w << left ),
|
|
||||||
((uint)a.w >> right) | ( a.x << left )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline global int4* scratchpad_ptr(uint idx, uint n, __global int *lpad) { return (__global int4*)((__global char*)lpad + (idx & MASK) + n * 16); }
|
|
||||||
|
|
||||||
|
|
||||||
inline float4 fma_break(float4 x)
|
|
||||||
{
|
|
||||||
// Break the dependency chain by setitng the exp to ?????01
|
|
||||||
x = _mm_and_ps(x, 0xFEFFFFFF);
|
|
||||||
return _mm_or_ps(x, 0x00800000);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline void sub_round(float4 n0, float4 n1, float4 n2, float4 n3, float4 rnd_c, float4* n, float4* d, float4* c)
|
|
||||||
{
|
|
||||||
n1 = _mm_add_ps(n1, *c);
|
|
||||||
float4 nn = _mm_mul_ps(n0, *c);
|
|
||||||
nn = _mm_mul_ps(n1, _mm_mul_ps(nn,nn));
|
|
||||||
nn = fma_break(nn);
|
|
||||||
*n = _mm_add_ps(*n, nn);
|
|
||||||
|
|
||||||
n3 = _mm_sub_ps(n3, *c);
|
|
||||||
float4 dd = _mm_mul_ps(n2, *c);
|
|
||||||
dd = _mm_mul_ps(n3, _mm_mul_ps(dd,dd));
|
|
||||||
dd = fma_break(dd);
|
|
||||||
*d = _mm_add_ps(*d, dd);
|
|
||||||
|
|
||||||
//Constant feedback
|
|
||||||
*c = _mm_add_ps(*c, rnd_c);
|
|
||||||
*c = _mm_add_ps(*c, (float4)(0.734375f));
|
|
||||||
float4 r = _mm_add_ps(nn, dd);
|
|
||||||
r = _mm_and_ps(r, 0x807FFFFF);
|
|
||||||
r = _mm_or_ps(r, 0x40000000);
|
|
||||||
*c = _mm_add_ps(*c, r);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 9*8 + 2 = 74
|
|
||||||
inline void round_compute(float4 n0, float4 n1, float4 n2, float4 n3, float4 rnd_c, float4* c, float4* r)
|
|
||||||
{
|
|
||||||
float4 n = (float4)(0.0f);
|
|
||||||
float4 d = (float4)(0.0f);
|
|
||||||
|
|
||||||
sub_round(n0, n1, n2, n3, rnd_c, &n, &d, c);
|
|
||||||
sub_round(n1, n2, n3, n0, rnd_c, &n, &d, c);
|
|
||||||
sub_round(n2, n3, n0, n1, rnd_c, &n, &d, c);
|
|
||||||
sub_round(n3, n0, n1, n2, rnd_c, &n, &d, c);
|
|
||||||
sub_round(n3, n2, n1, n0, rnd_c, &n, &d, c);
|
|
||||||
sub_round(n2, n1, n0, n3, rnd_c, &n, &d, c);
|
|
||||||
sub_round(n1, n0, n3, n2, rnd_c, &n, &d, c);
|
|
||||||
sub_round(n0, n3, n2, n1, rnd_c, &n, &d, c);
|
|
||||||
|
|
||||||
// Make sure abs(d) > 2.0 - this prevents division by zero and accidental overflows by division by < 1.0
|
|
||||||
d = _mm_and_ps(d, 0xFF7FFFFF);
|
|
||||||
d = _mm_or_ps(d, 0x40000000);
|
|
||||||
*r =_mm_add_ps(*r, _mm_div_ps(n,d));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int4 single_comupte(float4 n0, float4 n1, float4 n2, float4 n3, float cnt, float4 rnd_c, __local float4* sum)
|
|
||||||
{
|
|
||||||
float4 c= (float4)(cnt);
|
|
||||||
// 35 maths calls follow (140 FLOPS)
|
|
||||||
float4 r = (float4)(0.0f);
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; ++i) {
|
|
||||||
round_compute(n0, n1, n2, n3, rnd_c, &c, &r);
|
|
||||||
}
|
|
||||||
|
|
||||||
// do a quick fmod by setting exp to 2
|
|
||||||
r = _mm_and_ps(r, 0x807FFFFF);
|
|
||||||
r = _mm_or_ps(r, 0x40000000);
|
|
||||||
*sum = r; // 34
|
|
||||||
float4 x = (float4)(536870880.0f);
|
|
||||||
r = _mm_mul_ps(r, x); // 35
|
|
||||||
return convert_int4_rte(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline void single_comupte_wrap(const uint rot, int4 v0, int4 v1, int4 v2, int4 v3, float cnt, float4 rnd_c, __local float4* sum, __local int4* out)
|
|
||||||
{
|
|
||||||
float4 n0 = convert_float4_rte(v0);
|
|
||||||
float4 n1 = convert_float4_rte(v1);
|
|
||||||
float4 n2 = convert_float4_rte(v2);
|
|
||||||
float4 n3 = convert_float4_rte(v3);
|
|
||||||
|
|
||||||
int4 r = single_comupte(n0, n1, n2, n3, cnt, rnd_c, sum);
|
|
||||||
*out = rot == 0 ? r : _mm_alignr_epi8(r, rot);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static const __constant uint look[16][4] = {
|
|
||||||
{0, 1, 2, 3},
|
|
||||||
{0, 2, 3, 1},
|
|
||||||
{0, 3, 1, 2},
|
|
||||||
{0, 3, 2, 1},
|
|
||||||
|
|
||||||
{1, 0, 2, 3},
|
|
||||||
{1, 2, 3, 0},
|
|
||||||
{1, 3, 0, 2},
|
|
||||||
{1, 3, 2, 0},
|
|
||||||
|
|
||||||
{2, 1, 0, 3},
|
|
||||||
{2, 0, 3, 1},
|
|
||||||
{2, 3, 1, 0},
|
|
||||||
{2, 3, 0, 1},
|
|
||||||
|
|
||||||
{3, 1, 2, 0},
|
|
||||||
{3, 2, 0, 1},
|
|
||||||
{3, 0, 1, 2},
|
|
||||||
{3, 0, 2, 1}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static const __constant float ccnt[16] = {
|
|
||||||
1.34375f,
|
|
||||||
1.28125f,
|
|
||||||
1.359375f,
|
|
||||||
1.3671875f,
|
|
||||||
|
|
||||||
1.4296875f,
|
|
||||||
1.3984375f,
|
|
||||||
1.3828125f,
|
|
||||||
1.3046875f,
|
|
||||||
|
|
||||||
1.4140625f,
|
|
||||||
1.2734375f,
|
|
||||||
1.2578125f,
|
|
||||||
1.2890625f,
|
|
||||||
|
|
||||||
1.3203125f,
|
|
||||||
1.3515625f,
|
|
||||||
1.3359375f,
|
|
||||||
1.4609375f
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct SharedMemChunk
|
|
||||||
{
|
|
||||||
int4 out[16];
|
|
||||||
float4 va[16];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
__attribute__((reqd_work_group_size(WORKSIZE * 16, 1, 1)))
|
|
||||||
__kernel void cn1(__global int *lpad_in, __global int *spad, uint numThreads)
|
|
||||||
{
|
|
||||||
const uint gIdx = getIdx();
|
|
||||||
uint chunk = get_local_id(0) / 16;
|
|
||||||
|
|
||||||
__global int* lpad = (__global int*)((__global char*)lpad_in + MEMORY * (gIdx/16));
|
|
||||||
|
|
||||||
__local struct SharedMemChunk smem_in[WORKSIZE];
|
|
||||||
__local struct SharedMemChunk* smem = smem_in + chunk;
|
|
||||||
|
|
||||||
uint tid = get_local_id(0) % 16;
|
|
||||||
|
|
||||||
uint idxHash = gIdx/16;
|
|
||||||
uint s = ((__global uint*)spad)[idxHash * 50] >> 8;
|
|
||||||
float4 vs = (float4)(0);
|
|
||||||
|
|
||||||
// tid divided
|
|
||||||
const uint tidd = tid / 4;
|
|
||||||
// tid modulo
|
|
||||||
const uint tidm = tid % 4;
|
|
||||||
const uint block = tidd * 16 + tidm;
|
|
||||||
|
|
||||||
#pragma unroll CN_UNROLL
|
|
||||||
for (uint i = 0; i < ITERATIONS; i++) {
|
|
||||||
mem_fence(CLK_LOCAL_MEM_FENCE);
|
|
||||||
int tmp = ((__global int*)scratchpad_ptr(s, tidd, lpad))[tidm];
|
|
||||||
((__local int*)(smem->out))[tid] = tmp;
|
|
||||||
mem_fence(CLK_LOCAL_MEM_FENCE);
|
|
||||||
|
|
||||||
{
|
|
||||||
single_comupte_wrap(
|
|
||||||
tidm,
|
|
||||||
*(smem->out + look[tid][0]),
|
|
||||||
*(smem->out + look[tid][1]),
|
|
||||||
*(smem->out + look[tid][2]),
|
|
||||||
*(smem->out + look[tid][3]),
|
|
||||||
ccnt[tid], vs, smem->va + tid,
|
|
||||||
smem->out + tid
|
|
||||||
);
|
|
||||||
}
|
|
||||||
mem_fence(CLK_LOCAL_MEM_FENCE);
|
|
||||||
|
|
||||||
int outXor = ((__local int*)smem->out)[block];
|
|
||||||
for (uint dd = block + 4; dd < (tidd + 1) * 16; dd += 4) {
|
|
||||||
outXor ^= ((__local int*)smem->out)[dd];
|
|
||||||
}
|
|
||||||
|
|
||||||
((__global int*)scratchpad_ptr(s, tidd, lpad))[tidm] = outXor ^ tmp;
|
|
||||||
((__local int*)smem->out)[tid] = outXor;
|
|
||||||
|
|
||||||
float va_tmp1 = ((__local float*)smem->va)[block] + ((__local float*)smem->va)[block + 4];
|
|
||||||
float va_tmp2 = ((__local float*)smem->va)[block+ 8] + ((__local float*)smem->va)[block + 12];
|
|
||||||
((__local float*)smem->va)[tid] = va_tmp1 + va_tmp2;
|
|
||||||
|
|
||||||
mem_fence(CLK_LOCAL_MEM_FENCE);
|
|
||||||
|
|
||||||
int out2 = ((__local int*)smem->out)[tid] ^ ((__local int*)smem->out)[tid + 4 ] ^ ((__local int*)smem->out)[tid + 8] ^ ((__local int*)smem->out)[tid + 12];
|
|
||||||
va_tmp1 = ((__local float*)smem->va)[block] + ((__local float*)smem->va)[block + 4];
|
|
||||||
va_tmp2 = ((__local float*)smem->va)[block + 8] + ((__local float*)smem->va)[block + 12];
|
|
||||||
va_tmp1 = va_tmp1 + va_tmp2;
|
|
||||||
va_tmp1 = fabs(va_tmp1);
|
|
||||||
|
|
||||||
float xx = va_tmp1 * 16777216.0f;
|
|
||||||
int xx_int = (int)xx;
|
|
||||||
((__local int*)smem->out)[tid] = out2 ^ xx_int;
|
|
||||||
((__local float*)smem->va)[tid] = va_tmp1 / 64.0f;
|
|
||||||
|
|
||||||
mem_fence(CLK_LOCAL_MEM_FENCE);
|
|
||||||
|
|
||||||
vs = smem->va[0];
|
|
||||||
s = smem->out[0].x ^ smem->out[0].y ^ smem->out[0].z ^ smem->out[0].w;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static const __constant uint skip[3] = {
|
|
||||||
20,22,22
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
inline void generate_512(uint idx, __local ulong* in, __global ulong* out)
|
|
||||||
{
|
|
||||||
ulong hash[25];
|
|
||||||
|
|
||||||
hash[0] = in[0] ^ idx;
|
|
||||||
for (int i = 1; i < 25; ++i) {
|
|
||||||
hash[i] = in[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int a = 0; a < 3; ++a) {
|
|
||||||
keccakf1600_1(hash);
|
|
||||||
for (int i = 0; i < skip[a]; ++i) {
|
|
||||||
out[i] = hash[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
out += skip[a];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
__attribute__((reqd_work_group_size(8, 8, 1)))
|
|
||||||
__kernel void cn0(__global ulong *input, __global int *Scratchpad, __global ulong *states, uint Threads)
|
|
||||||
{
|
|
||||||
const uint gIdx = getIdx();
|
|
||||||
__local ulong State_buf[8 * 25];
|
|
||||||
__local ulong* State = State_buf + get_local_id(0) * 25;
|
|
||||||
|
|
||||||
{
|
|
||||||
states += 25 * gIdx;
|
|
||||||
|
|
||||||
Scratchpad = (__global int*)((__global char*)Scratchpad + MEMORY * gIdx);
|
|
||||||
|
|
||||||
if (get_local_id(1) == 0) {
|
|
||||||
|
|
||||||
# ifdef __NV_CL_C_VERSION
|
|
||||||
for(uint i = 0; i < 8; ++i)
|
|
||||||
State[i] = input[i];
|
|
||||||
# else
|
|
||||||
((__local ulong8 *)State)[0] = vload8(0, input);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
State[8] = input[8];
|
|
||||||
State[9] = input[9];
|
|
||||||
State[10] = input[10];
|
|
||||||
|
|
||||||
((__local uint *)State)[9] &= 0x00FFFFFFU;
|
|
||||||
((__local uint *)State)[9] |= (((uint)get_global_id(0)) & 0xFF) << 24;
|
|
||||||
((__local uint *)State)[10] &= 0xFF000000U;
|
|
||||||
/* explicit cast to `uint` is required because some OpenCL implementations (e.g. NVIDIA)
|
|
||||||
* handle get_global_id and get_global_offset as signed long long int and add
|
|
||||||
* 0xFFFFFFFF... to `get_global_id` if we set on host side a 32bit offset where the first bit is `1`
|
|
||||||
* (even if it is correct casted to unsigned on the host)
|
|
||||||
*/
|
|
||||||
((__local uint *)State)[10] |= (((uint)get_global_id(0) >> 8));
|
|
||||||
|
|
||||||
for (int i = 11; i < 25; ++i) {
|
|
||||||
State[i] = 0x00UL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Last bit of padding
|
|
||||||
State[16] = 0x8000000000000000UL;
|
|
||||||
|
|
||||||
keccakf1600_2(State);
|
|
||||||
|
|
||||||
#pragma unroll
|
|
||||||
for (int i = 0; i < 25; ++i) {
|
|
||||||
states[i] = State[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
__attribute__((reqd_work_group_size(64, 1, 1)))
|
|
||||||
__kernel void cn00(__global int *Scratchpad, __global ulong *states)
|
|
||||||
{
|
|
||||||
const uint gIdx = getIdx() / 64;
|
|
||||||
__local ulong State[25];
|
|
||||||
|
|
||||||
states += 25 * gIdx;
|
|
||||||
|
|
||||||
Scratchpad = (__global int*)((__global char*)Scratchpad + MEMORY * gIdx);
|
|
||||||
|
|
||||||
for (int i = get_local_id(0); i < 25; i += get_local_size(0)) {
|
|
||||||
State[i] = states[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
barrier(CLK_LOCAL_MEM_FENCE);
|
|
||||||
|
|
||||||
for (uint i = get_local_id(0); i < MEMORY / 512; i += get_local_size(0)) {
|
|
||||||
generate_512(i, State, (__global ulong*)((__global uchar*)Scratchpad + i * 512));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
__attribute__((reqd_work_group_size(8, 8, 1)))
|
|
||||||
__kernel void cn2(__global uint4 *Scratchpad, __global ulong *states, __global uint *output, ulong Target, uint Threads)
|
|
||||||
{
|
|
||||||
__local uint AES0[256], AES1[256], AES2[256], AES3[256];
|
|
||||||
uint ExpandedKey2[40];
|
|
||||||
uint4 text;
|
|
||||||
|
|
||||||
const uint gIdx = getIdx();
|
|
||||||
|
|
||||||
for (int i = get_local_id(1) * 8 + get_local_id(0); i < 256; i += 8 * 8) {
|
|
||||||
const uint tmp = AES0_C[i];
|
|
||||||
AES0[i] = tmp;
|
|
||||||
AES1[i] = rotate(tmp, 8U);
|
|
||||||
AES2[i] = rotate(tmp, 16U);
|
|
||||||
AES3[i] = rotate(tmp, 24U);
|
|
||||||
}
|
|
||||||
|
|
||||||
barrier(CLK_LOCAL_MEM_FENCE);
|
|
||||||
|
|
||||||
__local uint4 xin1[8][8];
|
|
||||||
__local uint4 xin2[8][8];
|
|
||||||
|
|
||||||
{
|
|
||||||
states += 25 * gIdx;
|
|
||||||
Scratchpad += gIdx * (MEMORY >> 4);
|
|
||||||
|
|
||||||
#if defined(__Tahiti__) || defined(__Pitcairn__)
|
|
||||||
for(int i = 0; i < 4; ++i) ((ulong *)ExpandedKey2)[i] = states[i + 4];
|
|
||||||
text = vload4(get_local_id(1) + 4, (__global uint *)states);
|
|
||||||
#else
|
|
||||||
text = vload4(get_local_id(1) + 4, (__global uint *)states);
|
|
||||||
((uint8 *)ExpandedKey2)[0] = vload8(1, (__global uint *)states);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
AESExpandKey256(ExpandedKey2);
|
|
||||||
}
|
|
||||||
|
|
||||||
barrier(CLK_LOCAL_MEM_FENCE);
|
|
||||||
|
|
||||||
__local uint4* xin1_store = &xin1[get_local_id(1)][get_local_id(0)];
|
|
||||||
__local uint4* xin1_load = &xin1[(get_local_id(1) + 1) % 8][get_local_id(0)];
|
|
||||||
__local uint4* xin2_store = &xin2[get_local_id(1)][get_local_id(0)];
|
|
||||||
__local uint4* xin2_load = &xin2[(get_local_id(1) + 1) % 8][get_local_id(0)];
|
|
||||||
*xin2_store = (uint4)(0, 0, 0, 0);
|
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
#pragma unroll 2
|
|
||||||
for (int i = 0, i1 = get_local_id(1); i < (MEMORY >> 7); ++i, i1 = (i1 + 16) % (MEMORY >> 4)) {
|
|
||||||
text ^= Scratchpad[(uint)i1];
|
|
||||||
barrier(CLK_LOCAL_MEM_FENCE);
|
|
||||||
text ^= *xin2_load;
|
|
||||||
|
|
||||||
#pragma unroll 10
|
|
||||||
for(int j = 0; j < 10; ++j)
|
|
||||||
text = AES_Round(AES0, AES1, AES2, AES3, text, ((uint4 *)ExpandedKey2)[j]);
|
|
||||||
|
|
||||||
*xin1_store = text;
|
|
||||||
|
|
||||||
text ^= Scratchpad[(uint)i1 + 8u];
|
|
||||||
barrier(CLK_LOCAL_MEM_FENCE);
|
|
||||||
text ^= *xin1_load;
|
|
||||||
|
|
||||||
#pragma unroll 10
|
|
||||||
for(int j = 0; j < 10; ++j)
|
|
||||||
text = AES_Round(AES0, AES1, AES2, AES3, text, ((uint4 *)ExpandedKey2)[j]);
|
|
||||||
|
|
||||||
*xin2_store = text;
|
|
||||||
}
|
|
||||||
|
|
||||||
barrier(CLK_LOCAL_MEM_FENCE);
|
|
||||||
text ^= *xin2_load;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Also left over threads performe this loop.
|
|
||||||
* The left over thread results will be ignored
|
|
||||||
*/
|
|
||||||
#pragma unroll 16
|
|
||||||
for(size_t i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
#pragma unroll 10
|
|
||||||
for (int j = 0; j < 10; ++j) {
|
|
||||||
text = AES_Round(AES0, AES1, AES2, AES3, text, ((uint4 *)ExpandedKey2)[j]);
|
|
||||||
}
|
|
||||||
|
|
||||||
barrier(CLK_LOCAL_MEM_FENCE);
|
|
||||||
*xin1_store = text;
|
|
||||||
barrier(CLK_LOCAL_MEM_FENCE);
|
|
||||||
text ^= *xin1_load;
|
|
||||||
}
|
|
||||||
|
|
||||||
__local ulong State_buf[8 * 25];
|
|
||||||
{
|
|
||||||
vstore2(as_ulong2(text), get_local_id(1) + 4, states);
|
|
||||||
}
|
|
||||||
|
|
||||||
barrier(CLK_GLOBAL_MEM_FENCE);
|
|
||||||
|
|
||||||
{
|
|
||||||
if(!get_local_id(1))
|
|
||||||
{
|
|
||||||
__local ulong* State = State_buf + get_local_id(0) * 25;
|
|
||||||
|
|
||||||
for(int i = 0; i < 25; ++i) State[i] = states[i];
|
|
||||||
|
|
||||||
keccakf1600_2(State);
|
|
||||||
|
|
||||||
if(State[3] <= Target)
|
|
||||||
{
|
|
||||||
ulong outIdx = atomic_inc(output + 0xFF);
|
|
||||||
if(outIdx < 0xFF)
|
|
||||||
output[outIdx] = get_global_id(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mem_fence(CLK_GLOBAL_MEM_FENCE);
|
|
||||||
}
|
|
|
@ -1,639 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
namespace xmrig {
|
|
||||||
|
|
||||||
static char cryptonight_gpu_cl[20166] = {
|
|
||||||
0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x57,0x4f,0x4c,0x46,0x5f,0x41,0x45,0x53,0x5f,0x43,0x4c,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x57,0x4f,0x4c,0x46,
|
|
||||||
0x5f,0x41,0x45,0x53,0x5f,0x43,0x4c,0x0a,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x63,0x6c,0x5f,0x61,0x6d,0x64,0x5f,0x6d,0x65,0x64,0x69,0x61,0x5f,0x6f,0x70,0x73,0x32,
|
|
||||||
0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x61,0x6d,0x64,
|
|
||||||
0x5f,0x6d,0x65,0x64,0x69,0x61,0x5f,0x6f,0x70,0x73,0x32,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x78,0x6d,0x72,
|
|
||||||
0x69,0x67,0x5f,0x61,0x6d,0x64,0x5f,0x62,0x66,0x65,0x28,0x73,0x72,0x63,0x30,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x73,0x72,0x63,0x32,0x29,0x20,0x61,0x6d,0x64,
|
|
||||||
0x5f,0x62,0x66,0x65,0x28,0x73,0x72,0x63,0x30,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x73,0x72,0x63,0x32,0x29,0x0a,0x23,0x65,0x6c,0x73,0x65,0x0a,0x69,0x6e,0x6c,
|
|
||||||
0x69,0x6e,0x65,0x20,0x69,0x6e,0x74,0x20,0x78,0x6d,0x72,0x69,0x67,0x5f,0x61,0x6d,0x64,0x5f,0x62,0x66,0x65,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,
|
|
||||||
0x20,0x73,0x72,0x63,0x30,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,
|
|
||||||
0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x0a,0x7b,0x0a,0x69,0x66,0x28,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x69,0x64,0x74,0x68,0x29,0x3c,0x33,0x32,
|
|
||||||
0x75,0x29,0x20,0x7b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x73,0x72,0x63,0x30,0x3c,0x3c,0x28,0x33,0x32,0x75,0x2d,0x6f,0x66,0x66,0x73,0x65,0x74,0x2d,0x77,
|
|
||||||
0x69,0x64,0x74,0x68,0x29,0x29,0x3e,0x3e,0x28,0x33,0x32,0x75,0x2d,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0x0a,0x7d,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x73,0x72,
|
|
||||||
0x63,0x30,0x3e,0x3e,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0x0a,0x7d,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,0x73,
|
|
||||||
0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x41,0x45,0x53,0x30,0x5f,0x43,0x5b,0x32,0x35,0x36,0x5d,0x20,0x3d,0x0a,
|
|
||||||
0x7b,0x0a,0x30,0x78,0x41,0x35,0x36,0x33,0x36,0x33,0x43,0x36,0x55,0x2c,0x30,0x78,0x38,0x34,0x37,0x43,0x37,0x43,0x46,0x38,0x55,0x2c,0x30,0x78,0x39,0x39,0x37,0x37,
|
|
||||||
0x37,0x37,0x45,0x45,0x55,0x2c,0x30,0x78,0x38,0x44,0x37,0x42,0x37,0x42,0x46,0x36,0x55,0x2c,0x0a,0x30,0x78,0x30,0x44,0x46,0x32,0x46,0x32,0x46,0x46,0x55,0x2c,0x30,
|
|
||||||
0x78,0x42,0x44,0x36,0x42,0x36,0x42,0x44,0x36,0x55,0x2c,0x30,0x78,0x42,0x31,0x36,0x46,0x36,0x46,0x44,0x45,0x55,0x2c,0x30,0x78,0x35,0x34,0x43,0x35,0x43,0x35,0x39,
|
|
||||||
0x31,0x55,0x2c,0x0a,0x30,0x78,0x35,0x30,0x33,0x30,0x33,0x30,0x36,0x30,0x55,0x2c,0x30,0x78,0x30,0x33,0x30,0x31,0x30,0x31,0x30,0x32,0x55,0x2c,0x30,0x78,0x41,0x39,
|
|
||||||
0x36,0x37,0x36,0x37,0x43,0x45,0x55,0x2c,0x30,0x78,0x37,0x44,0x32,0x42,0x32,0x42,0x35,0x36,0x55,0x2c,0x0a,0x30,0x78,0x31,0x39,0x46,0x45,0x46,0x45,0x45,0x37,0x55,
|
|
||||||
0x2c,0x30,0x78,0x36,0x32,0x44,0x37,0x44,0x37,0x42,0x35,0x55,0x2c,0x30,0x78,0x45,0x36,0x41,0x42,0x41,0x42,0x34,0x44,0x55,0x2c,0x30,0x78,0x39,0x41,0x37,0x36,0x37,
|
|
||||||
0x36,0x45,0x43,0x55,0x2c,0x0a,0x30,0x78,0x34,0x35,0x43,0x41,0x43,0x41,0x38,0x46,0x55,0x2c,0x30,0x78,0x39,0x44,0x38,0x32,0x38,0x32,0x31,0x46,0x55,0x2c,0x30,0x78,
|
|
||||||
0x34,0x30,0x43,0x39,0x43,0x39,0x38,0x39,0x55,0x2c,0x30,0x78,0x38,0x37,0x37,0x44,0x37,0x44,0x46,0x41,0x55,0x2c,0x0a,0x30,0x78,0x31,0x35,0x46,0x41,0x46,0x41,0x45,
|
|
||||||
0x46,0x55,0x2c,0x30,0x78,0x45,0x42,0x35,0x39,0x35,0x39,0x42,0x32,0x55,0x2c,0x30,0x78,0x43,0x39,0x34,0x37,0x34,0x37,0x38,0x45,0x55,0x2c,0x30,0x78,0x30,0x42,0x46,
|
|
||||||
0x30,0x46,0x30,0x46,0x42,0x55,0x2c,0x0a,0x30,0x78,0x45,0x43,0x41,0x44,0x41,0x44,0x34,0x31,0x55,0x2c,0x30,0x78,0x36,0x37,0x44,0x34,0x44,0x34,0x42,0x33,0x55,0x2c,
|
|
||||||
0x30,0x78,0x46,0x44,0x41,0x32,0x41,0x32,0x35,0x46,0x55,0x2c,0x30,0x78,0x45,0x41,0x41,0x46,0x41,0x46,0x34,0x35,0x55,0x2c,0x0a,0x30,0x78,0x42,0x46,0x39,0x43,0x39,
|
|
||||||
0x43,0x32,0x33,0x55,0x2c,0x30,0x78,0x46,0x37,0x41,0x34,0x41,0x34,0x35,0x33,0x55,0x2c,0x30,0x78,0x39,0x36,0x37,0x32,0x37,0x32,0x45,0x34,0x55,0x2c,0x30,0x78,0x35,
|
|
||||||
0x42,0x43,0x30,0x43,0x30,0x39,0x42,0x55,0x2c,0x0a,0x30,0x78,0x43,0x32,0x42,0x37,0x42,0x37,0x37,0x35,0x55,0x2c,0x30,0x78,0x31,0x43,0x46,0x44,0x46,0x44,0x45,0x31,
|
|
||||||
0x55,0x2c,0x30,0x78,0x41,0x45,0x39,0x33,0x39,0x33,0x33,0x44,0x55,0x2c,0x30,0x78,0x36,0x41,0x32,0x36,0x32,0x36,0x34,0x43,0x55,0x2c,0x0a,0x30,0x78,0x35,0x41,0x33,
|
|
||||||
0x36,0x33,0x36,0x36,0x43,0x55,0x2c,0x30,0x78,0x34,0x31,0x33,0x46,0x33,0x46,0x37,0x45,0x55,0x2c,0x30,0x78,0x30,0x32,0x46,0x37,0x46,0x37,0x46,0x35,0x55,0x2c,0x30,
|
|
||||||
0x78,0x34,0x46,0x43,0x43,0x43,0x43,0x38,0x33,0x55,0x2c,0x0a,0x30,0x78,0x35,0x43,0x33,0x34,0x33,0x34,0x36,0x38,0x55,0x2c,0x30,0x78,0x46,0x34,0x41,0x35,0x41,0x35,
|
|
||||||
0x35,0x31,0x55,0x2c,0x30,0x78,0x33,0x34,0x45,0x35,0x45,0x35,0x44,0x31,0x55,0x2c,0x30,0x78,0x30,0x38,0x46,0x31,0x46,0x31,0x46,0x39,0x55,0x2c,0x0a,0x30,0x78,0x39,
|
|
||||||
0x33,0x37,0x31,0x37,0x31,0x45,0x32,0x55,0x2c,0x30,0x78,0x37,0x33,0x44,0x38,0x44,0x38,0x41,0x42,0x55,0x2c,0x30,0x78,0x35,0x33,0x33,0x31,0x33,0x31,0x36,0x32,0x55,
|
|
||||||
0x2c,0x30,0x78,0x33,0x46,0x31,0x35,0x31,0x35,0x32,0x41,0x55,0x2c,0x0a,0x30,0x78,0x30,0x43,0x30,0x34,0x30,0x34,0x30,0x38,0x55,0x2c,0x30,0x78,0x35,0x32,0x43,0x37,
|
|
||||||
0x43,0x37,0x39,0x35,0x55,0x2c,0x30,0x78,0x36,0x35,0x32,0x33,0x32,0x33,0x34,0x36,0x55,0x2c,0x30,0x78,0x35,0x45,0x43,0x33,0x43,0x33,0x39,0x44,0x55,0x2c,0x0a,0x30,
|
|
||||||
0x78,0x32,0x38,0x31,0x38,0x31,0x38,0x33,0x30,0x55,0x2c,0x30,0x78,0x41,0x31,0x39,0x36,0x39,0x36,0x33,0x37,0x55,0x2c,0x30,0x78,0x30,0x46,0x30,0x35,0x30,0x35,0x30,
|
|
||||||
0x41,0x55,0x2c,0x30,0x78,0x42,0x35,0x39,0x41,0x39,0x41,0x32,0x46,0x55,0x2c,0x0a,0x30,0x78,0x30,0x39,0x30,0x37,0x30,0x37,0x30,0x45,0x55,0x2c,0x30,0x78,0x33,0x36,
|
|
||||||
0x31,0x32,0x31,0x32,0x32,0x34,0x55,0x2c,0x30,0x78,0x39,0x42,0x38,0x30,0x38,0x30,0x31,0x42,0x55,0x2c,0x30,0x78,0x33,0x44,0x45,0x32,0x45,0x32,0x44,0x46,0x55,0x2c,
|
|
||||||
0x0a,0x30,0x78,0x32,0x36,0x45,0x42,0x45,0x42,0x43,0x44,0x55,0x2c,0x30,0x78,0x36,0x39,0x32,0x37,0x32,0x37,0x34,0x45,0x55,0x2c,0x30,0x78,0x43,0x44,0x42,0x32,0x42,
|
|
||||||
0x32,0x37,0x46,0x55,0x2c,0x30,0x78,0x39,0x46,0x37,0x35,0x37,0x35,0x45,0x41,0x55,0x2c,0x0a,0x30,0x78,0x31,0x42,0x30,0x39,0x30,0x39,0x31,0x32,0x55,0x2c,0x30,0x78,
|
|
||||||
0x39,0x45,0x38,0x33,0x38,0x33,0x31,0x44,0x55,0x2c,0x30,0x78,0x37,0x34,0x32,0x43,0x32,0x43,0x35,0x38,0x55,0x2c,0x30,0x78,0x32,0x45,0x31,0x41,0x31,0x41,0x33,0x34,
|
|
||||||
0x55,0x2c,0x0a,0x30,0x78,0x32,0x44,0x31,0x42,0x31,0x42,0x33,0x36,0x55,0x2c,0x30,0x78,0x42,0x32,0x36,0x45,0x36,0x45,0x44,0x43,0x55,0x2c,0x30,0x78,0x45,0x45,0x35,
|
|
||||||
0x41,0x35,0x41,0x42,0x34,0x55,0x2c,0x30,0x78,0x46,0x42,0x41,0x30,0x41,0x30,0x35,0x42,0x55,0x2c,0x0a,0x30,0x78,0x46,0x36,0x35,0x32,0x35,0x32,0x41,0x34,0x55,0x2c,
|
|
||||||
0x30,0x78,0x34,0x44,0x33,0x42,0x33,0x42,0x37,0x36,0x55,0x2c,0x30,0x78,0x36,0x31,0x44,0x36,0x44,0x36,0x42,0x37,0x55,0x2c,0x30,0x78,0x43,0x45,0x42,0x33,0x42,0x33,
|
|
||||||
0x37,0x44,0x55,0x2c,0x0a,0x30,0x78,0x37,0x42,0x32,0x39,0x32,0x39,0x35,0x32,0x55,0x2c,0x30,0x78,0x33,0x45,0x45,0x33,0x45,0x33,0x44,0x44,0x55,0x2c,0x30,0x78,0x37,
|
|
||||||
0x31,0x32,0x46,0x32,0x46,0x35,0x45,0x55,0x2c,0x30,0x78,0x39,0x37,0x38,0x34,0x38,0x34,0x31,0x33,0x55,0x2c,0x0a,0x30,0x78,0x46,0x35,0x35,0x33,0x35,0x33,0x41,0x36,
|
|
||||||
0x55,0x2c,0x30,0x78,0x36,0x38,0x44,0x31,0x44,0x31,0x42,0x39,0x55,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x55,0x2c,0x30,0x78,0x32,0x43,0x45,0x44,
|
|
||||||
0x45,0x44,0x43,0x31,0x55,0x2c,0x0a,0x30,0x78,0x36,0x30,0x32,0x30,0x32,0x30,0x34,0x30,0x55,0x2c,0x30,0x78,0x31,0x46,0x46,0x43,0x46,0x43,0x45,0x33,0x55,0x2c,0x30,
|
|
||||||
0x78,0x43,0x38,0x42,0x31,0x42,0x31,0x37,0x39,0x55,0x2c,0x30,0x78,0x45,0x44,0x35,0x42,0x35,0x42,0x42,0x36,0x55,0x2c,0x0a,0x30,0x78,0x42,0x45,0x36,0x41,0x36,0x41,
|
|
||||||
0x44,0x34,0x55,0x2c,0x30,0x78,0x34,0x36,0x43,0x42,0x43,0x42,0x38,0x44,0x55,0x2c,0x30,0x78,0x44,0x39,0x42,0x45,0x42,0x45,0x36,0x37,0x55,0x2c,0x30,0x78,0x34,0x42,
|
|
||||||
0x33,0x39,0x33,0x39,0x37,0x32,0x55,0x2c,0x0a,0x30,0x78,0x44,0x45,0x34,0x41,0x34,0x41,0x39,0x34,0x55,0x2c,0x30,0x78,0x44,0x34,0x34,0x43,0x34,0x43,0x39,0x38,0x55,
|
|
||||||
0x2c,0x30,0x78,0x45,0x38,0x35,0x38,0x35,0x38,0x42,0x30,0x55,0x2c,0x30,0x78,0x34,0x41,0x43,0x46,0x43,0x46,0x38,0x35,0x55,0x2c,0x0a,0x30,0x78,0x36,0x42,0x44,0x30,
|
|
||||||
0x44,0x30,0x42,0x42,0x55,0x2c,0x30,0x78,0x32,0x41,0x45,0x46,0x45,0x46,0x43,0x35,0x55,0x2c,0x30,0x78,0x45,0x35,0x41,0x41,0x41,0x41,0x34,0x46,0x55,0x2c,0x30,0x78,
|
|
||||||
0x31,0x36,0x46,0x42,0x46,0x42,0x45,0x44,0x55,0x2c,0x0a,0x30,0x78,0x43,0x35,0x34,0x33,0x34,0x33,0x38,0x36,0x55,0x2c,0x30,0x78,0x44,0x37,0x34,0x44,0x34,0x44,0x39,
|
|
||||||
0x41,0x55,0x2c,0x30,0x78,0x35,0x35,0x33,0x33,0x33,0x33,0x36,0x36,0x55,0x2c,0x30,0x78,0x39,0x34,0x38,0x35,0x38,0x35,0x31,0x31,0x55,0x2c,0x0a,0x30,0x78,0x43,0x46,
|
|
||||||
0x34,0x35,0x34,0x35,0x38,0x41,0x55,0x2c,0x30,0x78,0x31,0x30,0x46,0x39,0x46,0x39,0x45,0x39,0x55,0x2c,0x30,0x78,0x30,0x36,0x30,0x32,0x30,0x32,0x30,0x34,0x55,0x2c,
|
|
||||||
0x30,0x78,0x38,0x31,0x37,0x46,0x37,0x46,0x46,0x45,0x55,0x2c,0x0a,0x30,0x78,0x46,0x30,0x35,0x30,0x35,0x30,0x41,0x30,0x55,0x2c,0x30,0x78,0x34,0x34,0x33,0x43,0x33,
|
|
||||||
0x43,0x37,0x38,0x55,0x2c,0x30,0x78,0x42,0x41,0x39,0x46,0x39,0x46,0x32,0x35,0x55,0x2c,0x30,0x78,0x45,0x33,0x41,0x38,0x41,0x38,0x34,0x42,0x55,0x2c,0x0a,0x30,0x78,
|
|
||||||
0x46,0x33,0x35,0x31,0x35,0x31,0x41,0x32,0x55,0x2c,0x30,0x78,0x46,0x45,0x41,0x33,0x41,0x33,0x35,0x44,0x55,0x2c,0x30,0x78,0x43,0x30,0x34,0x30,0x34,0x30,0x38,0x30,
|
|
||||||
0x55,0x2c,0x30,0x78,0x38,0x41,0x38,0x46,0x38,0x46,0x30,0x35,0x55,0x2c,0x0a,0x30,0x78,0x41,0x44,0x39,0x32,0x39,0x32,0x33,0x46,0x55,0x2c,0x30,0x78,0x42,0x43,0x39,
|
|
||||||
0x44,0x39,0x44,0x32,0x31,0x55,0x2c,0x30,0x78,0x34,0x38,0x33,0x38,0x33,0x38,0x37,0x30,0x55,0x2c,0x30,0x78,0x30,0x34,0x46,0x35,0x46,0x35,0x46,0x31,0x55,0x2c,0x0a,
|
|
||||||
0x30,0x78,0x44,0x46,0x42,0x43,0x42,0x43,0x36,0x33,0x55,0x2c,0x30,0x78,0x43,0x31,0x42,0x36,0x42,0x36,0x37,0x37,0x55,0x2c,0x30,0x78,0x37,0x35,0x44,0x41,0x44,0x41,
|
|
||||||
0x41,0x46,0x55,0x2c,0x30,0x78,0x36,0x33,0x32,0x31,0x32,0x31,0x34,0x32,0x55,0x2c,0x0a,0x30,0x78,0x33,0x30,0x31,0x30,0x31,0x30,0x32,0x30,0x55,0x2c,0x30,0x78,0x31,
|
|
||||||
0x41,0x46,0x46,0x46,0x46,0x45,0x35,0x55,0x2c,0x30,0x78,0x30,0x45,0x46,0x33,0x46,0x33,0x46,0x44,0x55,0x2c,0x30,0x78,0x36,0x44,0x44,0x32,0x44,0x32,0x42,0x46,0x55,
|
|
||||||
0x2c,0x0a,0x30,0x78,0x34,0x43,0x43,0x44,0x43,0x44,0x38,0x31,0x55,0x2c,0x30,0x78,0x31,0x34,0x30,0x43,0x30,0x43,0x31,0x38,0x55,0x2c,0x30,0x78,0x33,0x35,0x31,0x33,
|
|
||||||
0x31,0x33,0x32,0x36,0x55,0x2c,0x30,0x78,0x32,0x46,0x45,0x43,0x45,0x43,0x43,0x33,0x55,0x2c,0x0a,0x30,0x78,0x45,0x31,0x35,0x46,0x35,0x46,0x42,0x45,0x55,0x2c,0x30,
|
|
||||||
0x78,0x41,0x32,0x39,0x37,0x39,0x37,0x33,0x35,0x55,0x2c,0x30,0x78,0x43,0x43,0x34,0x34,0x34,0x34,0x38,0x38,0x55,0x2c,0x30,0x78,0x33,0x39,0x31,0x37,0x31,0x37,0x32,
|
|
||||||
0x45,0x55,0x2c,0x0a,0x30,0x78,0x35,0x37,0x43,0x34,0x43,0x34,0x39,0x33,0x55,0x2c,0x30,0x78,0x46,0x32,0x41,0x37,0x41,0x37,0x35,0x35,0x55,0x2c,0x30,0x78,0x38,0x32,
|
|
||||||
0x37,0x45,0x37,0x45,0x46,0x43,0x55,0x2c,0x30,0x78,0x34,0x37,0x33,0x44,0x33,0x44,0x37,0x41,0x55,0x2c,0x0a,0x30,0x78,0x41,0x43,0x36,0x34,0x36,0x34,0x43,0x38,0x55,
|
|
||||||
0x2c,0x30,0x78,0x45,0x37,0x35,0x44,0x35,0x44,0x42,0x41,0x55,0x2c,0x30,0x78,0x32,0x42,0x31,0x39,0x31,0x39,0x33,0x32,0x55,0x2c,0x30,0x78,0x39,0x35,0x37,0x33,0x37,
|
|
||||||
0x33,0x45,0x36,0x55,0x2c,0x0a,0x30,0x78,0x41,0x30,0x36,0x30,0x36,0x30,0x43,0x30,0x55,0x2c,0x30,0x78,0x39,0x38,0x38,0x31,0x38,0x31,0x31,0x39,0x55,0x2c,0x30,0x78,
|
|
||||||
0x44,0x31,0x34,0x46,0x34,0x46,0x39,0x45,0x55,0x2c,0x30,0x78,0x37,0x46,0x44,0x43,0x44,0x43,0x41,0x33,0x55,0x2c,0x0a,0x30,0x78,0x36,0x36,0x32,0x32,0x32,0x32,0x34,
|
|
||||||
0x34,0x55,0x2c,0x30,0x78,0x37,0x45,0x32,0x41,0x32,0x41,0x35,0x34,0x55,0x2c,0x30,0x78,0x41,0x42,0x39,0x30,0x39,0x30,0x33,0x42,0x55,0x2c,0x30,0x78,0x38,0x33,0x38,
|
|
||||||
0x38,0x38,0x38,0x30,0x42,0x55,0x2c,0x0a,0x30,0x78,0x43,0x41,0x34,0x36,0x34,0x36,0x38,0x43,0x55,0x2c,0x30,0x78,0x32,0x39,0x45,0x45,0x45,0x45,0x43,0x37,0x55,0x2c,
|
|
||||||
0x30,0x78,0x44,0x33,0x42,0x38,0x42,0x38,0x36,0x42,0x55,0x2c,0x30,0x78,0x33,0x43,0x31,0x34,0x31,0x34,0x32,0x38,0x55,0x2c,0x0a,0x30,0x78,0x37,0x39,0x44,0x45,0x44,
|
|
||||||
0x45,0x41,0x37,0x55,0x2c,0x30,0x78,0x45,0x32,0x35,0x45,0x35,0x45,0x42,0x43,0x55,0x2c,0x30,0x78,0x31,0x44,0x30,0x42,0x30,0x42,0x31,0x36,0x55,0x2c,0x30,0x78,0x37,
|
|
||||||
0x36,0x44,0x42,0x44,0x42,0x41,0x44,0x55,0x2c,0x0a,0x30,0x78,0x33,0x42,0x45,0x30,0x45,0x30,0x44,0x42,0x55,0x2c,0x30,0x78,0x35,0x36,0x33,0x32,0x33,0x32,0x36,0x34,
|
|
||||||
0x55,0x2c,0x30,0x78,0x34,0x45,0x33,0x41,0x33,0x41,0x37,0x34,0x55,0x2c,0x30,0x78,0x31,0x45,0x30,0x41,0x30,0x41,0x31,0x34,0x55,0x2c,0x0a,0x30,0x78,0x44,0x42,0x34,
|
|
||||||
0x39,0x34,0x39,0x39,0x32,0x55,0x2c,0x30,0x78,0x30,0x41,0x30,0x36,0x30,0x36,0x30,0x43,0x55,0x2c,0x30,0x78,0x36,0x43,0x32,0x34,0x32,0x34,0x34,0x38,0x55,0x2c,0x30,
|
|
||||||
0x78,0x45,0x34,0x35,0x43,0x35,0x43,0x42,0x38,0x55,0x2c,0x0a,0x30,0x78,0x35,0x44,0x43,0x32,0x43,0x32,0x39,0x46,0x55,0x2c,0x30,0x78,0x36,0x45,0x44,0x33,0x44,0x33,
|
|
||||||
0x42,0x44,0x55,0x2c,0x30,0x78,0x45,0x46,0x41,0x43,0x41,0x43,0x34,0x33,0x55,0x2c,0x30,0x78,0x41,0x36,0x36,0x32,0x36,0x32,0x43,0x34,0x55,0x2c,0x0a,0x30,0x78,0x41,
|
|
||||||
0x38,0x39,0x31,0x39,0x31,0x33,0x39,0x55,0x2c,0x30,0x78,0x41,0x34,0x39,0x35,0x39,0x35,0x33,0x31,0x55,0x2c,0x30,0x78,0x33,0x37,0x45,0x34,0x45,0x34,0x44,0x33,0x55,
|
|
||||||
0x2c,0x30,0x78,0x38,0x42,0x37,0x39,0x37,0x39,0x46,0x32,0x55,0x2c,0x0a,0x30,0x78,0x33,0x32,0x45,0x37,0x45,0x37,0x44,0x35,0x55,0x2c,0x30,0x78,0x34,0x33,0x43,0x38,
|
|
||||||
0x43,0x38,0x38,0x42,0x55,0x2c,0x30,0x78,0x35,0x39,0x33,0x37,0x33,0x37,0x36,0x45,0x55,0x2c,0x30,0x78,0x42,0x37,0x36,0x44,0x36,0x44,0x44,0x41,0x55,0x2c,0x0a,0x30,
|
|
||||||
0x78,0x38,0x43,0x38,0x44,0x38,0x44,0x30,0x31,0x55,0x2c,0x30,0x78,0x36,0x34,0x44,0x35,0x44,0x35,0x42,0x31,0x55,0x2c,0x30,0x78,0x44,0x32,0x34,0x45,0x34,0x45,0x39,
|
|
||||||
0x43,0x55,0x2c,0x30,0x78,0x45,0x30,0x41,0x39,0x41,0x39,0x34,0x39,0x55,0x2c,0x0a,0x30,0x78,0x42,0x34,0x36,0x43,0x36,0x43,0x44,0x38,0x55,0x2c,0x30,0x78,0x46,0x41,
|
|
||||||
0x35,0x36,0x35,0x36,0x41,0x43,0x55,0x2c,0x30,0x78,0x30,0x37,0x46,0x34,0x46,0x34,0x46,0x33,0x55,0x2c,0x30,0x78,0x32,0x35,0x45,0x41,0x45,0x41,0x43,0x46,0x55,0x2c,
|
|
||||||
0x0a,0x30,0x78,0x41,0x46,0x36,0x35,0x36,0x35,0x43,0x41,0x55,0x2c,0x30,0x78,0x38,0x45,0x37,0x41,0x37,0x41,0x46,0x34,0x55,0x2c,0x30,0x78,0x45,0x39,0x41,0x45,0x41,
|
|
||||||
0x45,0x34,0x37,0x55,0x2c,0x30,0x78,0x31,0x38,0x30,0x38,0x30,0x38,0x31,0x30,0x55,0x2c,0x0a,0x30,0x78,0x44,0x35,0x42,0x41,0x42,0x41,0x36,0x46,0x55,0x2c,0x30,0x78,
|
|
||||||
0x38,0x38,0x37,0x38,0x37,0x38,0x46,0x30,0x55,0x2c,0x30,0x78,0x36,0x46,0x32,0x35,0x32,0x35,0x34,0x41,0x55,0x2c,0x30,0x78,0x37,0x32,0x32,0x45,0x32,0x45,0x35,0x43,
|
|
||||||
0x55,0x2c,0x0a,0x30,0x78,0x32,0x34,0x31,0x43,0x31,0x43,0x33,0x38,0x55,0x2c,0x30,0x78,0x46,0x31,0x41,0x36,0x41,0x36,0x35,0x37,0x55,0x2c,0x30,0x78,0x43,0x37,0x42,
|
|
||||||
0x34,0x42,0x34,0x37,0x33,0x55,0x2c,0x30,0x78,0x35,0x31,0x43,0x36,0x43,0x36,0x39,0x37,0x55,0x2c,0x0a,0x30,0x78,0x32,0x33,0x45,0x38,0x45,0x38,0x43,0x42,0x55,0x2c,
|
|
||||||
0x30,0x78,0x37,0x43,0x44,0x44,0x44,0x44,0x41,0x31,0x55,0x2c,0x30,0x78,0x39,0x43,0x37,0x34,0x37,0x34,0x45,0x38,0x55,0x2c,0x30,0x78,0x32,0x31,0x31,0x46,0x31,0x46,
|
|
||||||
0x33,0x45,0x55,0x2c,0x0a,0x30,0x78,0x44,0x44,0x34,0x42,0x34,0x42,0x39,0x36,0x55,0x2c,0x30,0x78,0x44,0x43,0x42,0x44,0x42,0x44,0x36,0x31,0x55,0x2c,0x30,0x78,0x38,
|
|
||||||
0x36,0x38,0x42,0x38,0x42,0x30,0x44,0x55,0x2c,0x30,0x78,0x38,0x35,0x38,0x41,0x38,0x41,0x30,0x46,0x55,0x2c,0x0a,0x30,0x78,0x39,0x30,0x37,0x30,0x37,0x30,0x45,0x30,
|
|
||||||
0x55,0x2c,0x30,0x78,0x34,0x32,0x33,0x45,0x33,0x45,0x37,0x43,0x55,0x2c,0x30,0x78,0x43,0x34,0x42,0x35,0x42,0x35,0x37,0x31,0x55,0x2c,0x30,0x78,0x41,0x41,0x36,0x36,
|
|
||||||
0x36,0x36,0x43,0x43,0x55,0x2c,0x0a,0x30,0x78,0x44,0x38,0x34,0x38,0x34,0x38,0x39,0x30,0x55,0x2c,0x30,0x78,0x30,0x35,0x30,0x33,0x30,0x33,0x30,0x36,0x55,0x2c,0x30,
|
|
||||||
0x78,0x30,0x31,0x46,0x36,0x46,0x36,0x46,0x37,0x55,0x2c,0x30,0x78,0x31,0x32,0x30,0x45,0x30,0x45,0x31,0x43,0x55,0x2c,0x0a,0x30,0x78,0x41,0x33,0x36,0x31,0x36,0x31,
|
|
||||||
0x43,0x32,0x55,0x2c,0x30,0x78,0x35,0x46,0x33,0x35,0x33,0x35,0x36,0x41,0x55,0x2c,0x30,0x78,0x46,0x39,0x35,0x37,0x35,0x37,0x41,0x45,0x55,0x2c,0x30,0x78,0x44,0x30,
|
|
||||||
0x42,0x39,0x42,0x39,0x36,0x39,0x55,0x2c,0x0a,0x30,0x78,0x39,0x31,0x38,0x36,0x38,0x36,0x31,0x37,0x55,0x2c,0x30,0x78,0x35,0x38,0x43,0x31,0x43,0x31,0x39,0x39,0x55,
|
|
||||||
0x2c,0x30,0x78,0x32,0x37,0x31,0x44,0x31,0x44,0x33,0x41,0x55,0x2c,0x30,0x78,0x42,0x39,0x39,0x45,0x39,0x45,0x32,0x37,0x55,0x2c,0x0a,0x30,0x78,0x33,0x38,0x45,0x31,
|
|
||||||
0x45,0x31,0x44,0x39,0x55,0x2c,0x30,0x78,0x31,0x33,0x46,0x38,0x46,0x38,0x45,0x42,0x55,0x2c,0x30,0x78,0x42,0x33,0x39,0x38,0x39,0x38,0x32,0x42,0x55,0x2c,0x30,0x78,
|
|
||||||
0x33,0x33,0x31,0x31,0x31,0x31,0x32,0x32,0x55,0x2c,0x0a,0x30,0x78,0x42,0x42,0x36,0x39,0x36,0x39,0x44,0x32,0x55,0x2c,0x30,0x78,0x37,0x30,0x44,0x39,0x44,0x39,0x41,
|
|
||||||
0x39,0x55,0x2c,0x30,0x78,0x38,0x39,0x38,0x45,0x38,0x45,0x30,0x37,0x55,0x2c,0x30,0x78,0x41,0x37,0x39,0x34,0x39,0x34,0x33,0x33,0x55,0x2c,0x0a,0x30,0x78,0x42,0x36,
|
|
||||||
0x39,0x42,0x39,0x42,0x32,0x44,0x55,0x2c,0x30,0x78,0x32,0x32,0x31,0x45,0x31,0x45,0x33,0x43,0x55,0x2c,0x30,0x78,0x39,0x32,0x38,0x37,0x38,0x37,0x31,0x35,0x55,0x2c,
|
|
||||||
0x30,0x78,0x32,0x30,0x45,0x39,0x45,0x39,0x43,0x39,0x55,0x2c,0x0a,0x30,0x78,0x34,0x39,0x43,0x45,0x43,0x45,0x38,0x37,0x55,0x2c,0x30,0x78,0x46,0x46,0x35,0x35,0x35,
|
|
||||||
0x35,0x41,0x41,0x55,0x2c,0x30,0x78,0x37,0x38,0x32,0x38,0x32,0x38,0x35,0x30,0x55,0x2c,0x30,0x78,0x37,0x41,0x44,0x46,0x44,0x46,0x41,0x35,0x55,0x2c,0x0a,0x30,0x78,
|
|
||||||
0x38,0x46,0x38,0x43,0x38,0x43,0x30,0x33,0x55,0x2c,0x30,0x78,0x46,0x38,0x41,0x31,0x41,0x31,0x35,0x39,0x55,0x2c,0x30,0x78,0x38,0x30,0x38,0x39,0x38,0x39,0x30,0x39,
|
|
||||||
0x55,0x2c,0x30,0x78,0x31,0x37,0x30,0x44,0x30,0x44,0x31,0x41,0x55,0x2c,0x0a,0x30,0x78,0x44,0x41,0x42,0x46,0x42,0x46,0x36,0x35,0x55,0x2c,0x30,0x78,0x33,0x31,0x45,
|
|
||||||
0x36,0x45,0x36,0x44,0x37,0x55,0x2c,0x30,0x78,0x43,0x36,0x34,0x32,0x34,0x32,0x38,0x34,0x55,0x2c,0x30,0x78,0x42,0x38,0x36,0x38,0x36,0x38,0x44,0x30,0x55,0x2c,0x0a,
|
|
||||||
0x30,0x78,0x43,0x33,0x34,0x31,0x34,0x31,0x38,0x32,0x55,0x2c,0x30,0x78,0x42,0x30,0x39,0x39,0x39,0x39,0x32,0x39,0x55,0x2c,0x30,0x78,0x37,0x37,0x32,0x44,0x32,0x44,
|
|
||||||
0x35,0x41,0x55,0x2c,0x30,0x78,0x31,0x31,0x30,0x46,0x30,0x46,0x31,0x45,0x55,0x2c,0x0a,0x30,0x78,0x43,0x42,0x42,0x30,0x42,0x30,0x37,0x42,0x55,0x2c,0x30,0x78,0x46,
|
|
||||||
0x43,0x35,0x34,0x35,0x34,0x41,0x38,0x55,0x2c,0x30,0x78,0x44,0x36,0x42,0x42,0x42,0x42,0x36,0x44,0x55,0x2c,0x30,0x78,0x33,0x41,0x31,0x36,0x31,0x36,0x32,0x43,0x55,
|
|
||||||
0x0a,0x7d,0x3b,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x42,0x59,0x54,0x45,0x28,0x78,0x2c,0x20,0x79,0x29,0x20,0x28,0x78,0x6d,0x72,0x69,0x67,0x5f,0x61,0x6d,
|
|
||||||
0x64,0x5f,0x62,0x66,0x65,0x28,0x28,0x78,0x29,0x2c,0x20,0x28,0x79,0x29,0x20,0x3c,0x3c,0x20,0x33,0x55,0x2c,0x20,0x38,0x55,0x29,0x29,0x0a,0x23,0x69,0x66,0x20,0x28,
|
|
||||||
0x41,0x4c,0x47,0x4f,0x20,0x3d,0x3d,0x20,0x41,0x4c,0x47,0x4f,0x5f,0x43,0x4e,0x5f,0x48,0x45,0x41,0x56,0x59,0x5f,0x54,0x55,0x42,0x45,0x29,0x0a,0x69,0x6e,0x6c,0x69,
|
|
||||||
0x6e,0x65,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x41,0x45,0x53,0x5f,0x52,0x6f,0x75,0x6e,0x64,0x5f,0x62,0x69,0x74,0x74,0x75,0x62,0x65,0x32,0x28,0x63,0x6f,0x6e,0x73,
|
|
||||||
0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x30,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,
|
|
||||||
0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x31,0x2c,0x75,0x69,0x6e,0x74,0x34,0x20,0x78,0x2c,0x75,0x69,0x6e,0x74,0x34,0x20,0x6b,0x29,0x0a,0x7b,
|
|
||||||
0x0a,0x78,0x3d,0x7e,0x78,0x3b,0x0a,0x6b,0x2e,0x73,0x30,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x30,0x2c,0x30,0x29,
|
|
||||||
0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x31,0x2c,0x31,0x29,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,
|
|
||||||
0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x32,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x33,0x2c,0x33,0x29,
|
|
||||||
0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x78,0x2e,0x73,0x30,0x20,0x5e,0x3d,0x20,0x6b,0x2e,0x73,0x30,0x3b,0x0a,0x6b,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x41,0x45,
|
|
||||||
0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x31,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x32,0x2c,
|
|
||||||
0x31,0x29,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x33,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,
|
|
||||||
0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x30,0x2c,0x33,0x29,0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x78,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x6b,
|
|
||||||
0x2e,0x73,0x31,0x3b,0x0a,0x6b,0x2e,0x73,0x32,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x32,0x2c,0x30,0x29,0x5d,0x5e,
|
|
||||||
0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x33,0x2c,0x31,0x29,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,
|
|
||||||
0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x30,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x31,0x2c,0x33,0x29,0x5d,0x2c,
|
|
||||||
0x31,0x36,0x55,0x29,0x3b,0x0a,0x78,0x2e,0x73,0x32,0x20,0x5e,0x3d,0x20,0x6b,0x2e,0x73,0x32,0x3b,0x0a,0x6b,0x2e,0x73,0x33,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,
|
|
||||||
0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x33,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x30,0x2c,0x31,0x29,
|
|
||||||
0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x31,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,
|
|
||||||
0x5b,0x42,0x59,0x54,0x45,0x28,0x78,0x2e,0x73,0x32,0x2c,0x33,0x29,0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6b,0x3b,0x0a,0x7d,
|
|
||||||
0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x75,0x69,0x6e,0x74,0x34,0x20,0x41,0x45,0x53,0x5f,0x52,0x6f,0x75,0x6e,0x64,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,
|
|
||||||
0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x30,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,
|
|
||||||
0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x31,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,
|
|
||||||
0x53,0x32,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x33,0x2c,0x63,0x6f,0x6e,0x73,
|
|
||||||
0x74,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x58,0x2c,0x75,0x69,0x6e,0x74,0x34,0x20,0x6b,0x65,0x79,0x29,0x0a,0x7b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x30,0x20,0x5e,0x3d,
|
|
||||||
0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,
|
|
||||||
0x73,0x31,0x2c,0x31,0x29,0x5d,0x5e,0x41,0x45,0x53,0x32,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x33,0x5b,0x42,
|
|
||||||
0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x33,0x29,0x5d,0x3b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,
|
|
||||||
0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x31,0x29,0x5d,0x5e,0x41,0x45,
|
|
||||||
0x53,0x32,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x33,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,
|
|
||||||
0x33,0x29,0x5d,0x3b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x32,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x30,0x29,
|
|
||||||
0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x31,0x29,0x5d,0x5e,0x41,0x45,0x53,0x32,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,
|
|
||||||
0x2e,0x73,0x30,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x33,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x33,0x29,0x5d,0x3b,0x0a,0x6b,0x65,0x79,0x2e,
|
|
||||||
0x73,0x33,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,
|
|
||||||
0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x31,0x29,0x5d,0x5e,0x41,0x45,0x53,0x32,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x32,0x29,0x5d,0x5e,0x41,
|
|
||||||
0x45,0x53,0x33,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x33,0x29,0x5d,0x3b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6b,0x65,0x79,0x3b,0x0a,0x7d,
|
|
||||||
0x0a,0x75,0x69,0x6e,0x74,0x34,0x20,0x41,0x45,0x53,0x5f,0x52,0x6f,0x75,0x6e,0x64,0x5f,0x54,0x77,0x6f,0x5f,0x54,0x61,0x62,0x6c,0x65,0x73,0x28,0x63,0x6f,0x6e,0x73,
|
|
||||||
0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x30,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x6c,0x6f,0x63,
|
|
||||||
0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x41,0x45,0x53,0x31,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x58,0x2c,0x75,0x69,0x6e,0x74,
|
|
||||||
0x34,0x20,0x6b,0x65,0x79,0x29,0x0a,0x7b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x30,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,
|
|
||||||
0x30,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x31,0x29,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,
|
|
||||||
0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,
|
|
||||||
0x33,0x2c,0x33,0x29,0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x31,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,
|
|
||||||
0x58,0x2e,0x73,0x31,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x31,0x29,0x5d,0x5e,0x72,0x6f,0x74,0x61,
|
|
||||||
0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,
|
|
||||||
0x58,0x2e,0x73,0x30,0x2c,0x33,0x29,0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x32,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,
|
|
||||||
0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x31,0x29,0x5d,0x5e,0x72,
|
|
||||||
0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,
|
|
||||||
0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x33,0x29,0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x6b,0x65,0x79,0x2e,0x73,0x33,0x20,0x5e,0x3d,0x20,0x41,0x45,0x53,0x30,
|
|
||||||
0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x33,0x2c,0x30,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x30,0x2c,0x31,0x29,
|
|
||||||
0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x41,0x45,0x53,0x30,0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x31,0x2c,0x32,0x29,0x5d,0x5e,0x41,0x45,0x53,0x31,
|
|
||||||
0x5b,0x42,0x59,0x54,0x45,0x28,0x58,0x2e,0x73,0x32,0x2c,0x33,0x29,0x5d,0x2c,0x31,0x36,0x55,0x29,0x3b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6b,0x65,0x79,0x3b,
|
|
||||||
0x0a,0x7d,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x75,0x63,0x68,0x61,0x72,
|
|
||||||
0x20,0x72,0x63,0x6f,0x6e,0x5b,0x38,0x5d,0x3d,0x7b,0x20,0x30,0x78,0x38,0x64,0x2c,0x30,0x78,0x30,0x31,0x2c,0x30,0x78,0x30,0x32,0x2c,0x30,0x78,0x30,0x34,0x2c,0x30,
|
|
||||||
0x78,0x30,0x38,0x2c,0x30,0x78,0x31,0x30,0x2c,0x30,0x78,0x32,0x30,0x2c,0x30,0x78,0x34,0x30,0x20,0x7d,0x3b,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,
|
|
||||||
0x73,0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x73,0x62,0x6f,0x78,0x5b,0x32,0x35,0x36,0x5d,0x20,0x3d,0x0a,
|
|
||||||
0x7b,0x0a,0x30,0x78,0x36,0x33,0x2c,0x30,0x78,0x37,0x43,0x2c,0x30,0x78,0x37,0x37,0x2c,0x30,0x78,0x37,0x42,0x2c,0x30,0x78,0x46,0x32,0x2c,0x30,0x78,0x36,0x42,0x2c,
|
|
||||||
0x30,0x78,0x36,0x46,0x2c,0x30,0x78,0x43,0x35,0x2c,0x30,0x78,0x33,0x30,0x2c,0x30,0x78,0x30,0x31,0x2c,0x30,0x78,0x36,0x37,0x2c,0x30,0x78,0x32,0x42,0x2c,0x30,0x78,
|
|
||||||
0x46,0x45,0x2c,0x30,0x78,0x44,0x37,0x2c,0x30,0x78,0x41,0x42,0x2c,0x30,0x78,0x37,0x36,0x2c,0x0a,0x30,0x78,0x43,0x41,0x2c,0x30,0x78,0x38,0x32,0x2c,0x30,0x78,0x43,
|
|
||||||
0x39,0x2c,0x30,0x78,0x37,0x44,0x2c,0x30,0x78,0x46,0x41,0x2c,0x30,0x78,0x35,0x39,0x2c,0x30,0x78,0x34,0x37,0x2c,0x30,0x78,0x46,0x30,0x2c,0x30,0x78,0x41,0x44,0x2c,
|
|
||||||
0x30,0x78,0x44,0x34,0x2c,0x30,0x78,0x41,0x32,0x2c,0x30,0x78,0x41,0x46,0x2c,0x30,0x78,0x39,0x43,0x2c,0x30,0x78,0x41,0x34,0x2c,0x30,0x78,0x37,0x32,0x2c,0x30,0x78,
|
|
||||||
0x43,0x30,0x2c,0x0a,0x30,0x78,0x42,0x37,0x2c,0x30,0x78,0x46,0x44,0x2c,0x30,0x78,0x39,0x33,0x2c,0x30,0x78,0x32,0x36,0x2c,0x30,0x78,0x33,0x36,0x2c,0x30,0x78,0x33,
|
|
||||||
0x46,0x2c,0x30,0x78,0x46,0x37,0x2c,0x30,0x78,0x43,0x43,0x2c,0x30,0x78,0x33,0x34,0x2c,0x30,0x78,0x41,0x35,0x2c,0x30,0x78,0x45,0x35,0x2c,0x30,0x78,0x46,0x31,0x2c,
|
|
||||||
0x30,0x78,0x37,0x31,0x2c,0x30,0x78,0x44,0x38,0x2c,0x30,0x78,0x33,0x31,0x2c,0x30,0x78,0x31,0x35,0x2c,0x0a,0x30,0x78,0x30,0x34,0x2c,0x30,0x78,0x43,0x37,0x2c,0x30,
|
|
||||||
0x78,0x32,0x33,0x2c,0x30,0x78,0x43,0x33,0x2c,0x30,0x78,0x31,0x38,0x2c,0x30,0x78,0x39,0x36,0x2c,0x30,0x78,0x30,0x35,0x2c,0x30,0x78,0x39,0x41,0x2c,0x30,0x78,0x30,
|
|
||||||
0x37,0x2c,0x30,0x78,0x31,0x32,0x2c,0x30,0x78,0x38,0x30,0x2c,0x30,0x78,0x45,0x32,0x2c,0x30,0x78,0x45,0x42,0x2c,0x30,0x78,0x32,0x37,0x2c,0x30,0x78,0x42,0x32,0x2c,
|
|
||||||
0x30,0x78,0x37,0x35,0x2c,0x0a,0x30,0x78,0x30,0x39,0x2c,0x30,0x78,0x38,0x33,0x2c,0x30,0x78,0x32,0x43,0x2c,0x30,0x78,0x31,0x41,0x2c,0x30,0x78,0x31,0x42,0x2c,0x30,
|
|
||||||
0x78,0x36,0x45,0x2c,0x30,0x78,0x35,0x41,0x2c,0x30,0x78,0x41,0x30,0x2c,0x30,0x78,0x35,0x32,0x2c,0x30,0x78,0x33,0x42,0x2c,0x30,0x78,0x44,0x36,0x2c,0x30,0x78,0x42,
|
|
||||||
0x33,0x2c,0x30,0x78,0x32,0x39,0x2c,0x30,0x78,0x45,0x33,0x2c,0x30,0x78,0x32,0x46,0x2c,0x30,0x78,0x38,0x34,0x2c,0x0a,0x30,0x78,0x35,0x33,0x2c,0x30,0x78,0x44,0x31,
|
|
||||||
0x2c,0x30,0x78,0x30,0x30,0x2c,0x30,0x78,0x45,0x44,0x2c,0x30,0x78,0x32,0x30,0x2c,0x30,0x78,0x46,0x43,0x2c,0x30,0x78,0x42,0x31,0x2c,0x30,0x78,0x35,0x42,0x2c,0x30,
|
|
||||||
0x78,0x36,0x41,0x2c,0x30,0x78,0x43,0x42,0x2c,0x30,0x78,0x42,0x45,0x2c,0x30,0x78,0x33,0x39,0x2c,0x30,0x78,0x34,0x41,0x2c,0x30,0x78,0x34,0x43,0x2c,0x30,0x78,0x35,
|
|
||||||
0x38,0x2c,0x30,0x78,0x43,0x46,0x2c,0x0a,0x30,0x78,0x44,0x30,0x2c,0x30,0x78,0x45,0x46,0x2c,0x30,0x78,0x41,0x41,0x2c,0x30,0x78,0x46,0x42,0x2c,0x30,0x78,0x34,0x33,
|
|
||||||
0x2c,0x30,0x78,0x34,0x44,0x2c,0x30,0x78,0x33,0x33,0x2c,0x30,0x78,0x38,0x35,0x2c,0x30,0x78,0x34,0x35,0x2c,0x30,0x78,0x46,0x39,0x2c,0x30,0x78,0x30,0x32,0x2c,0x30,
|
|
||||||
0x78,0x37,0x46,0x2c,0x30,0x78,0x35,0x30,0x2c,0x30,0x78,0x33,0x43,0x2c,0x30,0x78,0x39,0x46,0x2c,0x30,0x78,0x41,0x38,0x2c,0x0a,0x30,0x78,0x35,0x31,0x2c,0x30,0x78,
|
|
||||||
0x41,0x33,0x2c,0x30,0x78,0x34,0x30,0x2c,0x30,0x78,0x38,0x46,0x2c,0x30,0x78,0x39,0x32,0x2c,0x30,0x78,0x39,0x44,0x2c,0x30,0x78,0x33,0x38,0x2c,0x30,0x78,0x46,0x35,
|
|
||||||
0x2c,0x30,0x78,0x42,0x43,0x2c,0x30,0x78,0x42,0x36,0x2c,0x30,0x78,0x44,0x41,0x2c,0x30,0x78,0x32,0x31,0x2c,0x30,0x78,0x31,0x30,0x2c,0x30,0x78,0x46,0x46,0x2c,0x30,
|
|
||||||
0x78,0x46,0x33,0x2c,0x30,0x78,0x44,0x32,0x2c,0x0a,0x30,0x78,0x43,0x44,0x2c,0x30,0x78,0x30,0x43,0x2c,0x30,0x78,0x31,0x33,0x2c,0x30,0x78,0x45,0x43,0x2c,0x30,0x78,
|
|
||||||
0x35,0x46,0x2c,0x30,0x78,0x39,0x37,0x2c,0x30,0x78,0x34,0x34,0x2c,0x30,0x78,0x31,0x37,0x2c,0x30,0x78,0x43,0x34,0x2c,0x30,0x78,0x41,0x37,0x2c,0x30,0x78,0x37,0x45,
|
|
||||||
0x2c,0x30,0x78,0x33,0x44,0x2c,0x30,0x78,0x36,0x34,0x2c,0x30,0x78,0x35,0x44,0x2c,0x30,0x78,0x31,0x39,0x2c,0x30,0x78,0x37,0x33,0x2c,0x0a,0x30,0x78,0x36,0x30,0x2c,
|
|
||||||
0x30,0x78,0x38,0x31,0x2c,0x30,0x78,0x34,0x46,0x2c,0x30,0x78,0x44,0x43,0x2c,0x30,0x78,0x32,0x32,0x2c,0x30,0x78,0x32,0x41,0x2c,0x30,0x78,0x39,0x30,0x2c,0x30,0x78,
|
|
||||||
0x38,0x38,0x2c,0x30,0x78,0x34,0x36,0x2c,0x30,0x78,0x45,0x45,0x2c,0x30,0x78,0x42,0x38,0x2c,0x30,0x78,0x31,0x34,0x2c,0x30,0x78,0x44,0x45,0x2c,0x30,0x78,0x35,0x45,
|
|
||||||
0x2c,0x30,0x78,0x30,0x42,0x2c,0x30,0x78,0x44,0x42,0x2c,0x0a,0x30,0x78,0x45,0x30,0x2c,0x30,0x78,0x33,0x32,0x2c,0x30,0x78,0x33,0x41,0x2c,0x30,0x78,0x30,0x41,0x2c,
|
|
||||||
0x30,0x78,0x34,0x39,0x2c,0x30,0x78,0x30,0x36,0x2c,0x30,0x78,0x32,0x34,0x2c,0x30,0x78,0x35,0x43,0x2c,0x30,0x78,0x43,0x32,0x2c,0x30,0x78,0x44,0x33,0x2c,0x30,0x78,
|
|
||||||
0x41,0x43,0x2c,0x30,0x78,0x36,0x32,0x2c,0x30,0x78,0x39,0x31,0x2c,0x30,0x78,0x39,0x35,0x2c,0x30,0x78,0x45,0x34,0x2c,0x30,0x78,0x37,0x39,0x2c,0x0a,0x30,0x78,0x45,
|
|
||||||
0x37,0x2c,0x30,0x78,0x43,0x38,0x2c,0x30,0x78,0x33,0x37,0x2c,0x30,0x78,0x36,0x44,0x2c,0x30,0x78,0x38,0x44,0x2c,0x30,0x78,0x44,0x35,0x2c,0x30,0x78,0x34,0x45,0x2c,
|
|
||||||
0x30,0x78,0x41,0x39,0x2c,0x30,0x78,0x36,0x43,0x2c,0x30,0x78,0x35,0x36,0x2c,0x30,0x78,0x46,0x34,0x2c,0x30,0x78,0x45,0x41,0x2c,0x30,0x78,0x36,0x35,0x2c,0x30,0x78,
|
|
||||||
0x37,0x41,0x2c,0x30,0x78,0x41,0x45,0x2c,0x30,0x78,0x30,0x38,0x2c,0x0a,0x30,0x78,0x42,0x41,0x2c,0x30,0x78,0x37,0x38,0x2c,0x30,0x78,0x32,0x35,0x2c,0x30,0x78,0x32,
|
|
||||||
0x45,0x2c,0x30,0x78,0x31,0x43,0x2c,0x30,0x78,0x41,0x36,0x2c,0x30,0x78,0x42,0x34,0x2c,0x30,0x78,0x43,0x36,0x2c,0x30,0x78,0x45,0x38,0x2c,0x30,0x78,0x44,0x44,0x2c,
|
|
||||||
0x30,0x78,0x37,0x34,0x2c,0x30,0x78,0x31,0x46,0x2c,0x30,0x78,0x34,0x42,0x2c,0x30,0x78,0x42,0x44,0x2c,0x30,0x78,0x38,0x42,0x2c,0x30,0x78,0x38,0x41,0x2c,0x0a,0x30,
|
|
||||||
0x78,0x37,0x30,0x2c,0x30,0x78,0x33,0x45,0x2c,0x30,0x78,0x42,0x35,0x2c,0x30,0x78,0x36,0x36,0x2c,0x30,0x78,0x34,0x38,0x2c,0x30,0x78,0x30,0x33,0x2c,0x30,0x78,0x46,
|
|
||||||
0x36,0x2c,0x30,0x78,0x30,0x45,0x2c,0x30,0x78,0x36,0x31,0x2c,0x30,0x78,0x33,0x35,0x2c,0x30,0x78,0x35,0x37,0x2c,0x30,0x78,0x42,0x39,0x2c,0x30,0x78,0x38,0x36,0x2c,
|
|
||||||
0x30,0x78,0x43,0x31,0x2c,0x30,0x78,0x31,0x44,0x2c,0x30,0x78,0x39,0x45,0x2c,0x0a,0x30,0x78,0x45,0x31,0x2c,0x30,0x78,0x46,0x38,0x2c,0x30,0x78,0x39,0x38,0x2c,0x30,
|
|
||||||
0x78,0x31,0x31,0x2c,0x30,0x78,0x36,0x39,0x2c,0x30,0x78,0x44,0x39,0x2c,0x30,0x78,0x38,0x45,0x2c,0x30,0x78,0x39,0x34,0x2c,0x30,0x78,0x39,0x42,0x2c,0x30,0x78,0x31,
|
|
||||||
0x45,0x2c,0x30,0x78,0x38,0x37,0x2c,0x30,0x78,0x45,0x39,0x2c,0x30,0x78,0x43,0x45,0x2c,0x30,0x78,0x35,0x35,0x2c,0x30,0x78,0x32,0x38,0x2c,0x30,0x78,0x44,0x46,0x2c,
|
|
||||||
0x0a,0x30,0x78,0x38,0x43,0x2c,0x30,0x78,0x41,0x31,0x2c,0x30,0x78,0x38,0x39,0x2c,0x30,0x78,0x30,0x44,0x2c,0x30,0x78,0x42,0x46,0x2c,0x30,0x78,0x45,0x36,0x2c,0x30,
|
|
||||||
0x78,0x34,0x32,0x2c,0x30,0x78,0x36,0x38,0x2c,0x30,0x78,0x34,0x31,0x2c,0x30,0x78,0x39,0x39,0x2c,0x30,0x78,0x32,0x44,0x2c,0x30,0x78,0x30,0x46,0x2c,0x30,0x78,0x42,
|
|
||||||
0x30,0x2c,0x30,0x78,0x35,0x34,0x2c,0x30,0x78,0x42,0x42,0x2c,0x30,0x78,0x31,0x36,0x0a,0x7d,0x3b,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x53,0x75,0x62,0x57,
|
|
||||||
0x6f,0x72,0x64,0x28,0x69,0x6e,0x77,0x29,0x20,0x28,0x28,0x73,0x62,0x6f,0x78,0x5b,0x42,0x59,0x54,0x45,0x28,0x69,0x6e,0x77,0x2c,0x20,0x33,0x29,0x5d,0x20,0x3c,0x3c,
|
|
||||||
0x20,0x32,0x34,0x29,0x20,0x7c,0x20,0x28,0x73,0x62,0x6f,0x78,0x5b,0x42,0x59,0x54,0x45,0x28,0x69,0x6e,0x77,0x2c,0x20,0x32,0x29,0x5d,0x20,0x3c,0x3c,0x20,0x31,0x36,
|
|
||||||
0x29,0x20,0x7c,0x20,0x28,0x73,0x62,0x6f,0x78,0x5b,0x42,0x59,0x54,0x45,0x28,0x69,0x6e,0x77,0x2c,0x20,0x31,0x29,0x5d,0x20,0x3c,0x3c,0x20,0x38,0x29,0x20,0x7c,0x20,
|
|
||||||
0x73,0x62,0x6f,0x78,0x5b,0x42,0x59,0x54,0x45,0x28,0x69,0x6e,0x77,0x2c,0x20,0x30,0x29,0x5d,0x29,0x0a,0x76,0x6f,0x69,0x64,0x20,0x41,0x45,0x53,0x45,0x78,0x70,0x61,
|
|
||||||
0x6e,0x64,0x4b,0x65,0x79,0x32,0x35,0x36,0x28,0x75,0x69,0x6e,0x74,0x20,0x2a,0x6b,0x65,0x79,0x62,0x75,0x66,0x29,0x0a,0x7b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,
|
|
||||||
0x6e,0x74,0x20,0x63,0x3d,0x38,0x2c,0x69,0x3d,0x31,0x3b,0x20,0x63,0x3c,0x34,0x30,0x3b,0x20,0x2b,0x2b,0x63,0x29,0x20,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x74,0x3d,
|
|
||||||
0x28,0x28,0x21,0x28,0x63,0x26,0x37,0x29,0x29,0x7c,0x7c,0x28,0x28,0x63,0x26,0x37,0x29,0x3d,0x3d,0x34,0x29,0x29,0x3f,0x53,0x75,0x62,0x57,0x6f,0x72,0x64,0x28,0x6b,
|
|
||||||
0x65,0x79,0x62,0x75,0x66,0x5b,0x63,0x2d,0x31,0x5d,0x29,0x3a,0x6b,0x65,0x79,0x62,0x75,0x66,0x5b,0x63,0x2d,0x31,0x5d,0x3b,0x0a,0x6b,0x65,0x79,0x62,0x75,0x66,0x5b,
|
|
||||||
0x63,0x5d,0x3d,0x6b,0x65,0x79,0x62,0x75,0x66,0x5b,0x63,0x2d,0x38,0x5d,0x5e,0x28,0x28,0x21,0x28,0x63,0x26,0x37,0x29,0x29,0x3f,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,
|
|
||||||
0x74,0x2c,0x32,0x34,0x55,0x29,0x5e,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x28,0x28,0x75,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x72,0x63,0x6f,0x6e,0x5b,0x69,0x2b,0x2b,
|
|
||||||
0x5d,0x2c,0x30,0x55,0x2c,0x30,0x55,0x2c,0x30,0x55,0x29,0x29,0x3a,0x74,0x29,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x23,0x69,0x66,0x6e,
|
|
||||||
0x64,0x65,0x66,0x20,0x58,0x4d,0x52,0x49,0x47,0x5f,0x4b,0x45,0x43,0x43,0x41,0x4b,0x5f,0x43,0x4c,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x58,0x4d,0x52,0x49,
|
|
||||||
0x47,0x5f,0x4b,0x45,0x43,0x43,0x41,0x4b,0x5f,0x43,0x4c,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,
|
|
||||||
0x61,0x6e,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x72,0x6e,0x64,0x63,0x5b,0x32,0x34,0x5d,0x20,0x3d,0x0a,0x7b,0x0a,0x30,
|
|
||||||
0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
|
|
||||||
0x38,0x30,0x38,0x32,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x38,0x61,0x2c,0x0a,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
|
||||||
0x30,0x30,0x30,0x38,0x30,0x30,0x30,0x38,0x30,0x30,0x30,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x38,0x62,0x2c,0x30,
|
|
||||||
0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x2c,0x0a,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x30,
|
|
||||||
0x30,0x38,0x30,0x38,0x31,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x39,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
|
||||||
0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x61,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x38,0x2c,
|
|
||||||
0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x30,0x38,0x30,0x30,0x39,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x30,
|
|
||||||
0x30,0x30,0x30,0x30,0x61,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x30,0x38,0x30,0x38,0x62,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,
|
|
||||||
0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x62,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x38,0x39,0x2c,
|
|
||||||
0x0a,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x33,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
|
|
||||||
0x30,0x30,0x38,0x30,0x30,0x32,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,
|
|
||||||
0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x61,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x61,
|
|
||||||
0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x30,0x38,0x30,0x38,0x31,0x2c,0x0a,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
|
|
||||||
0x30,0x30,0x30,0x38,0x30,0x38,0x30,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x2c,0x30,0x78,0x38,0x30,0x30,
|
|
||||||
0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x30,0x38,0x30,0x30,0x38,0x0a,0x7d,0x3b,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,
|
|
||||||
0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x72,0x6f,0x74,0x63,0x5b,0x32,0x34,0x5d,0x20,0x3d,
|
|
||||||
0x0a,0x7b,0x0a,0x31,0x2c,0x33,0x2c,0x36,0x2c,0x31,0x30,0x2c,0x31,0x35,0x2c,0x32,0x31,0x2c,0x32,0x38,0x2c,0x33,0x36,0x2c,0x34,0x35,0x2c,0x35,0x35,0x2c,0x32,0x2c,
|
|
||||||
0x31,0x34,0x2c,0x0a,0x32,0x37,0x2c,0x34,0x31,0x2c,0x35,0x36,0x2c,0x38,0x2c,0x32,0x35,0x2c,0x34,0x33,0x2c,0x36,0x32,0x2c,0x31,0x38,0x2c,0x33,0x39,0x2c,0x36,0x31,
|
|
||||||
0x2c,0x32,0x30,0x2c,0x34,0x34,0x0a,0x7d,0x3b,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,
|
|
||||||
0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x70,0x69,0x6c,0x6e,0x5b,0x32,0x34,0x5d,0x20,0x3d,0x0a,0x7b,0x0a,0x31,0x30,0x2c,0x37,
|
|
||||||
0x2c,0x31,0x31,0x2c,0x31,0x37,0x2c,0x31,0x38,0x2c,0x33,0x2c,0x35,0x2c,0x31,0x36,0x2c,0x38,0x2c,0x32,0x31,0x2c,0x32,0x34,0x2c,0x34,0x2c,0x0a,0x31,0x35,0x2c,0x32,
|
|
||||||
0x33,0x2c,0x31,0x39,0x2c,0x31,0x33,0x2c,0x31,0x32,0x2c,0x32,0x2c,0x32,0x30,0x2c,0x31,0x34,0x2c,0x32,0x32,0x2c,0x39,0x2c,0x36,0x2c,0x31,0x0a,0x7d,0x3b,0x0a,0x76,
|
|
||||||
0x6f,0x69,0x64,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x31,0x36,0x30,0x30,0x5f,0x31,0x28,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x2a,0x73,0x74,0x29,0x0a,0x7b,0x0a,0x69,
|
|
||||||
0x6e,0x74,0x20,0x69,0x2c,0x72,0x6f,0x75,0x6e,0x64,0x3b,0x0a,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x74,0x2c,0x62,0x63,0x5b,0x35,0x5d,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,
|
|
||||||
0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x31,0x0a,0x66,0x6f,0x72,0x20,0x28,0x72,0x6f,0x75,0x6e,0x64,0x3d,0x30,0x3b,0x20,0x72,0x6f,0x75,0x6e,0x64,0x3c,
|
|
||||||
0x32,0x34,0x3b,0x20,0x2b,0x2b,0x72,0x6f,0x75,0x6e,0x64,0x29,0x20,0x7b,0x0a,0x62,0x63,0x5b,0x30,0x5d,0x3d,0x73,0x74,0x5b,0x30,0x5d,0x5e,0x73,0x74,0x5b,0x35,0x5d,
|
|
||||||
0x5e,0x73,0x74,0x5b,0x31,0x30,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x35,0x5d,0x5e,0x73,0x74,0x5b,0x32,0x30,0x5d,0x3b,0x0a,0x62,0x63,0x5b,0x31,0x5d,0x3d,0x73,0x74,0x5b,
|
|
||||||
0x31,0x5d,0x5e,0x73,0x74,0x5b,0x36,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x31,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x36,0x5d,0x5e,0x73,0x74,0x5b,0x32,0x31,0x5d,0x3b,0x0a,0x62,
|
|
||||||
0x63,0x5b,0x32,0x5d,0x3d,0x73,0x74,0x5b,0x32,0x5d,0x5e,0x73,0x74,0x5b,0x37,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x32,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x37,0x5d,0x5e,0x73,
|
|
||||||
0x74,0x5b,0x32,0x32,0x5d,0x3b,0x0a,0x62,0x63,0x5b,0x33,0x5d,0x3d,0x73,0x74,0x5b,0x33,0x5d,0x5e,0x73,0x74,0x5b,0x38,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x33,0x5d,0x5e,
|
|
||||||
0x73,0x74,0x5b,0x31,0x38,0x5d,0x5e,0x73,0x74,0x5b,0x32,0x33,0x5d,0x3b,0x0a,0x62,0x63,0x5b,0x34,0x5d,0x3d,0x73,0x74,0x5b,0x34,0x5d,0x5e,0x73,0x74,0x5b,0x39,0x5d,
|
|
||||||
0x5e,0x73,0x74,0x5b,0x31,0x34,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x39,0x5d,0x5e,0x73,0x74,0x5b,0x32,0x34,0x5d,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,
|
|
||||||
0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x31,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x35,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x20,0x7b,0x0a,0x74,0x3d,
|
|
||||||
0x62,0x63,0x5b,0x28,0x69,0x2b,0x34,0x29,0x20,0x25,0x20,0x35,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x62,0x63,0x5b,0x28,0x69,0x2b,0x31,0x29,0x20,0x25,0x20,
|
|
||||||
0x35,0x5d,0x2c,0x31,0x55,0x4c,0x29,0x3b,0x0a,0x73,0x74,0x5b,0x69,0x20,0x5d,0x20,0x5e,0x3d,0x20,0x74,0x3b,0x0a,0x73,0x74,0x5b,0x69,0x2b,0x35,0x5d,0x20,0x5e,0x3d,
|
|
||||||
0x20,0x74,0x3b,0x0a,0x73,0x74,0x5b,0x69,0x2b,0x31,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x74,0x3b,0x0a,0x73,0x74,0x5b,0x69,0x2b,0x31,0x35,0x5d,0x20,0x5e,0x3d,0x20,0x74,
|
|
||||||
0x3b,0x0a,0x73,0x74,0x5b,0x69,0x2b,0x32,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x74,0x3b,0x0a,0x7d,0x0a,0x74,0x3d,0x73,0x74,0x5b,0x31,0x5d,0x3b,0x0a,0x23,0x70,0x72,0x61,
|
|
||||||
0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x31,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x32,0x34,0x3b,0x20,0x2b,0x2b,0x69,
|
|
||||||
0x29,0x20,0x7b,0x0a,0x62,0x63,0x5b,0x30,0x5d,0x3d,0x73,0x74,0x5b,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x70,0x69,0x6c,0x6e,0x5b,0x69,0x5d,0x5d,0x3b,0x0a,0x73,
|
|
||||||
0x74,0x5b,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x70,0x69,0x6c,0x6e,0x5b,0x69,0x5d,0x5d,0x3d,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x74,0x2c,0x28,0x75,0x6c,0x6f,
|
|
||||||
0x6e,0x67,0x29,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x72,0x6f,0x74,0x63,0x5b,0x69,0x5d,0x29,0x3b,0x0a,0x74,0x3d,0x62,0x63,0x5b,0x30,0x5d,0x3b,0x0a,0x7d,0x0a,
|
|
||||||
0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x31,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,
|
|
||||||
0x3c,0x32,0x35,0x3b,0x20,0x69,0x2b,0x3d,0x35,0x29,0x20,0x7b,0x0a,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,
|
|
||||||
0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x31,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x78,0x3d,0x30,0x3b,0x20,0x78,0x3c,0x35,0x3b,0x20,0x2b,
|
|
||||||
0x2b,0x78,0x29,0x20,0x7b,0x0a,0x74,0x6d,0x70,0x5b,0x78,0x5d,0x3d,0x62,0x69,0x74,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x74,0x5b,0x69,0x2b,0x78,0x5d,0x5e,0x73,
|
|
||||||
0x74,0x5b,0x69,0x2b,0x28,0x28,0x78,0x2b,0x32,0x29,0x20,0x25,0x20,0x35,0x29,0x5d,0x2c,0x73,0x74,0x5b,0x69,0x2b,0x78,0x5d,0x2c,0x73,0x74,0x5b,0x69,0x2b,0x28,0x28,
|
|
||||||
0x78,0x2b,0x31,0x29,0x20,0x25,0x20,0x35,0x29,0x5d,0x29,0x3b,0x0a,0x7d,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x31,0x0a,
|
|
||||||
0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x78,0x3d,0x30,0x3b,0x20,0x78,0x3c,0x35,0x3b,0x20,0x2b,0x2b,0x78,0x29,0x20,0x7b,0x0a,0x73,0x74,0x5b,0x69,0x2b,0x78,
|
|
||||||
0x5d,0x3d,0x74,0x6d,0x70,0x5b,0x78,0x5d,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x73,0x74,0x5b,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x72,
|
|
||||||
0x6e,0x64,0x63,0x5b,0x72,0x6f,0x75,0x6e,0x64,0x5d,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x31,0x36,0x30,0x30,
|
|
||||||
0x5f,0x32,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x2a,0x73,0x74,0x29,0x0a,0x7b,0x0a,0x69,0x6e,0x74,0x20,0x69,0x2c,0x72,0x6f,
|
|
||||||
0x75,0x6e,0x64,0x3b,0x0a,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x74,0x2c,0x62,0x63,0x5b,0x35,0x5d,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,
|
|
||||||
0x6c,0x6c,0x20,0x31,0x0a,0x66,0x6f,0x72,0x20,0x28,0x72,0x6f,0x75,0x6e,0x64,0x3d,0x30,0x3b,0x20,0x72,0x6f,0x75,0x6e,0x64,0x3c,0x32,0x34,0x3b,0x20,0x2b,0x2b,0x72,
|
|
||||||
0x6f,0x75,0x6e,0x64,0x29,0x20,0x7b,0x0a,0x62,0x63,0x5b,0x30,0x5d,0x3d,0x73,0x74,0x5b,0x30,0x5d,0x5e,0x73,0x74,0x5b,0x35,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x30,0x5d,
|
|
||||||
0x5e,0x73,0x74,0x5b,0x31,0x35,0x5d,0x5e,0x73,0x74,0x5b,0x32,0x30,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x73,0x74,0x5b,0x32,0x5d,0x5e,0x73,0x74,0x5b,0x37,
|
|
||||||
0x5d,0x5e,0x73,0x74,0x5b,0x31,0x32,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x37,0x5d,0x5e,0x73,0x74,0x5b,0x32,0x32,0x5d,0x2c,0x31,0x55,0x4c,0x29,0x3b,0x0a,0x62,0x63,0x5b,
|
|
||||||
0x31,0x5d,0x3d,0x73,0x74,0x5b,0x31,0x5d,0x5e,0x73,0x74,0x5b,0x36,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x31,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x36,0x5d,0x5e,0x73,0x74,0x5b,
|
|
||||||
0x32,0x31,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x73,0x74,0x5b,0x33,0x5d,0x5e,0x73,0x74,0x5b,0x38,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x33,0x5d,0x5e,0x73,0x74,
|
|
||||||
0x5b,0x31,0x38,0x5d,0x5e,0x73,0x74,0x5b,0x32,0x33,0x5d,0x2c,0x31,0x55,0x4c,0x29,0x3b,0x0a,0x62,0x63,0x5b,0x32,0x5d,0x3d,0x73,0x74,0x5b,0x32,0x5d,0x5e,0x73,0x74,
|
|
||||||
0x5b,0x37,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x32,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x37,0x5d,0x5e,0x73,0x74,0x5b,0x32,0x32,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,
|
|
||||||
0x73,0x74,0x5b,0x34,0x5d,0x5e,0x73,0x74,0x5b,0x39,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x34,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x39,0x5d,0x5e,0x73,0x74,0x5b,0x32,0x34,0x5d,
|
|
||||||
0x2c,0x31,0x55,0x4c,0x29,0x3b,0x0a,0x62,0x63,0x5b,0x33,0x5d,0x3d,0x73,0x74,0x5b,0x33,0x5d,0x5e,0x73,0x74,0x5b,0x38,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x33,0x5d,0x5e,
|
|
||||||
0x73,0x74,0x5b,0x31,0x38,0x5d,0x5e,0x73,0x74,0x5b,0x32,0x33,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x73,0x74,0x5b,0x30,0x5d,0x5e,0x73,0x74,0x5b,0x35,0x5d,
|
|
||||||
0x5e,0x73,0x74,0x5b,0x31,0x30,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x35,0x5d,0x5e,0x73,0x74,0x5b,0x32,0x30,0x5d,0x2c,0x31,0x55,0x4c,0x29,0x3b,0x0a,0x62,0x63,0x5b,0x34,
|
|
||||||
0x5d,0x3d,0x73,0x74,0x5b,0x34,0x5d,0x5e,0x73,0x74,0x5b,0x39,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x34,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x39,0x5d,0x5e,0x73,0x74,0x5b,0x32,
|
|
||||||
0x34,0x5d,0x5e,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x73,0x74,0x5b,0x31,0x5d,0x5e,0x73,0x74,0x5b,0x36,0x5d,0x5e,0x73,0x74,0x5b,0x31,0x31,0x5d,0x5e,0x73,0x74,0x5b,
|
|
||||||
0x31,0x36,0x5d,0x5e,0x73,0x74,0x5b,0x32,0x31,0x5d,0x2c,0x31,0x55,0x4c,0x29,0x3b,0x0a,0x73,0x74,0x5b,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x34,0x5d,0x3b,
|
|
||||||
0x0a,0x73,0x74,0x5b,0x35,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x34,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x31,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x34,0x5d,
|
|
||||||
0x3b,0x0a,0x73,0x74,0x5b,0x31,0x35,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x34,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x32,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,
|
|
||||||
0x34,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x31,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x30,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x36,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,
|
|
||||||
0x30,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x31,0x31,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x30,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x31,0x36,0x5d,0x20,0x5e,0x3d,0x20,0x62,
|
|
||||||
0x63,0x5b,0x30,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x32,0x31,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x30,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x32,0x5d,0x20,0x5e,0x3d,0x20,
|
|
||||||
0x62,0x63,0x5b,0x31,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x37,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x31,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x31,0x32,0x5d,0x20,0x5e,0x3d,
|
|
||||||
0x20,0x62,0x63,0x5b,0x31,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x31,0x37,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x31,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x32,0x32,0x5d,0x20,
|
|
||||||
0x5e,0x3d,0x20,0x62,0x63,0x5b,0x31,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x33,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x32,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x38,0x5d,0x20,
|
|
||||||
0x5e,0x3d,0x20,0x62,0x63,0x5b,0x32,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x31,0x33,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x32,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x31,0x38,
|
|
||||||
0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x32,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x32,0x33,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x32,0x5d,0x3b,0x0a,0x73,0x74,0x5b,
|
|
||||||
0x34,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x33,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x39,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x33,0x5d,0x3b,0x0a,0x73,0x74,0x5b,
|
|
||||||
0x31,0x34,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x33,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x31,0x39,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x33,0x5d,0x3b,0x0a,0x73,
|
|
||||||
0x74,0x5b,0x32,0x34,0x5d,0x20,0x5e,0x3d,0x20,0x62,0x63,0x5b,0x33,0x5d,0x3b,0x0a,0x74,0x3d,0x73,0x74,0x5b,0x31,0x5d,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,
|
|
||||||
0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x31,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x32,0x34,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x20,0x7b,
|
|
||||||
0x0a,0x62,0x63,0x5b,0x30,0x5d,0x3d,0x73,0x74,0x5b,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x70,0x69,0x6c,0x6e,0x5b,0x69,0x5d,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x6b,
|
|
||||||
0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x70,0x69,0x6c,0x6e,0x5b,0x69,0x5d,0x5d,0x3d,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x74,0x2c,0x28,0x75,0x6c,0x6f,0x6e,0x67,0x29,
|
|
||||||
0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x72,0x6f,0x74,0x63,0x5b,0x69,0x5d,0x29,0x3b,0x0a,0x74,0x3d,0x62,0x63,0x5b,0x30,0x5d,0x3b,0x0a,0x7d,0x0a,0x23,0x70,0x72,
|
|
||||||
0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x31,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x32,0x35,
|
|
||||||
0x3b,0x20,0x69,0x2b,0x3d,0x35,0x29,0x20,0x7b,0x0a,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x74,0x6d,0x70,0x31,0x3d,0x73,0x74,0x5b,0x69,0x5d,0x2c,0x74,0x6d,0x70,0x32,0x3d,
|
|
||||||
0x73,0x74,0x5b,0x69,0x2b,0x31,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x69,0x5d,0x3d,0x62,0x69,0x74,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x74,0x5b,0x69,0x5d,0x5e,0x73,
|
|
||||||
0x74,0x5b,0x69,0x2b,0x32,0x5d,0x2c,0x73,0x74,0x5b,0x69,0x5d,0x2c,0x73,0x74,0x5b,0x69,0x2b,0x31,0x5d,0x29,0x3b,0x0a,0x73,0x74,0x5b,0x69,0x2b,0x31,0x5d,0x3d,0x62,
|
|
||||||
0x69,0x74,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x74,0x5b,0x69,0x2b,0x31,0x5d,0x5e,0x73,0x74,0x5b,0x69,0x2b,0x33,0x5d,0x2c,0x73,0x74,0x5b,0x69,0x2b,0x31,0x5d,
|
|
||||||
0x2c,0x73,0x74,0x5b,0x69,0x2b,0x32,0x5d,0x29,0x3b,0x0a,0x73,0x74,0x5b,0x69,0x2b,0x32,0x5d,0x3d,0x62,0x69,0x74,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x74,0x5b,
|
|
||||||
0x69,0x2b,0x32,0x5d,0x5e,0x73,0x74,0x5b,0x69,0x2b,0x34,0x5d,0x2c,0x73,0x74,0x5b,0x69,0x2b,0x32,0x5d,0x2c,0x73,0x74,0x5b,0x69,0x2b,0x33,0x5d,0x29,0x3b,0x0a,0x73,
|
|
||||||
0x74,0x5b,0x69,0x2b,0x33,0x5d,0x3d,0x62,0x69,0x74,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x74,0x5b,0x69,0x2b,0x33,0x5d,0x5e,0x74,0x6d,0x70,0x31,0x2c,0x73,0x74,
|
|
||||||
0x5b,0x69,0x2b,0x33,0x5d,0x2c,0x73,0x74,0x5b,0x69,0x2b,0x34,0x5d,0x29,0x3b,0x0a,0x73,0x74,0x5b,0x69,0x2b,0x34,0x5d,0x3d,0x62,0x69,0x74,0x73,0x65,0x6c,0x65,0x63,
|
|
||||||
0x74,0x28,0x73,0x74,0x5b,0x69,0x2b,0x34,0x5d,0x5e,0x74,0x6d,0x70,0x32,0x2c,0x73,0x74,0x5b,0x69,0x2b,0x34,0x5d,0x2c,0x74,0x6d,0x70,0x31,0x29,0x3b,0x0a,0x7d,0x0a,
|
|
||||||
0x73,0x74,0x5b,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x72,0x6e,0x64,0x63,0x5b,0x72,0x6f,0x75,0x6e,0x64,0x5d,0x3b,0x0a,0x7d,0x0a,
|
|
||||||
0x7d,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x75,0x69,0x6e,0x74,0x20,0x67,0x65,0x74,0x49,0x64,0x78,0x28,0x29,0x0a,0x7b,0x0a,
|
|
||||||
0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2d,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,
|
|
||||||
0x61,0x6c,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x28,0x30,0x29,0x3b,0x0a,0x7d,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x49,0x44,0x58,0x28,0x78,0x29,0x20,0x28,
|
|
||||||
0x78,0x29,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x6d,0x6d,0x5f,0x61,0x64,0x64,0x5f,0x70,0x73,0x28,0x66,0x6c,0x6f,0x61,
|
|
||||||
0x74,0x34,0x20,0x61,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x62,0x29,0x0a,0x7b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x61,0x2b,0x62,0x3b,0x0a,0x7d,0x0a,0x69,
|
|
||||||
0x6e,0x6c,0x69,0x6e,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x6d,0x6d,0x5f,0x73,0x75,0x62,0x5f,0x70,0x73,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x61,
|
|
||||||
0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x62,0x29,0x0a,0x7b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x61,0x2d,0x62,0x3b,0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,
|
|
||||||
0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x6d,0x6d,0x5f,0x6d,0x75,0x6c,0x5f,0x70,0x73,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x61,0x2c,0x66,0x6c,0x6f,
|
|
||||||
0x61,0x74,0x34,0x20,0x62,0x29,0x0a,0x7b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x61,0x2a,0x62,0x3b,0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x66,0x6c,
|
|
||||||
0x6f,0x61,0x74,0x34,0x20,0x5f,0x6d,0x6d,0x5f,0x64,0x69,0x76,0x5f,0x70,0x73,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x61,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,
|
|
||||||
0x62,0x29,0x0a,0x7b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x61,0x2f,0x62,0x3b,0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,
|
|
||||||
0x20,0x5f,0x6d,0x6d,0x5f,0x61,0x6e,0x64,0x5f,0x70,0x73,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x61,0x2c,0x69,0x6e,0x74,0x20,0x62,0x29,0x0a,0x7b,0x0a,0x72,0x65,
|
|
||||||
0x74,0x75,0x72,0x6e,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x61,0x73,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x29,0x26,0x28,0x69,0x6e,0x74,0x34,0x29,
|
|
||||||
0x28,0x62,0x29,0x29,0x3b,0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x6d,0x6d,0x5f,0x6f,0x72,0x5f,0x70,0x73,0x28,
|
|
||||||
0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x61,0x2c,0x69,0x6e,0x74,0x20,0x62,0x29,0x0a,0x7b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,
|
|
||||||
0x74,0x34,0x28,0x61,0x73,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x29,0x7c,0x28,0x69,0x6e,0x74,0x34,0x29,0x28,0x62,0x29,0x29,0x3b,0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,
|
|
||||||
0x6e,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x6d,0x6d,0x5f,0x66,0x6d,0x6f,0x64,0x5f,0x70,0x73,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x2c,0x66,
|
|
||||||
0x6c,0x6f,0x61,0x74,0x20,0x64,0x63,0x29,0x0a,0x7b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x3d,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x64,0x63,0x29,
|
|
||||||
0x3b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x63,0x3d,0x5f,0x6d,0x6d,0x5f,0x64,0x69,0x76,0x5f,0x70,0x73,0x28,0x76,0x2c,0x64,0x29,0x3b,0x0a,0x63,0x3d,0x74,0x72,
|
|
||||||
0x75,0x6e,0x63,0x28,0x63,0x29,0x3b,0x0a,0x63,0x3d,0x5f,0x6d,0x6d,0x5f,0x6d,0x75,0x6c,0x5f,0x70,0x73,0x28,0x63,0x2c,0x64,0x29,0x3b,0x0a,0x72,0x65,0x74,0x75,0x72,
|
|
||||||
0x6e,0x20,0x5f,0x6d,0x6d,0x5f,0x73,0x75,0x62,0x5f,0x70,0x73,0x28,0x76,0x2c,0x63,0x29,0x3b,0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x69,0x6e,0x74,0x34,
|
|
||||||
0x20,0x5f,0x6d,0x6d,0x5f,0x78,0x6f,0x72,0x5f,0x73,0x69,0x31,0x32,0x38,0x28,0x69,0x6e,0x74,0x34,0x20,0x61,0x2c,0x69,0x6e,0x74,0x34,0x20,0x62,0x29,0x0a,0x7b,0x0a,
|
|
||||||
0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x61,0x5e,0x62,0x3b,0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x6d,0x6d,0x5f,
|
|
||||||
0x78,0x6f,0x72,0x5f,0x70,0x73,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x61,0x2c,0x69,0x6e,0x74,0x20,0x62,0x29,0x0a,0x7b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,
|
|
||||||
0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x61,0x73,0x5f,0x69,0x6e,0x74,0x34,0x28,0x61,0x29,0x5e,0x28,0x69,0x6e,0x74,0x34,0x29,0x28,0x62,0x29,0x29,0x3b,
|
|
||||||
0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x69,0x6e,0x74,0x34,0x20,0x5f,0x6d,0x6d,0x5f,0x61,0x6c,0x69,0x67,0x6e,0x72,0x5f,0x65,0x70,0x69,0x38,0x28,0x69,
|
|
||||||
0x6e,0x74,0x34,0x20,0x61,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x72,0x6f,0x74,0x29,0x0a,0x7b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,
|
|
||||||
0x6e,0x74,0x20,0x72,0x69,0x67,0x68,0x74,0x3d,0x38,0x2a,0x72,0x6f,0x74,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x65,0x66,0x74,0x3d,
|
|
||||||
0x28,0x33,0x32,0x2d,0x38,0x2a,0x72,0x6f,0x74,0x29,0x3b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x28,0x0a,0x28,0x28,0x75,0x69,0x6e,
|
|
||||||
0x74,0x29,0x61,0x2e,0x78,0x3e,0x3e,0x72,0x69,0x67,0x68,0x74,0x29,0x7c,0x28,0x20,0x61,0x2e,0x79,0x3c,0x3c,0x6c,0x65,0x66,0x74,0x20,0x29,0x2c,0x0a,0x28,0x28,0x75,
|
|
||||||
0x69,0x6e,0x74,0x29,0x61,0x2e,0x79,0x3e,0x3e,0x72,0x69,0x67,0x68,0x74,0x29,0x7c,0x28,0x20,0x61,0x2e,0x7a,0x3c,0x3c,0x6c,0x65,0x66,0x74,0x20,0x29,0x2c,0x0a,0x28,
|
|
||||||
0x28,0x75,0x69,0x6e,0x74,0x29,0x61,0x2e,0x7a,0x3e,0x3e,0x72,0x69,0x67,0x68,0x74,0x29,0x7c,0x28,0x20,0x61,0x2e,0x77,0x3c,0x3c,0x6c,0x65,0x66,0x74,0x20,0x29,0x2c,
|
|
||||||
0x0a,0x28,0x28,0x75,0x69,0x6e,0x74,0x29,0x61,0x2e,0x77,0x3e,0x3e,0x72,0x69,0x67,0x68,0x74,0x29,0x7c,0x28,0x20,0x61,0x2e,0x78,0x3c,0x3c,0x6c,0x65,0x66,0x74,0x20,
|
|
||||||
0x29,0x0a,0x29,0x3b,0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x69,0x6e,0x74,0x34,0x2a,0x20,0x73,0x63,0x72,0x61,0x74,
|
|
||||||
0x63,0x68,0x70,0x61,0x64,0x5f,0x70,0x74,0x72,0x28,0x75,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x2c,0x75,0x69,0x6e,0x74,0x20,0x6e,0x2c,0x5f,0x5f,0x67,0x6c,0x6f,0x62,
|
|
||||||
0x61,0x6c,0x20,0x69,0x6e,0x74,0x20,0x2a,0x6c,0x70,0x61,0x64,0x29,0x20,0x7b,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,
|
|
||||||
0x20,0x69,0x6e,0x74,0x34,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x68,0x61,0x72,0x2a,0x29,0x6c,0x70,0x61,0x64,0x2b,0x28,0x69,0x64,
|
|
||||||
0x78,0x26,0x4d,0x41,0x53,0x4b,0x29,0x2b,0x6e,0x2a,0x31,0x36,0x29,0x3b,0x20,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x66,
|
|
||||||
0x6d,0x61,0x5f,0x62,0x72,0x65,0x61,0x6b,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x78,0x29,0x0a,0x7b,0x0a,0x78,0x3d,0x5f,0x6d,0x6d,0x5f,0x61,0x6e,0x64,0x5f,0x70,
|
|
||||||
0x73,0x28,0x78,0x2c,0x30,0x78,0x46,0x45,0x46,0x46,0x46,0x46,0x46,0x46,0x29,0x3b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x5f,0x6d,0x6d,0x5f,0x6f,0x72,0x5f,0x70,
|
|
||||||
0x73,0x28,0x78,0x2c,0x30,0x78,0x30,0x30,0x38,0x30,0x30,0x30,0x30,0x30,0x29,0x3b,0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,
|
|
||||||
0x75,0x62,0x5f,0x72,0x6f,0x75,0x6e,0x64,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x30,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x31,0x2c,0x66,0x6c,0x6f,
|
|
||||||
0x61,0x74,0x34,0x20,0x6e,0x32,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x33,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x72,0x6e,0x64,0x5f,0x63,0x2c,0x66,0x6c,
|
|
||||||
0x6f,0x61,0x74,0x34,0x2a,0x20,0x6e,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x2a,0x20,0x64,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x2a,0x20,0x63,0x29,0x0a,0x7b,0x0a,0x6e,
|
|
||||||
0x31,0x3d,0x5f,0x6d,0x6d,0x5f,0x61,0x64,0x64,0x5f,0x70,0x73,0x28,0x6e,0x31,0x2c,0x2a,0x63,0x29,0x3b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x6e,0x3d,0x5f,
|
|
||||||
0x6d,0x6d,0x5f,0x6d,0x75,0x6c,0x5f,0x70,0x73,0x28,0x6e,0x30,0x2c,0x2a,0x63,0x29,0x3b,0x0a,0x6e,0x6e,0x3d,0x5f,0x6d,0x6d,0x5f,0x6d,0x75,0x6c,0x5f,0x70,0x73,0x28,
|
|
||||||
0x6e,0x31,0x2c,0x5f,0x6d,0x6d,0x5f,0x6d,0x75,0x6c,0x5f,0x70,0x73,0x28,0x6e,0x6e,0x2c,0x6e,0x6e,0x29,0x29,0x3b,0x0a,0x6e,0x6e,0x3d,0x66,0x6d,0x61,0x5f,0x62,0x72,
|
|
||||||
0x65,0x61,0x6b,0x28,0x6e,0x6e,0x29,0x3b,0x0a,0x2a,0x6e,0x3d,0x5f,0x6d,0x6d,0x5f,0x61,0x64,0x64,0x5f,0x70,0x73,0x28,0x2a,0x6e,0x2c,0x6e,0x6e,0x29,0x3b,0x0a,0x6e,
|
|
||||||
0x33,0x3d,0x5f,0x6d,0x6d,0x5f,0x73,0x75,0x62,0x5f,0x70,0x73,0x28,0x6e,0x33,0x2c,0x2a,0x63,0x29,0x3b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x64,0x3d,0x5f,
|
|
||||||
0x6d,0x6d,0x5f,0x6d,0x75,0x6c,0x5f,0x70,0x73,0x28,0x6e,0x32,0x2c,0x2a,0x63,0x29,0x3b,0x0a,0x64,0x64,0x3d,0x5f,0x6d,0x6d,0x5f,0x6d,0x75,0x6c,0x5f,0x70,0x73,0x28,
|
|
||||||
0x6e,0x33,0x2c,0x5f,0x6d,0x6d,0x5f,0x6d,0x75,0x6c,0x5f,0x70,0x73,0x28,0x64,0x64,0x2c,0x64,0x64,0x29,0x29,0x3b,0x0a,0x64,0x64,0x3d,0x66,0x6d,0x61,0x5f,0x62,0x72,
|
|
||||||
0x65,0x61,0x6b,0x28,0x64,0x64,0x29,0x3b,0x0a,0x2a,0x64,0x3d,0x5f,0x6d,0x6d,0x5f,0x61,0x64,0x64,0x5f,0x70,0x73,0x28,0x2a,0x64,0x2c,0x64,0x64,0x29,0x3b,0x0a,0x2a,
|
|
||||||
0x63,0x3d,0x5f,0x6d,0x6d,0x5f,0x61,0x64,0x64,0x5f,0x70,0x73,0x28,0x2a,0x63,0x2c,0x72,0x6e,0x64,0x5f,0x63,0x29,0x3b,0x0a,0x2a,0x63,0x3d,0x5f,0x6d,0x6d,0x5f,0x61,
|
|
||||||
0x64,0x64,0x5f,0x70,0x73,0x28,0x2a,0x63,0x2c,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x30,0x2e,0x37,0x33,0x34,0x33,0x37,0x35,0x66,0x29,0x29,0x3b,0x0a,0x66,
|
|
||||||
0x6c,0x6f,0x61,0x74,0x34,0x20,0x72,0x3d,0x5f,0x6d,0x6d,0x5f,0x61,0x64,0x64,0x5f,0x70,0x73,0x28,0x6e,0x6e,0x2c,0x64,0x64,0x29,0x3b,0x0a,0x72,0x3d,0x5f,0x6d,0x6d,
|
|
||||||
0x5f,0x61,0x6e,0x64,0x5f,0x70,0x73,0x28,0x72,0x2c,0x30,0x78,0x38,0x30,0x37,0x46,0x46,0x46,0x46,0x46,0x29,0x3b,0x0a,0x72,0x3d,0x5f,0x6d,0x6d,0x5f,0x6f,0x72,0x5f,
|
|
||||||
0x70,0x73,0x28,0x72,0x2c,0x30,0x78,0x34,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x29,0x3b,0x0a,0x2a,0x63,0x3d,0x5f,0x6d,0x6d,0x5f,0x61,0x64,0x64,0x5f,0x70,0x73,0x28,
|
|
||||||
0x2a,0x63,0x2c,0x72,0x29,0x3b,0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x63,0x6f,0x6d,0x70,0x75,
|
|
||||||
0x74,0x65,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x30,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x31,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x32,
|
|
||||||
0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x33,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x72,0x6e,0x64,0x5f,0x63,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x2a,0x20,
|
|
||||||
0x63,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x2a,0x20,0x72,0x29,0x0a,0x7b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x3d,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,
|
|
||||||
0x28,0x30,0x2e,0x30,0x66,0x29,0x3b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x3d,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x30,0x2e,0x30,0x66,0x29,0x3b,
|
|
||||||
0x0a,0x73,0x75,0x62,0x5f,0x72,0x6f,0x75,0x6e,0x64,0x28,0x6e,0x30,0x2c,0x6e,0x31,0x2c,0x6e,0x32,0x2c,0x6e,0x33,0x2c,0x72,0x6e,0x64,0x5f,0x63,0x2c,0x26,0x6e,0x2c,
|
|
||||||
0x26,0x64,0x2c,0x63,0x29,0x3b,0x0a,0x73,0x75,0x62,0x5f,0x72,0x6f,0x75,0x6e,0x64,0x28,0x6e,0x31,0x2c,0x6e,0x32,0x2c,0x6e,0x33,0x2c,0x6e,0x30,0x2c,0x72,0x6e,0x64,
|
|
||||||
0x5f,0x63,0x2c,0x26,0x6e,0x2c,0x26,0x64,0x2c,0x63,0x29,0x3b,0x0a,0x73,0x75,0x62,0x5f,0x72,0x6f,0x75,0x6e,0x64,0x28,0x6e,0x32,0x2c,0x6e,0x33,0x2c,0x6e,0x30,0x2c,
|
|
||||||
0x6e,0x31,0x2c,0x72,0x6e,0x64,0x5f,0x63,0x2c,0x26,0x6e,0x2c,0x26,0x64,0x2c,0x63,0x29,0x3b,0x0a,0x73,0x75,0x62,0x5f,0x72,0x6f,0x75,0x6e,0x64,0x28,0x6e,0x33,0x2c,
|
|
||||||
0x6e,0x30,0x2c,0x6e,0x31,0x2c,0x6e,0x32,0x2c,0x72,0x6e,0x64,0x5f,0x63,0x2c,0x26,0x6e,0x2c,0x26,0x64,0x2c,0x63,0x29,0x3b,0x0a,0x73,0x75,0x62,0x5f,0x72,0x6f,0x75,
|
|
||||||
0x6e,0x64,0x28,0x6e,0x33,0x2c,0x6e,0x32,0x2c,0x6e,0x31,0x2c,0x6e,0x30,0x2c,0x72,0x6e,0x64,0x5f,0x63,0x2c,0x26,0x6e,0x2c,0x26,0x64,0x2c,0x63,0x29,0x3b,0x0a,0x73,
|
|
||||||
0x75,0x62,0x5f,0x72,0x6f,0x75,0x6e,0x64,0x28,0x6e,0x32,0x2c,0x6e,0x31,0x2c,0x6e,0x30,0x2c,0x6e,0x33,0x2c,0x72,0x6e,0x64,0x5f,0x63,0x2c,0x26,0x6e,0x2c,0x26,0x64,
|
|
||||||
0x2c,0x63,0x29,0x3b,0x0a,0x73,0x75,0x62,0x5f,0x72,0x6f,0x75,0x6e,0x64,0x28,0x6e,0x31,0x2c,0x6e,0x30,0x2c,0x6e,0x33,0x2c,0x6e,0x32,0x2c,0x72,0x6e,0x64,0x5f,0x63,
|
|
||||||
0x2c,0x26,0x6e,0x2c,0x26,0x64,0x2c,0x63,0x29,0x3b,0x0a,0x73,0x75,0x62,0x5f,0x72,0x6f,0x75,0x6e,0x64,0x28,0x6e,0x30,0x2c,0x6e,0x33,0x2c,0x6e,0x32,0x2c,0x6e,0x31,
|
|
||||||
0x2c,0x72,0x6e,0x64,0x5f,0x63,0x2c,0x26,0x6e,0x2c,0x26,0x64,0x2c,0x63,0x29,0x3b,0x0a,0x64,0x3d,0x5f,0x6d,0x6d,0x5f,0x61,0x6e,0x64,0x5f,0x70,0x73,0x28,0x64,0x2c,
|
|
||||||
0x30,0x78,0x46,0x46,0x37,0x46,0x46,0x46,0x46,0x46,0x29,0x3b,0x0a,0x64,0x3d,0x5f,0x6d,0x6d,0x5f,0x6f,0x72,0x5f,0x70,0x73,0x28,0x64,0x2c,0x30,0x78,0x34,0x30,0x30,
|
|
||||||
0x30,0x30,0x30,0x30,0x30,0x29,0x3b,0x0a,0x2a,0x72,0x20,0x3d,0x5f,0x6d,0x6d,0x5f,0x61,0x64,0x64,0x5f,0x70,0x73,0x28,0x2a,0x72,0x2c,0x5f,0x6d,0x6d,0x5f,0x64,0x69,
|
|
||||||
0x76,0x5f,0x70,0x73,0x28,0x6e,0x2c,0x64,0x29,0x29,0x3b,0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x69,0x6e,0x67,0x6c,0x65,
|
|
||||||
0x5f,0x63,0x6f,0x6d,0x75,0x70,0x74,0x65,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x30,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x31,0x2c,0x66,0x6c,0x6f,
|
|
||||||
0x61,0x74,0x34,0x20,0x6e,0x32,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x33,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x20,0x63,0x6e,0x74,0x2c,0x66,0x6c,0x6f,0x61,0x74,
|
|
||||||
0x34,0x20,0x72,0x6e,0x64,0x5f,0x63,0x2c,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x2a,0x20,0x73,0x75,0x6d,0x29,0x0a,0x7b,0x0a,0x66,
|
|
||||||
0x6c,0x6f,0x61,0x74,0x34,0x20,0x63,0x3d,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x63,0x6e,0x74,0x29,0x3b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x72,
|
|
||||||
0x3d,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x30,0x2e,0x30,0x66,0x29,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,
|
|
||||||
0x3c,0x34,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x20,0x7b,0x0a,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x63,0x6f,0x6d,0x70,0x75,0x74,0x65,0x28,0x6e,0x30,0x2c,0x6e,0x31,0x2c,0x6e,
|
|
||||||
0x32,0x2c,0x6e,0x33,0x2c,0x72,0x6e,0x64,0x5f,0x63,0x2c,0x26,0x63,0x2c,0x26,0x72,0x29,0x3b,0x0a,0x7d,0x0a,0x72,0x3d,0x5f,0x6d,0x6d,0x5f,0x61,0x6e,0x64,0x5f,0x70,
|
|
||||||
0x73,0x28,0x72,0x2c,0x30,0x78,0x38,0x30,0x37,0x46,0x46,0x46,0x46,0x46,0x29,0x3b,0x0a,0x72,0x3d,0x5f,0x6d,0x6d,0x5f,0x6f,0x72,0x5f,0x70,0x73,0x28,0x72,0x2c,0x30,
|
|
||||||
0x78,0x34,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x29,0x3b,0x0a,0x2a,0x73,0x75,0x6d,0x3d,0x72,0x3b,0x20,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x78,0x3d,0x28,0x66,
|
|
||||||
0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x35,0x33,0x36,0x38,0x37,0x30,0x38,0x38,0x30,0x2e,0x30,0x66,0x29,0x3b,0x0a,0x72,0x3d,0x5f,0x6d,0x6d,0x5f,0x6d,0x75,0x6c,0x5f,
|
|
||||||
0x70,0x73,0x28,0x72,0x2c,0x78,0x29,0x3b,0x20,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x69,0x6e,0x74,0x34,0x5f,0x72,0x74,
|
|
||||||
0x65,0x28,0x72,0x29,0x3b,0x0a,0x7d,0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x69,0x6e,0x67,0x6c,0x65,0x5f,0x63,0x6f,0x6d,0x75,0x70,
|
|
||||||
0x74,0x65,0x5f,0x77,0x72,0x61,0x70,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x72,0x6f,0x74,0x2c,0x69,0x6e,0x74,0x34,0x20,0x76,0x30,0x2c,0x69,
|
|
||||||
0x6e,0x74,0x34,0x20,0x76,0x31,0x2c,0x69,0x6e,0x74,0x34,0x20,0x76,0x32,0x2c,0x69,0x6e,0x74,0x34,0x20,0x76,0x33,0x2c,0x66,0x6c,0x6f,0x61,0x74,0x20,0x63,0x6e,0x74,
|
|
||||||
0x2c,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x72,0x6e,0x64,0x5f,0x63,0x2c,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x2a,0x20,0x73,0x75,
|
|
||||||
0x6d,0x2c,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x69,0x6e,0x74,0x34,0x2a,0x20,0x6f,0x75,0x74,0x29,0x0a,0x7b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6e,0x30,
|
|
||||||
0x3d,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x5f,0x72,0x74,0x65,0x28,0x76,0x30,0x29,0x3b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,
|
|
||||||
0x6e,0x31,0x3d,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x5f,0x72,0x74,0x65,0x28,0x76,0x31,0x29,0x3b,0x0a,0x66,0x6c,0x6f,0x61,0x74,
|
|
||||||
0x34,0x20,0x6e,0x32,0x3d,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x5f,0x72,0x74,0x65,0x28,0x76,0x32,0x29,0x3b,0x0a,0x66,0x6c,0x6f,
|
|
||||||
0x61,0x74,0x34,0x20,0x6e,0x33,0x3d,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x5f,0x72,0x74,0x65,0x28,0x76,0x33,0x29,0x3b,0x0a,0x69,
|
|
||||||
0x6e,0x74,0x34,0x20,0x72,0x3d,0x73,0x69,0x6e,0x67,0x6c,0x65,0x5f,0x63,0x6f,0x6d,0x75,0x70,0x74,0x65,0x28,0x6e,0x30,0x2c,0x6e,0x31,0x2c,0x6e,0x32,0x2c,0x6e,0x33,
|
|
||||||
0x2c,0x63,0x6e,0x74,0x2c,0x72,0x6e,0x64,0x5f,0x63,0x2c,0x73,0x75,0x6d,0x29,0x3b,0x0a,0x2a,0x6f,0x75,0x74,0x3d,0x72,0x6f,0x74,0x3d,0x3d,0x30,0x3f,0x72,0x3a,0x5f,
|
|
||||||
0x6d,0x6d,0x5f,0x61,0x6c,0x69,0x67,0x6e,0x72,0x5f,0x65,0x70,0x69,0x38,0x28,0x72,0x2c,0x72,0x6f,0x74,0x29,0x3b,0x0a,0x7d,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
|
|
||||||
0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x6f,0x6f,0x6b,0x5b,0x31,0x36,0x5d,0x5b,0x34,
|
|
||||||
0x5d,0x3d,0x7b,0x0a,0x7b,0x30,0x2c,0x31,0x2c,0x32,0x2c,0x33,0x7d,0x2c,0x0a,0x7b,0x30,0x2c,0x32,0x2c,0x33,0x2c,0x31,0x7d,0x2c,0x0a,0x7b,0x30,0x2c,0x33,0x2c,0x31,
|
|
||||||
0x2c,0x32,0x7d,0x2c,0x0a,0x7b,0x30,0x2c,0x33,0x2c,0x32,0x2c,0x31,0x7d,0x2c,0x0a,0x7b,0x31,0x2c,0x30,0x2c,0x32,0x2c,0x33,0x7d,0x2c,0x0a,0x7b,0x31,0x2c,0x32,0x2c,
|
|
||||||
0x33,0x2c,0x30,0x7d,0x2c,0x0a,0x7b,0x31,0x2c,0x33,0x2c,0x30,0x2c,0x32,0x7d,0x2c,0x0a,0x7b,0x31,0x2c,0x33,0x2c,0x32,0x2c,0x30,0x7d,0x2c,0x0a,0x7b,0x32,0x2c,0x31,
|
|
||||||
0x2c,0x30,0x2c,0x33,0x7d,0x2c,0x0a,0x7b,0x32,0x2c,0x30,0x2c,0x33,0x2c,0x31,0x7d,0x2c,0x0a,0x7b,0x32,0x2c,0x33,0x2c,0x31,0x2c,0x30,0x7d,0x2c,0x0a,0x7b,0x32,0x2c,
|
|
||||||
0x33,0x2c,0x30,0x2c,0x31,0x7d,0x2c,0x0a,0x7b,0x33,0x2c,0x31,0x2c,0x32,0x2c,0x30,0x7d,0x2c,0x0a,0x7b,0x33,0x2c,0x32,0x2c,0x30,0x2c,0x31,0x7d,0x2c,0x0a,0x7b,0x33,
|
|
||||||
0x2c,0x30,0x2c,0x31,0x2c,0x32,0x7d,0x2c,0x0a,0x7b,0x33,0x2c,0x30,0x2c,0x32,0x2c,0x31,0x7d,0x0a,0x7d,0x3b,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,
|
|
||||||
0x73,0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x63,0x63,0x6e,0x74,0x5b,0x31,0x36,0x5d,0x3d,0x7b,0x0a,0x31,
|
|
||||||
0x2e,0x33,0x34,0x33,0x37,0x35,0x66,0x2c,0x0a,0x31,0x2e,0x32,0x38,0x31,0x32,0x35,0x66,0x2c,0x0a,0x31,0x2e,0x33,0x35,0x39,0x33,0x37,0x35,0x66,0x2c,0x0a,0x31,0x2e,
|
|
||||||
0x33,0x36,0x37,0x31,0x38,0x37,0x35,0x66,0x2c,0x0a,0x31,0x2e,0x34,0x32,0x39,0x36,0x38,0x37,0x35,0x66,0x2c,0x0a,0x31,0x2e,0x33,0x39,0x38,0x34,0x33,0x37,0x35,0x66,
|
|
||||||
0x2c,0x0a,0x31,0x2e,0x33,0x38,0x32,0x38,0x31,0x32,0x35,0x66,0x2c,0x0a,0x31,0x2e,0x33,0x30,0x34,0x36,0x38,0x37,0x35,0x66,0x2c,0x0a,0x31,0x2e,0x34,0x31,0x34,0x30,
|
|
||||||
0x36,0x32,0x35,0x66,0x2c,0x0a,0x31,0x2e,0x32,0x37,0x33,0x34,0x33,0x37,0x35,0x66,0x2c,0x0a,0x31,0x2e,0x32,0x35,0x37,0x38,0x31,0x32,0x35,0x66,0x2c,0x0a,0x31,0x2e,
|
|
||||||
0x32,0x38,0x39,0x30,0x36,0x32,0x35,0x66,0x2c,0x0a,0x31,0x2e,0x33,0x32,0x30,0x33,0x31,0x32,0x35,0x66,0x2c,0x0a,0x31,0x2e,0x33,0x35,0x31,0x35,0x36,0x32,0x35,0x66,
|
|
||||||
0x2c,0x0a,0x31,0x2e,0x33,0x33,0x35,0x39,0x33,0x37,0x35,0x66,0x2c,0x0a,0x31,0x2e,0x34,0x36,0x30,0x39,0x33,0x37,0x35,0x66,0x0a,0x7d,0x3b,0x0a,0x73,0x74,0x72,0x75,
|
|
||||||
0x63,0x74,0x20,0x53,0x68,0x61,0x72,0x65,0x64,0x4d,0x65,0x6d,0x43,0x68,0x75,0x6e,0x6b,0x0a,0x7b,0x0a,0x69,0x6e,0x74,0x34,0x20,0x6f,0x75,0x74,0x5b,0x31,0x36,0x5d,
|
|
||||||
0x3b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x5b,0x31,0x36,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,
|
|
||||||
0x5f,0x28,0x28,0x72,0x65,0x71,0x64,0x5f,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,
|
|
||||||
0x2a,0x31,0x36,0x2c,0x31,0x2c,0x31,0x29,0x29,0x29,0x0a,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6e,0x31,0x28,0x5f,0x5f,0x67,
|
|
||||||
0x6c,0x6f,0x62,0x61,0x6c,0x20,0x69,0x6e,0x74,0x20,0x2a,0x6c,0x70,0x61,0x64,0x5f,0x69,0x6e,0x2c,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x69,0x6e,0x74,0x20,
|
|
||||||
0x2a,0x73,0x70,0x61,0x64,0x2c,0x75,0x69,0x6e,0x74,0x20,0x6e,0x75,0x6d,0x54,0x68,0x72,0x65,0x61,0x64,0x73,0x29,0x0a,0x7b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,
|
|
||||||
0x69,0x6e,0x74,0x20,0x67,0x49,0x64,0x78,0x3d,0x67,0x65,0x74,0x49,0x64,0x78,0x28,0x29,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x63,0x68,0x75,0x6e,0x6b,0x3d,0x67,0x65,
|
|
||||||
0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2f,0x31,0x36,0x3b,0x0a,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x69,0x6e,0x74,0x2a,0x20,
|
|
||||||
0x6c,0x70,0x61,0x64,0x3d,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x69,0x6e,0x74,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,
|
|
||||||
0x68,0x61,0x72,0x2a,0x29,0x6c,0x70,0x61,0x64,0x5f,0x69,0x6e,0x2b,0x4d,0x45,0x4d,0x4f,0x52,0x59,0x2a,0x28,0x67,0x49,0x64,0x78,0x2f,0x31,0x36,0x29,0x29,0x3b,0x0a,
|
|
||||||
0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x53,0x68,0x61,0x72,0x65,0x64,0x4d,0x65,0x6d,0x43,0x68,0x75,0x6e,0x6b,0x20,0x73,0x6d,
|
|
||||||
0x65,0x6d,0x5f,0x69,0x6e,0x5b,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x5d,0x3b,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x74,0x72,0x75,0x63,0x74,0x20,
|
|
||||||
0x53,0x68,0x61,0x72,0x65,0x64,0x4d,0x65,0x6d,0x43,0x68,0x75,0x6e,0x6b,0x2a,0x20,0x73,0x6d,0x65,0x6d,0x3d,0x73,0x6d,0x65,0x6d,0x5f,0x69,0x6e,0x2b,0x63,0x68,0x75,
|
|
||||||
0x6e,0x6b,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x74,0x69,0x64,0x3d,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x20,0x25,0x20,0x31,
|
|
||||||
0x36,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x48,0x61,0x73,0x68,0x3d,0x67,0x49,0x64,0x78,0x2f,0x31,0x36,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x73,0x3d,
|
|
||||||
0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x73,0x70,0x61,0x64,0x29,0x5b,0x69,0x64,0x78,0x48,0x61,0x73,0x68,0x2a,0x35,
|
|
||||||
0x30,0x5d,0x3e,0x3e,0x38,0x3b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x73,0x3d,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x28,0x30,0x29,0x3b,0x0a,0x63,0x6f,
|
|
||||||
0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x74,0x69,0x64,0x64,0x3d,0x74,0x69,0x64,0x2f,0x34,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,
|
|
||||||
0x74,0x69,0x64,0x6d,0x3d,0x74,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x3d,0x74,
|
|
||||||
0x69,0x64,0x64,0x2a,0x31,0x36,0x2b,0x74,0x69,0x64,0x6d,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x43,0x4e,0x5f,0x55,
|
|
||||||
0x4e,0x52,0x4f,0x4c,0x4c,0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x49,0x54,0x45,0x52,0x41,0x54,0x49,0x4f,0x4e,
|
|
||||||
0x53,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0x0a,0x6d,0x65,0x6d,0x5f,0x66,0x65,0x6e,0x63,0x65,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,
|
|
||||||
0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x69,0x6e,0x74,0x20,0x74,0x6d,0x70,0x3d,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x69,0x6e,0x74,
|
|
||||||
0x2a,0x29,0x73,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5f,0x70,0x74,0x72,0x28,0x73,0x2c,0x74,0x69,0x64,0x64,0x2c,0x6c,0x70,0x61,0x64,0x29,0x29,0x5b,0x74,
|
|
||||||
0x69,0x64,0x6d,0x5d,0x3b,0x0a,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x69,0x6e,0x74,0x2a,0x29,0x28,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x29,
|
|
||||||
0x29,0x5b,0x74,0x69,0x64,0x5d,0x3d,0x74,0x6d,0x70,0x3b,0x0a,0x6d,0x65,0x6d,0x5f,0x66,0x65,0x6e,0x63,0x65,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,
|
|
||||||
0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x7b,0x0a,0x73,0x69,0x6e,0x67,0x6c,0x65,0x5f,0x63,0x6f,0x6d,0x75,0x70,0x74,0x65,0x5f,0x77,0x72,0x61,
|
|
||||||
0x70,0x28,0x0a,0x74,0x69,0x64,0x6d,0x2c,0x0a,0x2a,0x28,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x2b,0x6c,0x6f,0x6f,0x6b,0x5b,0x74,0x69,0x64,0x5d,0x5b,0x30,
|
|
||||||
0x5d,0x29,0x2c,0x0a,0x2a,0x28,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x2b,0x6c,0x6f,0x6f,0x6b,0x5b,0x74,0x69,0x64,0x5d,0x5b,0x31,0x5d,0x29,0x2c,0x0a,0x2a,
|
|
||||||
0x28,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x2b,0x6c,0x6f,0x6f,0x6b,0x5b,0x74,0x69,0x64,0x5d,0x5b,0x32,0x5d,0x29,0x2c,0x0a,0x2a,0x28,0x73,0x6d,0x65,0x6d,
|
|
||||||
0x2d,0x3e,0x6f,0x75,0x74,0x2b,0x6c,0x6f,0x6f,0x6b,0x5b,0x74,0x69,0x64,0x5d,0x5b,0x33,0x5d,0x29,0x2c,0x0a,0x63,0x63,0x6e,0x74,0x5b,0x74,0x69,0x64,0x5d,0x2c,0x76,
|
|
||||||
0x73,0x2c,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x76,0x61,0x2b,0x74,0x69,0x64,0x2c,0x0a,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x2b,0x74,0x69,0x64,0x0a,0x29,0x3b,
|
|
||||||
0x0a,0x7d,0x0a,0x6d,0x65,0x6d,0x5f,0x66,0x65,0x6e,0x63,0x65,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,
|
|
||||||
0x29,0x3b,0x0a,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x58,0x6f,0x72,0x3d,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x69,0x6e,0x74,0x2a,0x29,0x73,0x6d,0x65,
|
|
||||||
0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x29,0x5b,0x62,0x6c,0x6f,0x63,0x6b,0x5d,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,0x6e,0x74,0x20,0x64,0x64,0x3d,0x62,0x6c,0x6f,
|
|
||||||
0x63,0x6b,0x2b,0x34,0x3b,0x20,0x64,0x64,0x3c,0x28,0x74,0x69,0x64,0x64,0x2b,0x31,0x29,0x2a,0x31,0x36,0x3b,0x20,0x64,0x64,0x2b,0x3d,0x34,0x29,0x20,0x7b,0x0a,0x6f,
|
|
||||||
0x75,0x74,0x58,0x6f,0x72,0x20,0x5e,0x3d,0x20,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x69,0x6e,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,
|
|
||||||
0x74,0x29,0x5b,0x64,0x64,0x5d,0x3b,0x0a,0x7d,0x0a,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x69,0x6e,0x74,0x2a,0x29,0x73,0x63,0x72,0x61,0x74,0x63,
|
|
||||||
0x68,0x70,0x61,0x64,0x5f,0x70,0x74,0x72,0x28,0x73,0x2c,0x74,0x69,0x64,0x64,0x2c,0x6c,0x70,0x61,0x64,0x29,0x29,0x5b,0x74,0x69,0x64,0x6d,0x5d,0x3d,0x6f,0x75,0x74,
|
|
||||||
0x58,0x6f,0x72,0x5e,0x74,0x6d,0x70,0x3b,0x0a,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x69,0x6e,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,
|
|
||||||
0x74,0x29,0x5b,0x74,0x69,0x64,0x5d,0x3d,0x6f,0x75,0x74,0x58,0x6f,0x72,0x3b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x76,0x61,0x5f,0x74,0x6d,0x70,0x31,0x3d,0x28,0x28,
|
|
||||||
0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x76,0x61,0x29,0x5b,0x62,0x6c,0x6f,0x63,0x6b,0x5d,0x2b,
|
|
||||||
0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x76,0x61,0x29,0x5b,0x62,0x6c,0x6f,0x63,0x6b,
|
|
||||||
0x2b,0x34,0x5d,0x3b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x76,0x61,0x5f,0x74,0x6d,0x70,0x32,0x3d,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x66,0x6c,0x6f,
|
|
||||||
0x61,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x76,0x61,0x29,0x5b,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x20,0x38,0x5d,0x2b,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,
|
|
||||||
0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x76,0x61,0x29,0x5b,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x32,0x5d,0x3b,0x0a,0x28,0x28,
|
|
||||||
0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x76,0x61,0x29,0x5b,0x74,0x69,0x64,0x5d,0x3d,0x76,0x61,
|
|
||||||
0x5f,0x74,0x6d,0x70,0x31,0x2b,0x76,0x61,0x5f,0x74,0x6d,0x70,0x32,0x3b,0x0a,0x6d,0x65,0x6d,0x5f,0x66,0x65,0x6e,0x63,0x65,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,
|
|
||||||
0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x32,0x3d,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,
|
|
||||||
0x6c,0x20,0x69,0x6e,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x29,0x5b,0x74,0x69,0x64,0x5d,0x5e,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,
|
|
||||||
0x20,0x69,0x6e,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x29,0x5b,0x74,0x69,0x64,0x2b,0x34,0x20,0x5d,0x5e,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,
|
|
||||||
0x61,0x6c,0x20,0x69,0x6e,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x29,0x5b,0x74,0x69,0x64,0x2b,0x38,0x5d,0x5e,0x28,0x28,0x5f,0x5f,0x6c,0x6f,
|
|
||||||
0x63,0x61,0x6c,0x20,0x69,0x6e,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x29,0x5b,0x74,0x69,0x64,0x2b,0x31,0x32,0x5d,0x3b,0x0a,0x76,0x61,0x5f,
|
|
||||||
0x74,0x6d,0x70,0x31,0x3d,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x76,0x61,0x29,0x5b,
|
|
||||||
0x62,0x6c,0x6f,0x63,0x6b,0x5d,0x2b,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x76,0x61,
|
|
||||||
0x29,0x5b,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x34,0x5d,0x3b,0x0a,0x76,0x61,0x5f,0x74,0x6d,0x70,0x32,0x3d,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x66,0x6c,
|
|
||||||
0x6f,0x61,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x76,0x61,0x29,0x5b,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x38,0x5d,0x2b,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,
|
|
||||||
0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x76,0x61,0x29,0x5b,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x32,0x5d,0x3b,0x0a,0x76,0x61,
|
|
||||||
0x5f,0x74,0x6d,0x70,0x31,0x3d,0x76,0x61,0x5f,0x74,0x6d,0x70,0x31,0x2b,0x76,0x61,0x5f,0x74,0x6d,0x70,0x32,0x3b,0x0a,0x76,0x61,0x5f,0x74,0x6d,0x70,0x31,0x3d,0x66,
|
|
||||||
0x61,0x62,0x73,0x28,0x76,0x61,0x5f,0x74,0x6d,0x70,0x31,0x29,0x3b,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x78,0x3d,0x76,0x61,0x5f,0x74,0x6d,0x70,0x31,0x2a,0x31,
|
|
||||||
0x36,0x37,0x37,0x37,0x32,0x31,0x36,0x2e,0x30,0x66,0x3b,0x0a,0x69,0x6e,0x74,0x20,0x78,0x78,0x5f,0x69,0x6e,0x74,0x3d,0x28,0x69,0x6e,0x74,0x29,0x78,0x78,0x3b,0x0a,
|
|
||||||
0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x69,0x6e,0x74,0x2a,0x29,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x29,0x5b,0x74,0x69,0x64,0x5d,0x3d,0x6f,
|
|
||||||
0x75,0x74,0x32,0x5e,0x78,0x78,0x5f,0x69,0x6e,0x74,0x3b,0x0a,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x2a,0x29,0x73,0x6d,0x65,
|
|
||||||
0x6d,0x2d,0x3e,0x76,0x61,0x29,0x5b,0x74,0x69,0x64,0x5d,0x3d,0x76,0x61,0x5f,0x74,0x6d,0x70,0x31,0x2f,0x36,0x34,0x2e,0x30,0x66,0x3b,0x0a,0x6d,0x65,0x6d,0x5f,0x66,
|
|
||||||
0x65,0x6e,0x63,0x65,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x76,0x73,0x3d,0x73,0x6d,
|
|
||||||
0x65,0x6d,0x2d,0x3e,0x76,0x61,0x5b,0x30,0x5d,0x3b,0x0a,0x73,0x3d,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x5b,0x30,0x5d,0x2e,0x78,0x5e,0x73,0x6d,0x65,0x6d,
|
|
||||||
0x2d,0x3e,0x6f,0x75,0x74,0x5b,0x30,0x5d,0x2e,0x79,0x5e,0x73,0x6d,0x65,0x6d,0x2d,0x3e,0x6f,0x75,0x74,0x5b,0x30,0x5d,0x2e,0x7a,0x5e,0x73,0x6d,0x65,0x6d,0x2d,0x3e,
|
|
||||||
0x6f,0x75,0x74,0x5b,0x30,0x5d,0x2e,0x77,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x63,0x6f,0x6e,
|
|
||||||
0x73,0x74,0x61,0x6e,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x73,0x6b,0x69,0x70,0x5b,0x33,0x5d,0x3d,0x7b,0x0a,0x32,0x30,0x2c,0x32,0x32,0x2c,0x32,0x32,0x0a,0x7d,0x3b,
|
|
||||||
0x0a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6e,0x65,0x72,0x61,0x74,0x65,0x5f,0x35,0x31,0x32,0x28,0x75,0x69,0x6e,0x74,0x20,0x69,
|
|
||||||
0x64,0x78,0x2c,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x2a,0x20,0x69,0x6e,0x2c,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x6c,
|
|
||||||
0x6f,0x6e,0x67,0x2a,0x20,0x6f,0x75,0x74,0x29,0x0a,0x7b,0x0a,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x68,0x61,0x73,0x68,0x5b,0x32,0x35,0x5d,0x3b,0x0a,0x68,0x61,0x73,0x68,
|
|
||||||
0x5b,0x30,0x5d,0x3d,0x69,0x6e,0x5b,0x30,0x5d,0x5e,0x69,0x64,0x78,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x31,0x3b,0x20,0x69,0x3c,0x32,
|
|
||||||
0x35,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x20,0x7b,0x0a,0x68,0x61,0x73,0x68,0x5b,0x69,0x5d,0x3d,0x69,0x6e,0x5b,0x69,0x5d,0x3b,0x0a,0x7d,0x0a,0x66,0x6f,0x72,0x20,0x28,
|
|
||||||
0x69,0x6e,0x74,0x20,0x61,0x3d,0x30,0x3b,0x20,0x61,0x3c,0x33,0x3b,0x20,0x2b,0x2b,0x61,0x29,0x20,0x7b,0x0a,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x31,0x36,0x30,0x30,
|
|
||||||
0x5f,0x31,0x28,0x68,0x61,0x73,0x68,0x29,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x6b,0x69,0x70,0x5b,0x61,
|
|
||||||
0x5d,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x20,0x7b,0x0a,0x6f,0x75,0x74,0x5b,0x69,0x5d,0x3d,0x68,0x61,0x73,0x68,0x5b,0x69,0x5d,0x3b,0x0a,0x7d,0x0a,0x6f,0x75,0x74,0x2b,
|
|
||||||
0x3d,0x73,0x6b,0x69,0x70,0x5b,0x61,0x5d,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x72,0x65,0x71,
|
|
||||||
0x64,0x5f,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x38,0x2c,0x38,0x2c,0x31,0x29,0x29,0x29,0x0a,0x5f,0x5f,0x6b,0x65,0x72,
|
|
||||||
0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6e,0x30,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x2a,0x69,0x6e,0x70,
|
|
||||||
0x75,0x74,0x2c,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x69,0x6e,0x74,0x20,0x2a,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x2c,0x5f,0x5f,0x67,0x6c,
|
|
||||||
0x6f,0x62,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x2a,0x73,0x74,0x61,0x74,0x65,0x73,0x2c,0x75,0x69,0x6e,0x74,0x20,0x54,0x68,0x72,0x65,0x61,0x64,0x73,0x29,
|
|
||||||
0x0a,0x7b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x67,0x49,0x64,0x78,0x3d,0x67,0x65,0x74,0x49,0x64,0x78,0x28,0x29,0x3b,0x0a,0x5f,0x5f,0x6c,
|
|
||||||
0x6f,0x63,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x53,0x74,0x61,0x74,0x65,0x5f,0x62,0x75,0x66,0x5b,0x38,0x2a,0x32,0x35,0x5d,0x3b,0x0a,0x5f,0x5f,0x6c,0x6f,
|
|
||||||
0x63,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x2a,0x20,0x53,0x74,0x61,0x74,0x65,0x3d,0x53,0x74,0x61,0x74,0x65,0x5f,0x62,0x75,0x66,0x2b,0x67,0x65,0x74,0x5f,0x6c,
|
|
||||||
0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2a,0x32,0x35,0x3b,0x0a,0x7b,0x0a,0x73,0x74,0x61,0x74,0x65,0x73,0x2b,0x3d,0x32,0x35,0x2a,0x67,0x49,0x64,0x78,
|
|
||||||
0x3b,0x0a,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x3d,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x69,0x6e,0x74,0x2a,0x29,0x28,0x28,0x5f,0x5f,
|
|
||||||
0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x68,0x61,0x72,0x2a,0x29,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x2b,0x4d,0x45,0x4d,0x4f,0x52,0x59,0x2a,0x67,
|
|
||||||
0x49,0x64,0x78,0x29,0x3b,0x0a,0x69,0x66,0x28,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3d,0x3d,0x30,0x29,0x20,0x7b,0x0a,0x23,
|
|
||||||
0x69,0x66,0x64,0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x0a,0x66,0x6f,0x72,0x28,0x75,0x69,0x6e,0x74,
|
|
||||||
0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x38,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x0a,0x53,0x74,0x61,0x74,0x65,0x5b,0x69,0x5d,0x3d,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,
|
|
||||||
0x5d,0x3b,0x0a,0x23,0x65,0x6c,0x73,0x65,0x0a,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x38,0x20,0x2a,0x29,0x53,0x74,0x61,0x74,
|
|
||||||
0x65,0x29,0x5b,0x30,0x5d,0x3d,0x76,0x6c,0x6f,0x61,0x64,0x38,0x28,0x30,0x2c,0x69,0x6e,0x70,0x75,0x74,0x29,0x3b,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x53,0x74,
|
|
||||||
0x61,0x74,0x65,0x5b,0x38,0x5d,0x3d,0x69,0x6e,0x70,0x75,0x74,0x5b,0x38,0x5d,0x3b,0x0a,0x53,0x74,0x61,0x74,0x65,0x5b,0x39,0x5d,0x3d,0x69,0x6e,0x70,0x75,0x74,0x5b,
|
|
||||||
0x39,0x5d,0x3b,0x0a,0x53,0x74,0x61,0x74,0x65,0x5b,0x31,0x30,0x5d,0x3d,0x69,0x6e,0x70,0x75,0x74,0x5b,0x31,0x30,0x5d,0x3b,0x0a,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,
|
|
||||||
0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x29,0x53,0x74,0x61,0x74,0x65,0x29,0x5b,0x39,0x5d,0x20,0x26,0x3d,0x20,0x30,0x78,0x30,0x30,0x46,0x46,0x46,0x46,0x46,
|
|
||||||
0x46,0x55,0x3b,0x0a,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x29,0x53,0x74,0x61,0x74,0x65,0x29,0x5b,0x39,0x5d,0x7c,0x3d,
|
|
||||||
0x28,0x28,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x29,0x26,0x30,0x78,0x46,0x46,0x29,0x3c,
|
|
||||||
0x3c,0x32,0x34,0x3b,0x0a,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x29,0x53,0x74,0x61,0x74,0x65,0x29,0x5b,0x31,0x30,0x5d,
|
|
||||||
0x20,0x26,0x3d,0x20,0x30,0x78,0x46,0x46,0x30,0x30,0x30,0x30,0x30,0x30,0x55,0x3b,0x0a,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,
|
|
||||||
0x2a,0x29,0x53,0x74,0x61,0x74,0x65,0x29,0x5b,0x31,0x30,0x5d,0x7c,0x3d,0x28,0x28,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,
|
|
||||||
0x5f,0x69,0x64,0x28,0x30,0x29,0x3e,0x3e,0x38,0x29,0x29,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x31,0x31,0x3b,0x20,0x69,0x3c,0x32,0x35,
|
|
||||||
0x3b,0x20,0x2b,0x2b,0x69,0x29,0x20,0x7b,0x0a,0x53,0x74,0x61,0x74,0x65,0x5b,0x69,0x5d,0x3d,0x30,0x78,0x30,0x30,0x55,0x4c,0x3b,0x0a,0x7d,0x0a,0x53,0x74,0x61,0x74,
|
|
||||||
0x65,0x5b,0x31,0x36,0x5d,0x3d,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x55,0x4c,0x3b,0x0a,0x6b,0x65,0x63,0x63,
|
|
||||||
0x61,0x6b,0x66,0x31,0x36,0x30,0x30,0x5f,0x32,0x28,0x53,0x74,0x61,0x74,0x65,0x29,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,
|
|
||||||
0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x32,0x35,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x20,0x7b,0x0a,0x73,0x74,0x61,0x74,
|
|
||||||
0x65,0x73,0x5b,0x69,0x5d,0x3d,0x53,0x74,0x61,0x74,0x65,0x5b,0x69,0x5d,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x7d,0x0a,0x7d,0x0a,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,
|
|
||||||
0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x72,0x65,0x71,0x64,0x5f,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x36,0x34,0x2c,0x31,
|
|
||||||
0x2c,0x31,0x29,0x29,0x29,0x0a,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6e,0x30,0x30,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,
|
|
||||||
0x6c,0x20,0x69,0x6e,0x74,0x20,0x2a,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x2c,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,
|
|
||||||
0x20,0x2a,0x73,0x74,0x61,0x74,0x65,0x73,0x29,0x0a,0x7b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x67,0x49,0x64,0x78,0x3d,0x67,0x65,0x74,0x49,
|
|
||||||
0x64,0x78,0x28,0x29,0x2f,0x36,0x34,0x3b,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x53,0x74,0x61,0x74,0x65,0x5b,0x32,0x35,0x5d,
|
|
||||||
0x3b,0x0a,0x73,0x74,0x61,0x74,0x65,0x73,0x2b,0x3d,0x32,0x35,0x2a,0x67,0x49,0x64,0x78,0x3b,0x0a,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x3d,0x28,0x5f,
|
|
||||||
0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x69,0x6e,0x74,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x68,0x61,0x72,0x2a,0x29,0x53,0x63,
|
|
||||||
0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x2b,0x4d,0x45,0x4d,0x4f,0x52,0x59,0x2a,0x67,0x49,0x64,0x78,0x29,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,
|
|
||||||
0x69,0x3d,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x69,0x3c,0x32,0x35,0x3b,0x20,0x69,0x2b,0x3d,0x67,0x65,0x74,0x5f,
|
|
||||||
0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x30,0x29,0x29,0x20,0x7b,0x0a,0x53,0x74,0x61,0x74,0x65,0x5b,0x69,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,
|
|
||||||
0x5b,0x69,0x5d,0x3b,0x0a,0x7d,0x0a,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,
|
|
||||||
0x43,0x45,0x29,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,0x6e,0x74,0x20,0x69,0x3d,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,
|
|
||||||
0x3b,0x20,0x69,0x3c,0x4d,0x45,0x4d,0x4f,0x52,0x59,0x2f,0x35,0x31,0x32,0x3b,0x20,0x69,0x2b,0x3d,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,
|
|
||||||
0x65,0x28,0x30,0x29,0x29,0x20,0x7b,0x0a,0x67,0x65,0x6e,0x65,0x72,0x61,0x74,0x65,0x5f,0x35,0x31,0x32,0x28,0x69,0x2c,0x53,0x74,0x61,0x74,0x65,0x2c,0x28,0x5f,0x5f,
|
|
||||||
0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,
|
|
||||||
0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x2b,0x69,0x2a,0x35,0x31,0x32,0x29,0x29,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,
|
|
||||||
0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x72,0x65,0x71,0x64,0x5f,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x38,0x2c,0x38,0x2c,
|
|
||||||
0x31,0x29,0x29,0x29,0x0a,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6e,0x32,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,
|
|
||||||
0x75,0x69,0x6e,0x74,0x34,0x20,0x2a,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x2c,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,
|
|
||||||
0x20,0x2a,0x73,0x74,0x61,0x74,0x65,0x73,0x2c,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x75,
|
|
||||||
0x6c,0x6f,0x6e,0x67,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x2c,0x75,0x69,0x6e,0x74,0x20,0x54,0x68,0x72,0x65,0x61,0x64,0x73,0x29,0x0a,0x7b,0x0a,0x5f,0x5f,0x6c,0x6f,
|
|
||||||
0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x41,0x45,0x53,0x30,0x5b,0x32,0x35,0x36,0x5d,0x2c,0x41,0x45,0x53,0x31,0x5b,0x32,0x35,0x36,0x5d,0x2c,0x41,0x45,0x53,
|
|
||||||
0x32,0x5b,0x32,0x35,0x36,0x5d,0x2c,0x41,0x45,0x53,0x33,0x5b,0x32,0x35,0x36,0x5d,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x45,0x78,0x70,0x61,0x6e,0x64,0x65,0x64,0x4b,
|
|
||||||
0x65,0x79,0x32,0x5b,0x34,0x30,0x5d,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x34,0x20,0x74,0x65,0x78,0x74,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,
|
|
||||||
0x67,0x49,0x64,0x78,0x3d,0x67,0x65,0x74,0x49,0x64,0x78,0x28,0x29,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x67,0x65,0x74,0x5f,0x6c,0x6f,
|
|
||||||
0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x2a,0x38,0x2b,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x69,0x3c,0x32,
|
|
||||||
0x35,0x36,0x3b,0x20,0x69,0x2b,0x3d,0x38,0x2a,0x38,0x29,0x20,0x7b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x74,0x6d,0x70,0x3d,0x41,0x45,0x53,
|
|
||||||
0x30,0x5f,0x43,0x5b,0x69,0x5d,0x3b,0x0a,0x41,0x45,0x53,0x30,0x5b,0x69,0x5d,0x3d,0x74,0x6d,0x70,0x3b,0x0a,0x41,0x45,0x53,0x31,0x5b,0x69,0x5d,0x3d,0x72,0x6f,0x74,
|
|
||||||
0x61,0x74,0x65,0x28,0x74,0x6d,0x70,0x2c,0x38,0x55,0x29,0x3b,0x0a,0x41,0x45,0x53,0x32,0x5b,0x69,0x5d,0x3d,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x74,0x6d,0x70,0x2c,
|
|
||||||
0x31,0x36,0x55,0x29,0x3b,0x0a,0x41,0x45,0x53,0x33,0x5b,0x69,0x5d,0x3d,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x74,0x6d,0x70,0x2c,0x32,0x34,0x55,0x29,0x3b,0x0a,0x7d,
|
|
||||||
0x0a,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x5f,
|
|
||||||
0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x78,0x69,0x6e,0x31,0x5b,0x38,0x5d,0x5b,0x38,0x5d,0x3b,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,
|
|
||||||
0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x78,0x69,0x6e,0x32,0x5b,0x38,0x5d,0x5b,0x38,0x5d,0x3b,0x0a,0x7b,0x0a,0x73,0x74,0x61,0x74,0x65,0x73,0x2b,0x3d,0x32,0x35,0x2a,
|
|
||||||
0x67,0x49,0x64,0x78,0x3b,0x0a,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x2b,0x3d,0x67,0x49,0x64,0x78,0x2a,0x28,0x4d,0x45,0x4d,0x4f,0x52,0x59,0x3e,0x3e,
|
|
||||||
0x34,0x29,0x3b,0x0a,0x23,0x69,0x66,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x28,0x5f,0x5f,0x54,0x61,0x68,0x69,0x74,0x69,0x5f,0x5f,0x29,0x20,0x7c,0x7c,0x20,0x64,
|
|
||||||
0x65,0x66,0x69,0x6e,0x65,0x64,0x28,0x5f,0x5f,0x50,0x69,0x74,0x63,0x61,0x69,0x72,0x6e,0x5f,0x5f,0x29,0x0a,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,
|
|
||||||
0x3b,0x20,0x69,0x3c,0x34,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x20,0x28,0x28,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x2a,0x29,0x45,0x78,0x70,0x61,0x6e,0x64,0x65,0x64,0x4b,0x65,
|
|
||||||
0x79,0x32,0x29,0x5b,0x69,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x69,0x2b,0x34,0x5d,0x3b,0x0a,0x74,0x65,0x78,0x74,0x3d,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,
|
|
||||||
0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x2b,0x34,0x2c,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,
|
|
||||||
0x20,0x2a,0x29,0x73,0x74,0x61,0x74,0x65,0x73,0x29,0x3b,0x0a,0x23,0x65,0x6c,0x73,0x65,0x0a,0x74,0x65,0x78,0x74,0x3d,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x65,
|
|
||||||
0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x2b,0x34,0x2c,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,
|
|
||||||
0x29,0x73,0x74,0x61,0x74,0x65,0x73,0x29,0x3b,0x0a,0x28,0x28,0x75,0x69,0x6e,0x74,0x38,0x20,0x2a,0x29,0x45,0x78,0x70,0x61,0x6e,0x64,0x65,0x64,0x4b,0x65,0x79,0x32,
|
|
||||||
0x29,0x5b,0x30,0x5d,0x3d,0x76,0x6c,0x6f,0x61,0x64,0x38,0x28,0x31,0x2c,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x20,0x2a,0x29,0x73,
|
|
||||||
0x74,0x61,0x74,0x65,0x73,0x29,0x3b,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x41,0x45,0x53,0x45,0x78,0x70,0x61,0x6e,0x64,0x4b,0x65,0x79,0x32,0x35,0x36,0x28,0x45,
|
|
||||||
0x78,0x70,0x61,0x6e,0x64,0x65,0x64,0x4b,0x65,0x79,0x32,0x29,0x3b,0x0a,0x7d,0x0a,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,
|
|
||||||
0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x2a,0x20,0x78,0x69,0x6e,
|
|
||||||
0x31,0x5f,0x73,0x74,0x6f,0x72,0x65,0x3d,0x26,0x78,0x69,0x6e,0x31,0x5b,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x5d,0x5b,0x67,
|
|
||||||
0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x5d,0x3b,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x2a,0x20,
|
|
||||||
0x78,0x69,0x6e,0x31,0x5f,0x6c,0x6f,0x61,0x64,0x3d,0x26,0x78,0x69,0x6e,0x31,0x5b,0x28,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,
|
|
||||||
0x2b,0x31,0x29,0x20,0x25,0x20,0x38,0x5d,0x5b,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x5d,0x3b,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,
|
|
||||||
0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x2a,0x20,0x78,0x69,0x6e,0x32,0x5f,0x73,0x74,0x6f,0x72,0x65,0x3d,0x26,0x78,0x69,0x6e,0x32,0x5b,0x67,0x65,0x74,0x5f,0x6c,
|
|
||||||
0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x5d,0x5b,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x5d,0x3b,0x0a,0x5f,0x5f,
|
|
||||||
0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x34,0x2a,0x20,0x78,0x69,0x6e,0x32,0x5f,0x6c,0x6f,0x61,0x64,0x3d,0x26,0x78,0x69,0x6e,0x32,0x5b,0x28,0x67,0x65,
|
|
||||||
0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x2b,0x31,0x29,0x20,0x25,0x20,0x38,0x5d,0x5b,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,
|
|
||||||
0x69,0x64,0x28,0x30,0x29,0x5d,0x3b,0x0a,0x2a,0x78,0x69,0x6e,0x32,0x5f,0x73,0x74,0x6f,0x72,0x65,0x3d,0x28,0x75,0x69,0x6e,0x74,0x34,0x29,0x28,0x30,0x2c,0x30,0x2c,
|
|
||||||
0x30,0x2c,0x30,0x29,0x3b,0x0a,0x7b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x32,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,
|
|
||||||
0x74,0x20,0x69,0x3d,0x30,0x2c,0x69,0x31,0x3d,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x69,0x3c,0x28,0x4d,0x45,0x4d,
|
|
||||||
0x4f,0x52,0x59,0x3e,0x3e,0x37,0x29,0x3b,0x20,0x2b,0x2b,0x69,0x2c,0x69,0x31,0x3d,0x28,0x69,0x31,0x2b,0x31,0x36,0x29,0x20,0x25,0x20,0x28,0x4d,0x45,0x4d,0x4f,0x52,
|
|
||||||
0x59,0x3e,0x3e,0x34,0x29,0x29,0x20,0x7b,0x0a,0x74,0x65,0x78,0x74,0x20,0x5e,0x3d,0x20,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5b,0x28,0x75,0x69,0x6e,
|
|
||||||
0x74,0x29,0x69,0x31,0x5d,0x3b,0x0a,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,
|
|
||||||
0x43,0x45,0x29,0x3b,0x0a,0x74,0x65,0x78,0x74,0x20,0x5e,0x3d,0x20,0x2a,0x78,0x69,0x6e,0x32,0x5f,0x6c,0x6f,0x61,0x64,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,
|
|
||||||
0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x31,0x30,0x0a,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x3d,0x30,0x3b,0x20,0x6a,0x3c,0x31,0x30,0x3b,0x20,0x2b,0x2b,
|
|
||||||
0x6a,0x29,0x0a,0x74,0x65,0x78,0x74,0x3d,0x41,0x45,0x53,0x5f,0x52,0x6f,0x75,0x6e,0x64,0x28,0x41,0x45,0x53,0x30,0x2c,0x41,0x45,0x53,0x31,0x2c,0x41,0x45,0x53,0x32,
|
|
||||||
0x2c,0x41,0x45,0x53,0x33,0x2c,0x74,0x65,0x78,0x74,0x2c,0x28,0x28,0x75,0x69,0x6e,0x74,0x34,0x20,0x2a,0x29,0x45,0x78,0x70,0x61,0x6e,0x64,0x65,0x64,0x4b,0x65,0x79,
|
|
||||||
0x32,0x29,0x5b,0x6a,0x5d,0x29,0x3b,0x0a,0x2a,0x78,0x69,0x6e,0x31,0x5f,0x73,0x74,0x6f,0x72,0x65,0x3d,0x74,0x65,0x78,0x74,0x3b,0x0a,0x74,0x65,0x78,0x74,0x20,0x5e,
|
|
||||||
0x3d,0x20,0x53,0x63,0x72,0x61,0x74,0x63,0x68,0x70,0x61,0x64,0x5b,0x28,0x75,0x69,0x6e,0x74,0x29,0x69,0x31,0x2b,0x38,0x75,0x5d,0x3b,0x0a,0x62,0x61,0x72,0x72,0x69,
|
|
||||||
0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x74,0x65,0x78,0x74,0x20,0x5e,0x3d,
|
|
||||||
0x20,0x2a,0x78,0x69,0x6e,0x31,0x5f,0x6c,0x6f,0x61,0x64,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x31,0x30,0x0a,0x66,
|
|
||||||
0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x3d,0x30,0x3b,0x20,0x6a,0x3c,0x31,0x30,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x0a,0x74,0x65,0x78,0x74,0x3d,0x41,0x45,0x53,0x5f,
|
|
||||||
0x52,0x6f,0x75,0x6e,0x64,0x28,0x41,0x45,0x53,0x30,0x2c,0x41,0x45,0x53,0x31,0x2c,0x41,0x45,0x53,0x32,0x2c,0x41,0x45,0x53,0x33,0x2c,0x74,0x65,0x78,0x74,0x2c,0x28,
|
|
||||||
0x28,0x75,0x69,0x6e,0x74,0x34,0x20,0x2a,0x29,0x45,0x78,0x70,0x61,0x6e,0x64,0x65,0x64,0x4b,0x65,0x79,0x32,0x29,0x5b,0x6a,0x5d,0x29,0x3b,0x0a,0x2a,0x78,0x69,0x6e,
|
|
||||||
0x32,0x5f,0x73,0x74,0x6f,0x72,0x65,0x3d,0x74,0x65,0x78,0x74,0x3b,0x0a,0x7d,0x0a,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,
|
|
||||||
0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x74,0x65,0x78,0x74,0x20,0x5e,0x3d,0x20,0x2a,0x78,0x69,0x6e,0x32,0x5f,0x6c,0x6f,0x61,0x64,
|
|
||||||
0x3b,0x0a,0x7d,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x31,0x36,0x0a,0x66,0x6f,0x72,0x28,0x73,0x69,0x7a,0x65,0x5f,0x74,
|
|
||||||
0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x31,0x36,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x7b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,
|
|
||||||
0x6c,0x20,0x31,0x30,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6a,0x3d,0x30,0x3b,0x20,0x6a,0x3c,0x31,0x30,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x20,0x7b,0x0a,
|
|
||||||
0x74,0x65,0x78,0x74,0x3d,0x41,0x45,0x53,0x5f,0x52,0x6f,0x75,0x6e,0x64,0x28,0x41,0x45,0x53,0x30,0x2c,0x41,0x45,0x53,0x31,0x2c,0x41,0x45,0x53,0x32,0x2c,0x41,0x45,
|
|
||||||
0x53,0x33,0x2c,0x74,0x65,0x78,0x74,0x2c,0x28,0x28,0x75,0x69,0x6e,0x74,0x34,0x20,0x2a,0x29,0x45,0x78,0x70,0x61,0x6e,0x64,0x65,0x64,0x4b,0x65,0x79,0x32,0x29,0x5b,
|
|
||||||
0x6a,0x5d,0x29,0x3b,0x0a,0x7d,0x0a,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,
|
|
||||||
0x43,0x45,0x29,0x3b,0x0a,0x2a,0x78,0x69,0x6e,0x31,0x5f,0x73,0x74,0x6f,0x72,0x65,0x3d,0x74,0x65,0x78,0x74,0x3b,0x0a,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,
|
|
||||||
0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x74,0x65,0x78,0x74,0x20,0x5e,0x3d,0x20,0x2a,0x78,0x69,
|
|
||||||
0x6e,0x31,0x5f,0x6c,0x6f,0x61,0x64,0x3b,0x0a,0x7d,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x53,0x74,0x61,0x74,0x65,0x5f,0x62,
|
|
||||||
0x75,0x66,0x5b,0x38,0x2a,0x32,0x35,0x5d,0x3b,0x0a,0x7b,0x0a,0x76,0x73,0x74,0x6f,0x72,0x65,0x32,0x28,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x32,0x28,0x74,0x65,
|
|
||||||
0x78,0x74,0x29,0x2c,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x2b,0x34,0x2c,0x73,0x74,0x61,0x74,0x65,0x73,0x29,0x3b,0x0a,0x7d,
|
|
||||||
0x0a,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,
|
|
||||||
0x7b,0x0a,0x69,0x66,0x28,0x21,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x0a,0x7b,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,
|
|
||||||
0x20,0x75,0x6c,0x6f,0x6e,0x67,0x2a,0x20,0x53,0x74,0x61,0x74,0x65,0x3d,0x53,0x74,0x61,0x74,0x65,0x5f,0x62,0x75,0x66,0x2b,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,
|
|
||||||
0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2a,0x32,0x35,0x3b,0x0a,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x32,0x35,0x3b,0x20,0x2b,
|
|
||||||
0x2b,0x69,0x29,0x20,0x53,0x74,0x61,0x74,0x65,0x5b,0x69,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x73,0x5b,0x69,0x5d,0x3b,0x0a,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x31,
|
|
||||||
0x36,0x30,0x30,0x5f,0x32,0x28,0x53,0x74,0x61,0x74,0x65,0x29,0x3b,0x0a,0x69,0x66,0x28,0x53,0x74,0x61,0x74,0x65,0x5b,0x33,0x5d,0x3c,0x3d,0x54,0x61,0x72,0x67,0x65,
|
|
||||||
0x74,0x29,0x0a,0x7b,0x0a,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x6f,0x75,0x74,0x49,0x64,0x78,0x3d,0x61,0x74,0x6f,0x6d,0x69,0x63,0x5f,0x69,0x6e,0x63,0x28,0x6f,0x75,0x74,
|
|
||||||
0x70,0x75,0x74,0x2b,0x30,0x78,0x46,0x46,0x29,0x3b,0x0a,0x69,0x66,0x28,0x6f,0x75,0x74,0x49,0x64,0x78,0x3c,0x30,0x78,0x46,0x46,0x29,0x0a,0x6f,0x75,0x74,0x70,0x75,
|
|
||||||
0x74,0x5b,0x6f,0x75,0x74,0x49,0x64,0x78,0x5d,0x3d,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,
|
|
||||||
0x7d,0x0a,0x6d,0x65,0x6d,0x5f,0x66,0x65,0x6e,0x63,0x65,0x28,0x43,0x4c,0x4b,0x5f,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,
|
|
||||||
0x29,0x3b,0x0a,0x7d,0x0a,0x00
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace xmrig
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
static char cryptonight_r_defines_cl[7709] = {
|
static const char cryptonight_r_defines_cl[7709] = {
|
||||||
0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,
|
0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x5f,0x5f,0x4e,0x56,0x5f,0x43,0x4c,0x5f,0x43,0x5f,0x56,0x45,0x52,0x53,0x49,0x4f,0x4e,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,
|
||||||
0x20,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x4e,0x29,0x20,0x28,0x2a,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,
|
0x20,0x53,0x43,0x52,0x41,0x54,0x43,0x48,0x50,0x41,0x44,0x5f,0x43,0x48,0x55,0x4e,0x4b,0x28,0x4e,0x29,0x20,0x28,0x2a,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,
|
||||||
0x75,0x69,0x6e,0x74,0x34,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x73,0x63,0x72,0x61,0x74,0x63,0x68,
|
0x75,0x69,0x6e,0x74,0x34,0x2a,0x29,0x28,0x28,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x63,0x68,0x61,0x72,0x2a,0x29,0x28,0x73,0x63,0x72,0x61,0x74,0x63,0x68,
|
||||||
|
@ -246,7 +246,7 @@ static char cryptonight_r_defines_cl[7709] = {
|
||||||
0x5d,0x2c,0x30,0x55,0x2c,0x30,0x55,0x2c,0x30,0x55,0x29,0x29,0x3a,0x74,0x29,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x00
|
0x5d,0x2c,0x30,0x55,0x2c,0x30,0x55,0x2c,0x30,0x55,0x29,0x29,0x3a,0x74,0x29,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
static char cryptonight_r_cl[3424] = {
|
static const char cryptonight_r_cl[3424] = {
|
||||||
0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x72,0x65,0x71,0x64,0x5f,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,
|
0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x72,0x65,0x71,0x64,0x5f,0x77,0x6f,0x72,0x6b,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,
|
||||||
0x69,0x7a,0x65,0x28,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x2c,0x31,0x2c,0x31,0x29,0x29,0x29,0x0a,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,
|
0x69,0x7a,0x65,0x28,0x57,0x4f,0x52,0x4b,0x53,0x49,0x5a,0x45,0x2c,0x31,0x2c,0x31,0x29,0x29,0x29,0x0a,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,
|
||||||
0x64,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x4e,0x41,0x4d,0x45,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x2a,0x69,0x6e,
|
0x64,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x4e,0x41,0x4d,0x45,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x2a,0x69,0x6e,
|
||||||
|
|
38
src/backend/opencl/cl/kawpow/defs.h
Normal file
38
src/backend/opencl/cl/kawpow/defs.h
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#ifdef cl_clang_storage_class_specifiers
|
||||||
|
#pragma OPENCL EXTENSION cl_clang_storage_class_specifiers : enable
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef GROUP_SIZE
|
||||||
|
#define GROUP_SIZE 256
|
||||||
|
#endif
|
||||||
|
#define GROUP_SHARE (GROUP_SIZE / 16)
|
||||||
|
|
||||||
|
typedef unsigned int uint32_t;
|
||||||
|
typedef unsigned long uint64_t;
|
||||||
|
#define ROTL32(x, n) rotate((x), (uint32_t)(n))
|
||||||
|
#define ROTR32(x, n) rotate((x), (uint32_t)(32-n))
|
||||||
|
|
||||||
|
#define PROGPOW_LANES 16
|
||||||
|
#define PROGPOW_REGS 32
|
||||||
|
#define PROGPOW_DAG_LOADS 4
|
||||||
|
#define PROGPOW_CACHE_WORDS 4096
|
||||||
|
#define PROGPOW_CNT_DAG 64
|
||||||
|
#define PROGPOW_CNT_MATH 18
|
||||||
|
|
||||||
|
#define OPENCL_PLATFORM_UNKNOWN 0
|
||||||
|
#define OPENCL_PLATFORM_NVIDIA 1
|
||||||
|
#define OPENCL_PLATFORM_AMD 2
|
||||||
|
#define OPENCL_PLATFORM_CLOVER 3
|
||||||
|
|
||||||
|
#ifndef MAX_OUTPUTS
|
||||||
|
#define MAX_OUTPUTS 63U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PLATFORM
|
||||||
|
#define PLATFORM OPENCL_PLATFORM_AMD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define HASHES_PER_GROUP (GROUP_SIZE / PROGPOW_LANES)
|
||||||
|
|
||||||
|
#define FNV_PRIME 0x1000193
|
||||||
|
#define FNV_OFFSET_BASIS 0x811c9dc5
|
288
src/backend/opencl/cl/kawpow/kawpow.cl
Normal file
288
src/backend/opencl/cl/kawpow/kawpow.cl
Normal file
|
@ -0,0 +1,288 @@
|
||||||
|
#include "defs.h"
|
||||||
|
|
||||||
|
typedef struct __attribute__ ((aligned(16))) {uint32_t s[PROGPOW_DAG_LOADS];} dag_t;
|
||||||
|
|
||||||
|
// Implementation based on:
|
||||||
|
// https://github.com/mjosaarinen/tiny_sha3/blob/master/sha3.c
|
||||||
|
|
||||||
|
__constant const uint32_t keccakf_rndc[24] = {0x00000001, 0x00008082, 0x0000808a, 0x80008000,
|
||||||
|
0x0000808b, 0x80000001, 0x80008081, 0x00008009, 0x0000008a, 0x00000088, 0x80008009, 0x8000000a,
|
||||||
|
0x8000808b, 0x0000008b, 0x00008089, 0x00008003, 0x00008002, 0x00000080, 0x0000800a, 0x8000000a,
|
||||||
|
0x80008081, 0x00008080, 0x80000001, 0x80008008};
|
||||||
|
|
||||||
|
__constant const uint32_t ravencoin_rndc[15] = {
|
||||||
|
0x00000072, //R
|
||||||
|
0x00000041, //A
|
||||||
|
0x00000056, //V
|
||||||
|
0x00000045, //E
|
||||||
|
0x0000004E, //N
|
||||||
|
0x00000043, //C
|
||||||
|
0x0000004F, //O
|
||||||
|
0x00000049, //I
|
||||||
|
0x0000004E, //N
|
||||||
|
0x0000004B, //K
|
||||||
|
0x00000041, //A
|
||||||
|
0x00000057, //W
|
||||||
|
0x00000050, //P
|
||||||
|
0x0000004F, //O
|
||||||
|
0x00000057, //W
|
||||||
|
};
|
||||||
|
|
||||||
|
// Implementation of the Keccakf transformation with a width of 800
|
||||||
|
void keccak_f800_round(uint32_t st[25], const int r)
|
||||||
|
{
|
||||||
|
const uint32_t keccakf_rotc[24] = {
|
||||||
|
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44};
|
||||||
|
const uint32_t keccakf_piln[24] = {
|
||||||
|
10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1};
|
||||||
|
|
||||||
|
uint32_t t, bc[5];
|
||||||
|
// Theta
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
bc[i] = st[i] ^ st[i + 5] ^ st[i + 10] ^ st[i + 15] ^ st[i + 20];
|
||||||
|
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
t = bc[(i + 4) % 5] ^ ROTL32(bc[(i + 1) % 5], 1u);
|
||||||
|
for (uint32_t j = 0; j < 25; j += 5)
|
||||||
|
st[j + i] ^= t;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rho Pi
|
||||||
|
t = st[1];
|
||||||
|
for (int i = 0; i < 24; i++)
|
||||||
|
{
|
||||||
|
uint32_t j = keccakf_piln[i];
|
||||||
|
bc[0] = st[j];
|
||||||
|
st[j] = ROTL32(t, keccakf_rotc[i]);
|
||||||
|
t = bc[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chi
|
||||||
|
for (uint32_t j = 0; j < 25; j += 5)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
bc[i] = st[j + i];
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
st[j + i] ^= (~bc[(i + 1) % 5]) & bc[(i + 2) % 5];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iota
|
||||||
|
st[0] ^= keccakf_rndc[r];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keccak - implemented as a variant of SHAKE
|
||||||
|
// The width is 800, with a bitrate of 576, a capacity of 224, and no padding
|
||||||
|
// Only need 64 bits of output for mining
|
||||||
|
uint64_t keccak_f800(uint32_t* st)
|
||||||
|
{
|
||||||
|
// Complete all 22 rounds as a separate impl to
|
||||||
|
// evaluate only first 8 words is wasteful of regsters
|
||||||
|
for (int r = 0; r < 22; r++) {
|
||||||
|
keccak_f800_round(st, r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define fnv1a(h, d) (h = (h ^ d) * FNV_PRIME)
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t z, w, jsr, jcong;
|
||||||
|
} kiss99_t;
|
||||||
|
|
||||||
|
// KISS99 is simple, fast, and passes the TestU01 suite
|
||||||
|
// https://en.wikipedia.org/wiki/KISS_(algorithm)
|
||||||
|
// http://www.cse.yorku.ca/~oz/marsaglia-rng.html
|
||||||
|
uint32_t kiss99(kiss99_t* st)
|
||||||
|
{
|
||||||
|
st->z = 36969 * (st->z & 65535) + (st->z >> 16);
|
||||||
|
st->w = 18000 * (st->w & 65535) + (st->w >> 16);
|
||||||
|
uint32_t MWC = ((st->z << 16) + st->w);
|
||||||
|
st->jsr ^= (st->jsr << 17);
|
||||||
|
st->jsr ^= (st->jsr >> 13);
|
||||||
|
st->jsr ^= (st->jsr << 5);
|
||||||
|
st->jcong = 69069 * st->jcong + 1234567;
|
||||||
|
return ((MWC ^ st->jcong) + st->jsr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fill_mix(local uint32_t* seed, uint32_t lane_id, uint32_t* mix)
|
||||||
|
{
|
||||||
|
// Use FNV to expand the per-warp seed to per-lane
|
||||||
|
// Use KISS to expand the per-lane seed to fill mix
|
||||||
|
uint32_t fnv_hash = FNV_OFFSET_BASIS;
|
||||||
|
kiss99_t st;
|
||||||
|
st.z = fnv1a(fnv_hash, seed[0]);
|
||||||
|
st.w = fnv1a(fnv_hash, seed[1]);
|
||||||
|
st.jsr = fnv1a(fnv_hash, lane_id);
|
||||||
|
st.jcong = fnv1a(fnv_hash, lane_id);
|
||||||
|
#pragma unroll
|
||||||
|
for (int i = 0; i < PROGPOW_REGS; i++)
|
||||||
|
mix[i] = kiss99(&st);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t uint32s[PROGPOW_LANES];
|
||||||
|
} shuffle_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t uint32s[32 / sizeof(uint32_t)];
|
||||||
|
} hash32_t;
|
||||||
|
|
||||||
|
#if PLATFORM != OPENCL_PLATFORM_NVIDIA // use maxrregs on nv
|
||||||
|
__attribute__((reqd_work_group_size(GROUP_SIZE, 1, 1)))
|
||||||
|
#endif
|
||||||
|
__kernel void progpow_search(__global dag_t const* g_dag, __global uint* job_blob, ulong target, uint hack_false, volatile __global uint* results, volatile __global uint* stop)
|
||||||
|
{
|
||||||
|
const uint32_t lid = get_local_id(0);
|
||||||
|
const uint32_t gid = get_global_id(0);
|
||||||
|
|
||||||
|
if (stop[0]) {
|
||||||
|
if (lid == 0) {
|
||||||
|
// Count groups of skipped hashes (if we don't count them we'll break hashrate display)
|
||||||
|
atomic_inc(stop + 1);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
__local shuffle_t share[HASHES_PER_GROUP];
|
||||||
|
__local uint32_t c_dag[PROGPOW_CACHE_WORDS];
|
||||||
|
|
||||||
|
const uint32_t lane_id = lid & (PROGPOW_LANES - 1);
|
||||||
|
const uint32_t group_id = lid / PROGPOW_LANES;
|
||||||
|
|
||||||
|
// Load the first portion of the DAG into the cache
|
||||||
|
for (uint32_t word = lid * PROGPOW_DAG_LOADS; word < PROGPOW_CACHE_WORDS; word += GROUP_SIZE * PROGPOW_DAG_LOADS)
|
||||||
|
{
|
||||||
|
dag_t load = g_dag[word / PROGPOW_DAG_LOADS];
|
||||||
|
for (int i = 0; i < PROGPOW_DAG_LOADS; i++)
|
||||||
|
c_dag[word + i] = load.s[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t hash_seed[2]; // KISS99 initiator
|
||||||
|
hash32_t digest; // Carry-over from mix output
|
||||||
|
|
||||||
|
uint32_t state2[8];
|
||||||
|
|
||||||
|
{
|
||||||
|
// Absorb phase for initial round of keccak
|
||||||
|
|
||||||
|
uint32_t state[25]; // Keccak's state
|
||||||
|
|
||||||
|
// 1st fill with job data
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
state[i] = job_blob[i];
|
||||||
|
|
||||||
|
// Apply nonce
|
||||||
|
state[8] = gid;
|
||||||
|
|
||||||
|
// 3rd apply ravencoin input constraints
|
||||||
|
for (int i = 10; i < 25; i++)
|
||||||
|
state[i] = ravencoin_rndc[i-10];
|
||||||
|
|
||||||
|
// Run intial keccak round
|
||||||
|
keccak_f800(state);
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
state2[i] = state[i];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma unroll 1
|
||||||
|
for (uint32_t h = 0; h < PROGPOW_LANES; h++)
|
||||||
|
{
|
||||||
|
uint32_t mix[PROGPOW_REGS];
|
||||||
|
|
||||||
|
// share the hash's seed across all lanes
|
||||||
|
if (lane_id == h) {
|
||||||
|
share[group_id].uint32s[0] = state2[0];
|
||||||
|
share[group_id].uint32s[1] = state2[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
// initialize mix for all lanes
|
||||||
|
fill_mix(share[group_id].uint32s, lane_id, mix);
|
||||||
|
|
||||||
|
#pragma unroll 2
|
||||||
|
for (uint32_t loop = 0; loop < PROGPOW_CNT_DAG; ++loop)
|
||||||
|
{
|
||||||
|
// global load
|
||||||
|
if(lane_id == (loop % PROGPOW_LANES))
|
||||||
|
share[0].uint32s[group_id] = mix[0];
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
uint32_t offset = share[0].uint32s[group_id];
|
||||||
|
offset %= PROGPOW_DAG_ELEMENTS;
|
||||||
|
offset = offset * PROGPOW_LANES + (lane_id ^ loop) % PROGPOW_LANES;
|
||||||
|
dag_t data_dag = g_dag[offset];
|
||||||
|
|
||||||
|
// hack to prevent compiler from reordering LD and usage
|
||||||
|
if (hack_false) barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
uint32_t data;
|
||||||
|
XMRIG_INCLUDE_PROGPOW_RANDOM_MATH
|
||||||
|
|
||||||
|
// consume global load data
|
||||||
|
// hack to prevent compiler from reordering LD and usage
|
||||||
|
if (hack_false) barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
XMRIG_INCLUDE_PROGPOW_DATA_LOADS
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reduce mix data to a per-lane 32-bit digest
|
||||||
|
uint32_t mix_hash = FNV_OFFSET_BASIS;
|
||||||
|
#pragma unroll
|
||||||
|
for (int i = 0; i < PROGPOW_REGS; i++)
|
||||||
|
fnv1a(mix_hash, mix[i]);
|
||||||
|
|
||||||
|
// Reduce all lanes to a single 256-bit digest
|
||||||
|
hash32_t digest_temp;
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
digest_temp.uint32s[i] = FNV_OFFSET_BASIS;
|
||||||
|
share[group_id].uint32s[lane_id] = mix_hash;
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
#pragma unroll
|
||||||
|
for (int i = 0; i < PROGPOW_LANES; i++)
|
||||||
|
fnv1a(digest_temp.uint32s[i % 8], share[group_id].uint32s[i]);
|
||||||
|
if (h == lane_id)
|
||||||
|
digest = digest_temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Absorb phase for last round of keccak (256 bits)
|
||||||
|
uint64_t result;
|
||||||
|
|
||||||
|
{
|
||||||
|
uint32_t state[25] = {0x0}; // Keccak's state
|
||||||
|
|
||||||
|
// 1st initial 8 words of state are kept as carry-over from initial keccak
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
state[i] = state2[i];
|
||||||
|
|
||||||
|
// 2nd subsequent 8 words are carried from digest/mix
|
||||||
|
for (int i = 8; i < 16; i++)
|
||||||
|
state[i] = digest.uint32s[i - 8];
|
||||||
|
|
||||||
|
// 3rd apply ravencoin input constraints
|
||||||
|
for (int i = 16; i < 25; i++)
|
||||||
|
state[i] = ravencoin_rndc[i - 16];
|
||||||
|
|
||||||
|
// Run keccak loop
|
||||||
|
keccak_f800(state);
|
||||||
|
|
||||||
|
uint64_t res = (uint64_t)state[1] << 32 | state[0];
|
||||||
|
result = as_ulong(as_uchar8(res).s76543210);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result <= target)
|
||||||
|
{
|
||||||
|
*stop = 1;
|
||||||
|
|
||||||
|
const uint k = atomic_inc(results) + 1;
|
||||||
|
if (k <= 15)
|
||||||
|
results[k] = gid;
|
||||||
|
}
|
||||||
|
}
|
192
src/backend/opencl/cl/kawpow/kawpow_cl.h
Normal file
192
src/backend/opencl/cl/kawpow/kawpow_cl.h
Normal file
|
@ -0,0 +1,192 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
static const char kawpow_cl[5870] = {
|
||||||
|
0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x63,0x6c,0x5f,0x63,0x6c,0x61,0x6e,0x67,0x5f,0x73,0x74,0x6f,0x72,0x61,0x67,0x65,0x5f,0x63,0x6c,0x61,0x73,0x73,0x5f,0x73,0x70,
|
||||||
|
0x65,0x63,0x69,0x66,0x69,0x65,0x72,0x73,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,
|
||||||
|
0x4e,0x20,0x63,0x6c,0x5f,0x63,0x6c,0x61,0x6e,0x67,0x5f,0x73,0x74,0x6f,0x72,0x61,0x67,0x65,0x5f,0x63,0x6c,0x61,0x73,0x73,0x5f,0x73,0x70,0x65,0x63,0x69,0x66,0x69,
|
||||||
|
0x65,0x72,0x73,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x47,0x52,0x4f,0x55,
|
||||||
|
0x50,0x5f,0x53,0x49,0x5a,0x45,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x20,0x32,0x35,0x36,0x0a,0x23,0x65,
|
||||||
|
0x6e,0x64,0x69,0x66,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x41,0x52,0x45,0x20,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,
|
||||||
|
0x53,0x49,0x5a,0x45,0x20,0x2f,0x20,0x31,0x36,0x29,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,0x6e,0x73,0x69,0x67,0x6e,0x65,0x64,0x20,0x69,0x6e,0x74,0x20,
|
||||||
|
0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x3b,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,0x6e,0x73,0x69,0x67,0x6e,0x65,0x64,0x20,0x6c,0x6f,0x6e,0x67,0x20,
|
||||||
|
0x75,0x69,0x6e,0x74,0x36,0x34,0x5f,0x74,0x3b,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x52,0x4f,0x54,0x4c,0x33,0x32,0x28,0x78,0x2c,0x20,0x6e,0x29,0x20,0x72,
|
||||||
|
0x6f,0x74,0x61,0x74,0x65,0x28,0x28,0x78,0x29,0x2c,0x20,0x28,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x29,0x28,0x6e,0x29,0x29,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,
|
||||||
|
0x65,0x20,0x52,0x4f,0x54,0x52,0x33,0x32,0x28,0x78,0x2c,0x20,0x6e,0x29,0x20,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x28,0x78,0x29,0x2c,0x20,0x28,0x75,0x69,0x6e,0x74,
|
||||||
|
0x33,0x32,0x5f,0x74,0x29,0x28,0x33,0x32,0x2d,0x6e,0x29,0x29,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x4c,0x41,0x4e,
|
||||||
|
0x45,0x53,0x20,0x31,0x36,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x52,0x45,0x47,0x53,0x20,0x33,0x32,0x0a,0x23,0x64,
|
||||||
|
0x65,0x66,0x69,0x6e,0x65,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x44,0x41,0x47,0x5f,0x4c,0x4f,0x41,0x44,0x53,0x20,0x34,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,
|
||||||
|
0x65,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x43,0x41,0x43,0x48,0x45,0x5f,0x57,0x4f,0x52,0x44,0x53,0x20,0x34,0x30,0x39,0x36,0x0a,0x23,0x64,0x65,0x66,0x69,
|
||||||
|
0x6e,0x65,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x43,0x4e,0x54,0x5f,0x44,0x41,0x47,0x20,0x36,0x34,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x50,0x52,
|
||||||
|
0x4f,0x47,0x50,0x4f,0x57,0x5f,0x43,0x4e,0x54,0x5f,0x4d,0x41,0x54,0x48,0x20,0x31,0x38,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,
|
||||||
|
0x5f,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,0x55,0x4e,0x4b,0x4e,0x4f,0x57,0x4e,0x20,0x30,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4f,0x50,0x45,0x4e,
|
||||||
|
0x43,0x4c,0x5f,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,0x4e,0x56,0x49,0x44,0x49,0x41,0x20,0x31,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4f,0x50,0x45,
|
||||||
|
0x4e,0x43,0x4c,0x5f,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,0x41,0x4d,0x44,0x20,0x32,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4f,0x50,0x45,0x4e,0x43,
|
||||||
|
0x4c,0x5f,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,0x43,0x4c,0x4f,0x56,0x45,0x52,0x20,0x33,0x0a,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x4d,0x41,0x58,0x5f,
|
||||||
|
0x4f,0x55,0x54,0x50,0x55,0x54,0x53,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4d,0x41,0x58,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x53,0x20,0x36,0x33,0x55,0x0a,
|
||||||
|
0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,
|
||||||
|
0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,0x41,0x4d,0x44,0x0a,0x23,0x65,0x6e,
|
||||||
|
0x64,0x69,0x66,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x48,0x41,0x53,0x48,0x45,0x53,0x5f,0x50,0x45,0x52,0x5f,0x47,0x52,0x4f,0x55,0x50,0x20,0x28,0x47,0x52,
|
||||||
|
0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2f,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x4c,0x41,0x4e,0x45,0x53,0x29,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,
|
||||||
|
0x65,0x20,0x46,0x4e,0x56,0x5f,0x50,0x52,0x49,0x4d,0x45,0x20,0x30,0x78,0x31,0x30,0x30,0x30,0x31,0x39,0x33,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x46,0x4e,
|
||||||
|
0x56,0x5f,0x4f,0x46,0x46,0x53,0x45,0x54,0x5f,0x42,0x41,0x53,0x49,0x53,0x20,0x30,0x78,0x38,0x31,0x31,0x63,0x39,0x64,0x63,0x35,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,
|
||||||
|
0x66,0x20,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x20,0x28,0x28,0x61,0x6c,0x69,0x67,0x6e,0x65,0x64,
|
||||||
|
0x28,0x31,0x36,0x29,0x29,0x29,0x20,0x7b,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x73,0x5b,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x44,0x41,0x47,0x5f,0x4c,
|
||||||
|
0x4f,0x41,0x44,0x53,0x5d,0x3b,0x7d,0x20,0x64,0x61,0x67,0x5f,0x74,0x3b,0x0a,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,
|
||||||
|
0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x72,0x6e,0x64,0x63,0x5b,0x32,0x34,0x5d,0x3d,0x7b,0x30,0x78,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x30,0x31,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x38,0x32,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x38,0x61,0x2c,0x30,0x78,0x38,0x30,
|
||||||
|
0x30,0x30,0x38,0x30,0x30,0x30,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x38,0x62,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x2c,0x30,0x78,
|
||||||
|
0x38,0x30,0x30,0x30,0x38,0x30,0x38,0x31,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x39,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x61,0x2c,0x30,
|
||||||
|
0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x38,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x38,0x30,0x30,0x39,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x61,0x2c,
|
||||||
|
0x0a,0x30,0x78,0x38,0x30,0x30,0x30,0x38,0x30,0x38,0x62,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x62,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x38,
|
||||||
|
0x39,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x33,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x32,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x38,0x30,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x61,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x61,0x2c,0x0a,0x30,0x78,0x38,0x30,0x30,0x30,
|
||||||
|
0x38,0x30,0x38,0x31,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x38,0x30,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x2c,0x30,0x78,0x38,0x30,0x30,
|
||||||
|
0x30,0x38,0x30,0x30,0x38,0x7d,0x3b,0x0a,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,
|
||||||
|
0x74,0x20,0x72,0x61,0x76,0x65,0x6e,0x63,0x6f,0x69,0x6e,0x5f,0x72,0x6e,0x64,0x63,0x5b,0x31,0x35,0x5d,0x3d,0x7b,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x37,
|
||||||
|
0x32,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x34,0x31,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x35,0x36,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x34,0x35,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x34,0x45,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x34,0x33,0x2c,0x0a,0x30,
|
||||||
|
0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x34,0x46,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x34,0x39,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x34,
|
||||||
|
0x45,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x34,0x42,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x34,0x31,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x35,0x37,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x35,0x30,0x2c,0x0a,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x34,0x46,0x2c,0x0a,0x30,
|
||||||
|
0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x35,0x37,0x2c,0x0a,0x7d,0x3b,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x5f,0x66,0x38,0x30,0x30,0x5f,0x72,
|
||||||
|
0x6f,0x75,0x6e,0x64,0x28,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x73,0x74,0x5b,0x32,0x35,0x5d,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,
|
||||||
|
0x29,0x0a,0x7b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x72,0x6f,0x74,0x63,0x5b,
|
||||||
|
0x32,0x34,0x5d,0x3d,0x7b,0x0a,0x31,0x2c,0x33,0x2c,0x36,0x2c,0x31,0x30,0x2c,0x31,0x35,0x2c,0x32,0x31,0x2c,0x32,0x38,0x2c,0x33,0x36,0x2c,0x34,0x35,0x2c,0x35,0x35,
|
||||||
|
0x2c,0x32,0x2c,0x31,0x34,0x2c,0x32,0x37,0x2c,0x34,0x31,0x2c,0x35,0x36,0x2c,0x38,0x2c,0x32,0x35,0x2c,0x34,0x33,0x2c,0x36,0x32,0x2c,0x31,0x38,0x2c,0x33,0x39,0x2c,
|
||||||
|
0x36,0x31,0x2c,0x32,0x30,0x2c,0x34,0x34,0x7d,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,
|
||||||
|
0x66,0x5f,0x70,0x69,0x6c,0x6e,0x5b,0x32,0x34,0x5d,0x3d,0x7b,0x0a,0x31,0x30,0x2c,0x37,0x2c,0x31,0x31,0x2c,0x31,0x37,0x2c,0x31,0x38,0x2c,0x33,0x2c,0x35,0x2c,0x31,
|
||||||
|
0x36,0x2c,0x38,0x2c,0x32,0x31,0x2c,0x32,0x34,0x2c,0x34,0x2c,0x31,0x35,0x2c,0x32,0x33,0x2c,0x31,0x39,0x2c,0x31,0x33,0x2c,0x31,0x32,0x2c,0x32,0x2c,0x32,0x30,0x2c,
|
||||||
|
0x31,0x34,0x2c,0x32,0x32,0x2c,0x39,0x2c,0x36,0x2c,0x31,0x7d,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x74,0x2c,0x62,0x63,0x5b,0x35,0x5d,0x3b,0x0a,
|
||||||
|
0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x35,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x62,0x63,0x5b,0x69,0x5d,0x3d,0x73,0x74,
|
||||||
|
0x5b,0x69,0x5d,0x5e,0x73,0x74,0x5b,0x69,0x2b,0x35,0x5d,0x5e,0x73,0x74,0x5b,0x69,0x2b,0x31,0x30,0x5d,0x5e,0x73,0x74,0x5b,0x69,0x2b,0x31,0x35,0x5d,0x5e,0x73,0x74,
|
||||||
|
0x5b,0x69,0x2b,0x32,0x30,0x5d,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x35,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,
|
||||||
|
0x7b,0x0a,0x74,0x3d,0x62,0x63,0x5b,0x28,0x69,0x2b,0x34,0x29,0x20,0x25,0x20,0x35,0x5d,0x5e,0x52,0x4f,0x54,0x4c,0x33,0x32,0x28,0x62,0x63,0x5b,0x28,0x69,0x2b,0x31,
|
||||||
|
0x29,0x20,0x25,0x20,0x35,0x5d,0x2c,0x31,0x75,0x29,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x6a,0x3d,0x30,0x3b,0x20,0x6a,
|
||||||
|
0x3c,0x32,0x35,0x3b,0x20,0x6a,0x2b,0x3d,0x35,0x29,0x0a,0x73,0x74,0x5b,0x6a,0x2b,0x69,0x5d,0x20,0x5e,0x3d,0x20,0x74,0x3b,0x0a,0x7d,0x0a,0x74,0x3d,0x73,0x74,0x5b,
|
||||||
|
0x31,0x5d,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x32,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x7b,0x0a,0x75,
|
||||||
|
0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x6a,0x3d,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x70,0x69,0x6c,0x6e,0x5b,0x69,0x5d,0x3b,0x0a,0x62,0x63,0x5b,0x30,0x5d,
|
||||||
|
0x3d,0x73,0x74,0x5b,0x6a,0x5d,0x3b,0x0a,0x73,0x74,0x5b,0x6a,0x5d,0x3d,0x52,0x4f,0x54,0x4c,0x33,0x32,0x28,0x74,0x2c,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x72,
|
||||||
|
0x6f,0x74,0x63,0x5b,0x69,0x5d,0x29,0x3b,0x0a,0x74,0x3d,0x62,0x63,0x5b,0x30,0x5d,0x3b,0x0a,0x7d,0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,
|
||||||
|
0x74,0x20,0x6a,0x3d,0x30,0x3b,0x20,0x6a,0x3c,0x32,0x35,0x3b,0x20,0x6a,0x2b,0x3d,0x35,0x29,0x0a,0x7b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,
|
||||||
|
0x30,0x3b,0x20,0x69,0x3c,0x35,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x62,0x63,0x5b,0x69,0x5d,0x3d,0x73,0x74,0x5b,0x6a,0x2b,0x69,0x5d,0x3b,0x0a,0x66,0x6f,0x72,0x20,
|
||||||
|
0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x35,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x73,0x74,0x5b,0x6a,0x2b,0x69,0x5d,0x20,0x5e,0x3d,0x20,0x28,
|
||||||
|
0x7e,0x62,0x63,0x5b,0x28,0x69,0x2b,0x31,0x29,0x20,0x25,0x20,0x35,0x5d,0x29,0x26,0x62,0x63,0x5b,0x28,0x69,0x2b,0x32,0x29,0x20,0x25,0x20,0x35,0x5d,0x3b,0x0a,0x7d,
|
||||||
|
0x0a,0x73,0x74,0x5b,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x66,0x5f,0x72,0x6e,0x64,0x63,0x5b,0x72,0x5d,0x3b,0x0a,0x7d,0x0a,0x75,0x69,0x6e,
|
||||||
|
0x74,0x36,0x34,0x5f,0x74,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x5f,0x66,0x38,0x30,0x30,0x28,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x2a,0x20,0x73,0x74,0x29,0x0a,
|
||||||
|
0x7b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x72,0x3d,0x30,0x3b,0x20,0x72,0x3c,0x32,0x32,0x3b,0x20,0x72,0x2b,0x2b,0x29,0x20,0x7b,0x0a,0x6b,0x65,0x63,
|
||||||
|
0x63,0x61,0x6b,0x5f,0x66,0x38,0x30,0x30,0x5f,0x72,0x6f,0x75,0x6e,0x64,0x28,0x73,0x74,0x2c,0x72,0x29,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,
|
||||||
|
0x65,0x20,0x66,0x6e,0x76,0x31,0x61,0x28,0x68,0x2c,0x20,0x64,0x29,0x20,0x28,0x68,0x20,0x3d,0x20,0x28,0x68,0x20,0x5e,0x20,0x64,0x29,0x20,0x2a,0x20,0x46,0x4e,0x56,
|
||||||
|
0x5f,0x50,0x52,0x49,0x4d,0x45,0x29,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x73,0x74,0x72,0x75,0x63,0x74,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,
|
||||||
|
0x74,0x20,0x7a,0x2c,0x77,0x2c,0x6a,0x73,0x72,0x2c,0x6a,0x63,0x6f,0x6e,0x67,0x3b,0x0a,0x7d,0x20,0x6b,0x69,0x73,0x73,0x39,0x39,0x5f,0x74,0x3b,0x0a,0x75,0x69,0x6e,
|
||||||
|
0x74,0x33,0x32,0x5f,0x74,0x20,0x6b,0x69,0x73,0x73,0x39,0x39,0x28,0x6b,0x69,0x73,0x73,0x39,0x39,0x5f,0x74,0x2a,0x20,0x73,0x74,0x29,0x0a,0x7b,0x0a,0x73,0x74,0x2d,
|
||||||
|
0x3e,0x7a,0x3d,0x33,0x36,0x39,0x36,0x39,0x2a,0x28,0x73,0x74,0x2d,0x3e,0x7a,0x26,0x36,0x35,0x35,0x33,0x35,0x29,0x2b,0x28,0x73,0x74,0x2d,0x3e,0x7a,0x3e,0x3e,0x31,
|
||||||
|
0x36,0x29,0x3b,0x0a,0x73,0x74,0x2d,0x3e,0x77,0x3d,0x31,0x38,0x30,0x30,0x30,0x2a,0x28,0x73,0x74,0x2d,0x3e,0x77,0x26,0x36,0x35,0x35,0x33,0x35,0x29,0x2b,0x28,0x73,
|
||||||
|
0x74,0x2d,0x3e,0x77,0x3e,0x3e,0x31,0x36,0x29,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x4d,0x57,0x43,0x3d,0x28,0x28,0x73,0x74,0x2d,0x3e,0x7a,0x3c,
|
||||||
|
0x3c,0x31,0x36,0x29,0x2b,0x73,0x74,0x2d,0x3e,0x77,0x29,0x3b,0x0a,0x73,0x74,0x2d,0x3e,0x6a,0x73,0x72,0x20,0x5e,0x3d,0x20,0x28,0x73,0x74,0x2d,0x3e,0x6a,0x73,0x72,
|
||||||
|
0x3c,0x3c,0x31,0x37,0x29,0x3b,0x0a,0x73,0x74,0x2d,0x3e,0x6a,0x73,0x72,0x20,0x5e,0x3d,0x20,0x28,0x73,0x74,0x2d,0x3e,0x6a,0x73,0x72,0x3e,0x3e,0x31,0x33,0x29,0x3b,
|
||||||
|
0x0a,0x73,0x74,0x2d,0x3e,0x6a,0x73,0x72,0x20,0x5e,0x3d,0x20,0x28,0x73,0x74,0x2d,0x3e,0x6a,0x73,0x72,0x3c,0x3c,0x35,0x29,0x3b,0x0a,0x73,0x74,0x2d,0x3e,0x6a,0x63,
|
||||||
|
0x6f,0x6e,0x67,0x3d,0x36,0x39,0x30,0x36,0x39,0x2a,0x73,0x74,0x2d,0x3e,0x6a,0x63,0x6f,0x6e,0x67,0x2b,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x3b,0x0a,0x72,0x65,0x74,
|
||||||
|
0x75,0x72,0x6e,0x20,0x28,0x28,0x4d,0x57,0x43,0x5e,0x73,0x74,0x2d,0x3e,0x6a,0x63,0x6f,0x6e,0x67,0x29,0x2b,0x73,0x74,0x2d,0x3e,0x6a,0x73,0x72,0x29,0x3b,0x0a,0x7d,
|
||||||
|
0x0a,0x76,0x6f,0x69,0x64,0x20,0x66,0x69,0x6c,0x6c,0x5f,0x6d,0x69,0x78,0x28,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x2a,0x20,0x73,
|
||||||
|
0x65,0x65,0x64,0x2c,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x6c,0x61,0x6e,0x65,0x5f,0x69,0x64,0x2c,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x2a,0x20,0x6d,
|
||||||
|
0x69,0x78,0x29,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x66,0x6e,0x76,0x5f,0x68,0x61,0x73,0x68,0x3d,0x46,0x4e,0x56,0x5f,0x4f,0x46,0x46,0x53,
|
||||||
|
0x45,0x54,0x5f,0x42,0x41,0x53,0x49,0x53,0x3b,0x0a,0x6b,0x69,0x73,0x73,0x39,0x39,0x5f,0x74,0x20,0x73,0x74,0x3b,0x0a,0x73,0x74,0x2e,0x7a,0x3d,0x66,0x6e,0x76,0x31,
|
||||||
|
0x61,0x28,0x66,0x6e,0x76,0x5f,0x68,0x61,0x73,0x68,0x2c,0x73,0x65,0x65,0x64,0x5b,0x30,0x5d,0x29,0x3b,0x0a,0x73,0x74,0x2e,0x77,0x3d,0x66,0x6e,0x76,0x31,0x61,0x28,
|
||||||
|
0x66,0x6e,0x76,0x5f,0x68,0x61,0x73,0x68,0x2c,0x73,0x65,0x65,0x64,0x5b,0x31,0x5d,0x29,0x3b,0x0a,0x73,0x74,0x2e,0x6a,0x73,0x72,0x3d,0x66,0x6e,0x76,0x31,0x61,0x28,
|
||||||
|
0x66,0x6e,0x76,0x5f,0x68,0x61,0x73,0x68,0x2c,0x6c,0x61,0x6e,0x65,0x5f,0x69,0x64,0x29,0x3b,0x0a,0x73,0x74,0x2e,0x6a,0x63,0x6f,0x6e,0x67,0x3d,0x66,0x6e,0x76,0x31,
|
||||||
|
0x61,0x28,0x66,0x6e,0x76,0x5f,0x68,0x61,0x73,0x68,0x2c,0x6c,0x61,0x6e,0x65,0x5f,0x69,0x64,0x29,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,
|
||||||
|
0x6f,0x6c,0x6c,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x52,0x45,0x47,0x53,
|
||||||
|
0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x6d,0x69,0x78,0x5b,0x69,0x5d,0x3d,0x6b,0x69,0x73,0x73,0x39,0x39,0x28,0x26,0x73,0x74,0x29,0x3b,0x0a,0x7d,0x0a,0x74,0x79,0x70,
|
||||||
|
0x65,0x64,0x65,0x66,0x20,0x73,0x74,0x72,0x75,0x63,0x74,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x75,0x69,0x6e,0x74,0x33,0x32,0x73,0x5b,0x50,
|
||||||
|
0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x4c,0x41,0x4e,0x45,0x53,0x5d,0x3b,0x0a,0x7d,0x20,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x5f,0x74,0x3b,0x0a,0x74,0x79,0x70,0x65,
|
||||||
|
0x64,0x65,0x66,0x20,0x73,0x74,0x72,0x75,0x63,0x74,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x75,0x69,0x6e,0x74,0x33,0x32,0x73,0x5b,0x33,0x32,
|
||||||
|
0x2f,0x73,0x69,0x7a,0x65,0x6f,0x66,0x28,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x29,0x5d,0x3b,0x0a,0x7d,0x20,0x68,0x61,0x73,0x68,0x33,0x32,0x5f,0x74,0x3b,0x0a,
|
||||||
|
0x23,0x69,0x66,0x20,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x20,0x21,0x3d,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,
|
||||||
|
0x4e,0x56,0x49,0x44,0x49,0x41,0x20,0x0a,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x72,0x65,0x71,0x64,0x5f,0x77,0x6f,0x72,0x6b,
|
||||||
|
0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x2c,0x31,0x2c,0x31,0x29,0x29,0x29,0x0a,0x23,0x65,
|
||||||
|
0x6e,0x64,0x69,0x66,0x0a,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x72,0x6f,0x67,0x70,0x6f,0x77,0x5f,0x73,0x65,0x61,0x72,0x63,
|
||||||
|
0x68,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x64,0x61,0x67,0x5f,0x74,0x20,0x63,0x6f,0x6e,0x73,0x74,0x2a,0x20,0x67,0x5f,0x64,0x61,0x67,0x2c,0x5f,0x5f,
|
||||||
|
0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x20,0x6a,0x6f,0x62,0x5f,0x62,0x6c,0x6f,0x62,0x2c,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x74,0x61,0x72,0x67,
|
||||||
|
0x65,0x74,0x2c,0x75,0x69,0x6e,0x74,0x20,0x68,0x61,0x63,0x6b,0x5f,0x66,0x61,0x6c,0x73,0x65,0x2c,0x76,0x6f,0x6c,0x61,0x74,0x69,0x6c,0x65,0x20,0x5f,0x5f,0x67,0x6c,
|
||||||
|
0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x73,0x2c,0x76,0x6f,0x6c,0x61,0x74,0x69,0x6c,0x65,0x20,0x5f,0x5f,0x67,0x6c,
|
||||||
|
0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x20,0x73,0x74,0x6f,0x70,0x29,0x0a,0x7b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,
|
||||||
|
0x74,0x20,0x6c,0x69,0x64,0x3d,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,
|
||||||
|
0x74,0x33,0x32,0x5f,0x74,0x20,0x67,0x69,0x64,0x3d,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x0a,0x69,0x66,0x28,0x73,
|
||||||
|
0x74,0x6f,0x70,0x5b,0x30,0x5d,0x29,0x20,0x7b,0x0a,0x69,0x66,0x28,0x6c,0x69,0x64,0x3d,0x3d,0x30,0x29,0x20,0x7b,0x0a,0x61,0x74,0x6f,0x6d,0x69,0x63,0x5f,0x69,0x6e,
|
||||||
|
0x63,0x28,0x73,0x74,0x6f,0x70,0x2b,0x31,0x29,0x3b,0x0a,0x7d,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x0a,0x7d,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,
|
||||||
|
0x68,0x75,0x66,0x66,0x6c,0x65,0x5f,0x74,0x20,0x73,0x68,0x61,0x72,0x65,0x5b,0x48,0x41,0x53,0x48,0x45,0x53,0x5f,0x50,0x45,0x52,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5d,
|
||||||
|
0x3b,0x0a,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x63,0x5f,0x64,0x61,0x67,0x5b,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,
|
||||||
|
0x5f,0x43,0x41,0x43,0x48,0x45,0x5f,0x57,0x4f,0x52,0x44,0x53,0x5d,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x6c,0x61,
|
||||||
|
0x6e,0x65,0x5f,0x69,0x64,0x3d,0x6c,0x69,0x64,0x26,0x28,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x4c,0x41,0x4e,0x45,0x53,0x2d,0x31,0x29,0x3b,0x0a,0x63,0x6f,0x6e,
|
||||||
|
0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x3d,0x6c,0x69,0x64,0x2f,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,
|
||||||
|
0x5f,0x4c,0x41,0x4e,0x45,0x53,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x77,0x6f,0x72,0x64,0x3d,0x6c,0x69,0x64,0x2a,0x50,
|
||||||
|
0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x44,0x41,0x47,0x5f,0x4c,0x4f,0x41,0x44,0x53,0x3b,0x20,0x77,0x6f,0x72,0x64,0x3c,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x43,
|
||||||
|
0x41,0x43,0x48,0x45,0x5f,0x57,0x4f,0x52,0x44,0x53,0x3b,0x20,0x77,0x6f,0x72,0x64,0x2b,0x3d,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x2a,0x50,0x52,0x4f,
|
||||||
|
0x47,0x50,0x4f,0x57,0x5f,0x44,0x41,0x47,0x5f,0x4c,0x4f,0x41,0x44,0x53,0x29,0x0a,0x7b,0x0a,0x64,0x61,0x67,0x5f,0x74,0x20,0x6c,0x6f,0x61,0x64,0x3d,0x67,0x5f,0x64,
|
||||||
|
0x61,0x67,0x5b,0x77,0x6f,0x72,0x64,0x2f,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x44,0x41,0x47,0x5f,0x4c,0x4f,0x41,0x44,0x53,0x5d,0x3b,0x0a,0x66,0x6f,0x72,0x20,
|
||||||
|
0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x44,0x41,0x47,0x5f,0x4c,0x4f,0x41,0x44,0x53,0x3b,0x20,0x69,
|
||||||
|
0x2b,0x2b,0x29,0x0a,0x63,0x5f,0x64,0x61,0x67,0x5b,0x77,0x6f,0x72,0x64,0x2b,0x69,0x5d,0x3d,0x6c,0x6f,0x61,0x64,0x2e,0x73,0x5b,0x69,0x5d,0x3b,0x0a,0x7d,0x0a,0x75,
|
||||||
|
0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x68,0x61,0x73,0x68,0x5f,0x73,0x65,0x65,0x64,0x5b,0x32,0x5d,0x3b,0x20,0x0a,0x68,0x61,0x73,0x68,0x33,0x32,0x5f,0x74,0x20,
|
||||||
|
0x64,0x69,0x67,0x65,0x73,0x74,0x3b,0x20,0x0a,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x73,0x74,0x61,0x74,0x65,0x32,0x5b,0x38,0x5d,0x3b,0x0a,0x7b,0x0a,0x75,
|
||||||
|
0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x73,0x74,0x61,0x74,0x65,0x5b,0x32,0x35,0x5d,0x3b,0x20,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,
|
||||||
|
0x3b,0x20,0x69,0x3c,0x31,0x30,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x73,0x74,0x61,0x74,0x65,0x5b,0x69,0x5d,0x3d,0x6a,0x6f,0x62,0x5f,0x62,0x6c,0x6f,0x62,0x5b,0x69,
|
||||||
|
0x5d,0x3b,0x0a,0x73,0x74,0x61,0x74,0x65,0x5b,0x38,0x5d,0x3d,0x67,0x69,0x64,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x31,0x30,0x3b,0x20,
|
||||||
|
0x69,0x3c,0x32,0x35,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x73,0x74,0x61,0x74,0x65,0x5b,0x69,0x5d,0x3d,0x72,0x61,0x76,0x65,0x6e,0x63,0x6f,0x69,0x6e,0x5f,0x72,0x6e,
|
||||||
|
0x64,0x63,0x5b,0x69,0x2d,0x31,0x30,0x5d,0x3b,0x0a,0x6b,0x65,0x63,0x63,0x61,0x6b,0x5f,0x66,0x38,0x30,0x30,0x28,0x73,0x74,0x61,0x74,0x65,0x29,0x3b,0x0a,0x66,0x6f,
|
||||||
|
0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x73,0x74,0x61,0x74,0x65,0x32,0x5b,0x69,0x5d,0x3d,
|
||||||
|
0x73,0x74,0x61,0x74,0x65,0x5b,0x69,0x5d,0x3b,0x0a,0x7d,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x31,0x0a,0x66,0x6f,0x72,
|
||||||
|
0x20,0x28,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x68,0x3d,0x30,0x3b,0x20,0x68,0x3c,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x4c,0x41,0x4e,0x45,0x53,0x3b,
|
||||||
|
0x20,0x68,0x2b,0x2b,0x29,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x6d,0x69,0x78,0x5b,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x52,0x45,0x47,
|
||||||
|
0x53,0x5d,0x3b,0x0a,0x69,0x66,0x28,0x6c,0x61,0x6e,0x65,0x5f,0x69,0x64,0x3d,0x3d,0x68,0x29,0x20,0x7b,0x0a,0x73,0x68,0x61,0x72,0x65,0x5b,0x67,0x72,0x6f,0x75,0x70,
|
||||||
|
0x5f,0x69,0x64,0x5d,0x2e,0x75,0x69,0x6e,0x74,0x33,0x32,0x73,0x5b,0x30,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x32,0x5b,0x30,0x5d,0x3b,0x0a,0x73,0x68,0x61,0x72,0x65,
|
||||||
|
0x5b,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5d,0x2e,0x75,0x69,0x6e,0x74,0x33,0x32,0x73,0x5b,0x31,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x32,0x5b,0x31,0x5d,0x3b,
|
||||||
|
0x0a,0x7d,0x0a,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,
|
||||||
|
0x0a,0x66,0x69,0x6c,0x6c,0x5f,0x6d,0x69,0x78,0x28,0x73,0x68,0x61,0x72,0x65,0x5b,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5d,0x2e,0x75,0x69,0x6e,0x74,0x33,0x32,
|
||||||
|
0x73,0x2c,0x6c,0x61,0x6e,0x65,0x5f,0x69,0x64,0x2c,0x6d,0x69,0x78,0x29,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x20,0x32,
|
||||||
|
0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x6c,0x6f,0x6f,0x70,0x3d,0x30,0x3b,0x20,0x6c,0x6f,0x6f,0x70,0x3c,0x50,0x52,0x4f,0x47,
|
||||||
|
0x50,0x4f,0x57,0x5f,0x43,0x4e,0x54,0x5f,0x44,0x41,0x47,0x3b,0x20,0x2b,0x2b,0x6c,0x6f,0x6f,0x70,0x29,0x0a,0x7b,0x0a,0x69,0x66,0x28,0x6c,0x61,0x6e,0x65,0x5f,0x69,
|
||||||
|
0x64,0x3d,0x3d,0x28,0x6c,0x6f,0x6f,0x70,0x20,0x25,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x4c,0x41,0x4e,0x45,0x53,0x29,0x29,0x0a,0x73,0x68,0x61,0x72,0x65,
|
||||||
|
0x5b,0x30,0x5d,0x2e,0x75,0x69,0x6e,0x74,0x33,0x32,0x73,0x5b,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x5d,0x3d,0x6d,0x69,0x78,0x5b,0x30,0x5d,0x3b,0x0a,0x62,0x61,
|
||||||
|
0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x75,0x69,0x6e,0x74,
|
||||||
|
0x33,0x32,0x5f,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x73,0x68,0x61,0x72,0x65,0x5b,0x30,0x5d,0x2e,0x75,0x69,0x6e,0x74,0x33,0x32,0x73,0x5b,0x67,0x72,0x6f,
|
||||||
|
0x75,0x70,0x5f,0x69,0x64,0x5d,0x3b,0x0a,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x25,0x3d,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x44,0x41,0x47,0x5f,0x45,0x4c,
|
||||||
|
0x45,0x4d,0x45,0x4e,0x54,0x53,0x3b,0x0a,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x4c,0x41,
|
||||||
|
0x4e,0x45,0x53,0x2b,0x28,0x6c,0x61,0x6e,0x65,0x5f,0x69,0x64,0x5e,0x6c,0x6f,0x6f,0x70,0x29,0x20,0x25,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x4c,0x41,0x4e,
|
||||||
|
0x45,0x53,0x3b,0x0a,0x64,0x61,0x67,0x5f,0x74,0x20,0x64,0x61,0x74,0x61,0x5f,0x64,0x61,0x67,0x3d,0x67,0x5f,0x64,0x61,0x67,0x5b,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,
|
||||||
|
0x3b,0x0a,0x69,0x66,0x28,0x68,0x61,0x63,0x6b,0x5f,0x66,0x61,0x6c,0x73,0x65,0x29,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,
|
||||||
|
0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x64,0x61,0x74,0x61,0x3b,0x0a,0x58,0x4d,
|
||||||
|
0x52,0x49,0x47,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x52,0x41,0x4e,0x44,0x4f,0x4d,0x5f,0x4d,0x41,0x54,0x48,0x0a,
|
||||||
|
0x69,0x66,0x28,0x68,0x61,0x63,0x6b,0x5f,0x66,0x61,0x6c,0x73,0x65,0x29,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,
|
||||||
|
0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x58,0x4d,0x52,0x49,0x47,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x52,0x4f,0x47,0x50,
|
||||||
|
0x4f,0x57,0x5f,0x44,0x41,0x54,0x41,0x5f,0x4c,0x4f,0x41,0x44,0x53,0x0a,0x7d,0x0a,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x6d,0x69,0x78,0x5f,0x68,0x61,0x73,
|
||||||
|
0x68,0x3d,0x46,0x4e,0x56,0x5f,0x4f,0x46,0x46,0x53,0x45,0x54,0x5f,0x42,0x41,0x53,0x49,0x53,0x3b,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,
|
||||||
|
0x6c,0x6c,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x52,0x45,0x47,0x53,0x3b,
|
||||||
|
0x20,0x69,0x2b,0x2b,0x29,0x0a,0x66,0x6e,0x76,0x31,0x61,0x28,0x6d,0x69,0x78,0x5f,0x68,0x61,0x73,0x68,0x2c,0x6d,0x69,0x78,0x5b,0x69,0x5d,0x29,0x3b,0x0a,0x68,0x61,
|
||||||
|
0x73,0x68,0x33,0x32,0x5f,0x74,0x20,0x64,0x69,0x67,0x65,0x73,0x74,0x5f,0x74,0x65,0x6d,0x70,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,
|
||||||
|
0x3b,0x20,0x69,0x3c,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x64,0x69,0x67,0x65,0x73,0x74,0x5f,0x74,0x65,0x6d,0x70,0x2e,0x75,0x69,0x6e,0x74,0x33,0x32,0x73,0x5b,
|
||||||
|
0x69,0x5d,0x3d,0x46,0x4e,0x56,0x5f,0x4f,0x46,0x46,0x53,0x45,0x54,0x5f,0x42,0x41,0x53,0x49,0x53,0x3b,0x0a,0x73,0x68,0x61,0x72,0x65,0x5b,0x67,0x72,0x6f,0x75,0x70,
|
||||||
|
0x5f,0x69,0x64,0x5d,0x2e,0x75,0x69,0x6e,0x74,0x33,0x32,0x73,0x5b,0x6c,0x61,0x6e,0x65,0x5f,0x69,0x64,0x5d,0x3d,0x6d,0x69,0x78,0x5f,0x68,0x61,0x73,0x68,0x3b,0x0a,
|
||||||
|
0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0x0a,0x23,0x70,
|
||||||
|
0x72,0x61,0x67,0x6d,0x61,0x20,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x50,0x52,0x4f,
|
||||||
|
0x47,0x50,0x4f,0x57,0x5f,0x4c,0x41,0x4e,0x45,0x53,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x66,0x6e,0x76,0x31,0x61,0x28,0x64,0x69,0x67,0x65,0x73,0x74,0x5f,0x74,0x65,
|
||||||
|
0x6d,0x70,0x2e,0x75,0x69,0x6e,0x74,0x33,0x32,0x73,0x5b,0x69,0x20,0x25,0x20,0x38,0x5d,0x2c,0x73,0x68,0x61,0x72,0x65,0x5b,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,
|
||||||
|
0x5d,0x2e,0x75,0x69,0x6e,0x74,0x33,0x32,0x73,0x5b,0x69,0x5d,0x29,0x3b,0x0a,0x69,0x66,0x28,0x68,0x3d,0x3d,0x6c,0x61,0x6e,0x65,0x5f,0x69,0x64,0x29,0x0a,0x64,0x69,
|
||||||
|
0x67,0x65,0x73,0x74,0x3d,0x64,0x69,0x67,0x65,0x73,0x74,0x5f,0x74,0x65,0x6d,0x70,0x3b,0x0a,0x7d,0x0a,0x75,0x69,0x6e,0x74,0x36,0x34,0x5f,0x74,0x20,0x72,0x65,0x73,
|
||||||
|
0x75,0x6c,0x74,0x3b,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x20,0x73,0x74,0x61,0x74,0x65,0x5b,0x32,0x35,0x5d,0x3d,0x7b,0x30,0x78,0x30,0x7d,0x3b,
|
||||||
|
0x20,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x73,0x74,0x61,0x74,0x65,0x5b,
|
||||||
|
0x69,0x5d,0x3d,0x73,0x74,0x61,0x74,0x65,0x32,0x5b,0x69,0x5d,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x38,0x3b,0x20,0x69,0x3c,0x31,0x36,
|
||||||
|
0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x73,0x74,0x61,0x74,0x65,0x5b,0x69,0x5d,0x3d,0x64,0x69,0x67,0x65,0x73,0x74,0x2e,0x75,0x69,0x6e,0x74,0x33,0x32,0x73,0x5b,0x69,
|
||||||
|
0x2d,0x38,0x5d,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x31,0x36,0x3b,0x20,0x69,0x3c,0x32,0x35,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x0a,0x73,
|
||||||
|
0x74,0x61,0x74,0x65,0x5b,0x69,0x5d,0x3d,0x72,0x61,0x76,0x65,0x6e,0x63,0x6f,0x69,0x6e,0x5f,0x72,0x6e,0x64,0x63,0x5b,0x69,0x2d,0x31,0x36,0x5d,0x3b,0x0a,0x6b,0x65,
|
||||||
|
0x63,0x63,0x61,0x6b,0x5f,0x66,0x38,0x30,0x30,0x28,0x73,0x74,0x61,0x74,0x65,0x29,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x36,0x34,0x5f,0x74,0x20,0x72,0x65,0x73,0x3d,0x28,
|
||||||
|
0x75,0x69,0x6e,0x74,0x36,0x34,0x5f,0x74,0x29,0x73,0x74,0x61,0x74,0x65,0x5b,0x31,0x5d,0x3c,0x3c,0x33,0x32,0x7c,0x73,0x74,0x61,0x74,0x65,0x5b,0x30,0x5d,0x3b,0x0a,
|
||||||
|
0x72,0x65,0x73,0x75,0x6c,0x74,0x3d,0x61,0x73,0x5f,0x75,0x6c,0x6f,0x6e,0x67,0x28,0x61,0x73,0x5f,0x75,0x63,0x68,0x61,0x72,0x38,0x28,0x72,0x65,0x73,0x29,0x2e,0x73,
|
||||||
|
0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x29,0x3b,0x0a,0x7d,0x0a,0x69,0x66,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x3c,0x3d,0x74,0x61,0x72,0x67,0x65,0x74,0x29,0x0a,
|
||||||
|
0x7b,0x0a,0x2a,0x73,0x74,0x6f,0x70,0x3d,0x31,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6b,0x3d,0x61,0x74,0x6f,0x6d,0x69,0x63,0x5f,0x69,
|
||||||
|
0x6e,0x63,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x73,0x29,0x2b,0x31,0x3b,0x0a,0x69,0x66,0x28,0x6b,0x3c,0x3d,0x31,0x35,0x29,0x0a,0x72,0x65,0x73,0x75,0x6c,0x74,0x73,
|
||||||
|
0x5b,0x6b,0x5d,0x3d,0x67,0x69,0x64,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace xmrig
|
283
src/backend/opencl/cl/kawpow/kawpow_dag.cl
Normal file
283
src/backend/opencl/cl/kawpow/kawpow_dag.cl
Normal file
|
@ -0,0 +1,283 @@
|
||||||
|
#include "defs.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// DAG calculation logic
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#define ETHASH_DATASET_PARENTS 512
|
||||||
|
#define NODE_WORDS (64 / 4)
|
||||||
|
|
||||||
|
__constant uint2 const Keccak_f1600_RC[24] = {
|
||||||
|
(uint2)(0x00000001, 0x00000000),
|
||||||
|
(uint2)(0x00008082, 0x00000000),
|
||||||
|
(uint2)(0x0000808a, 0x80000000),
|
||||||
|
(uint2)(0x80008000, 0x80000000),
|
||||||
|
(uint2)(0x0000808b, 0x00000000),
|
||||||
|
(uint2)(0x80000001, 0x00000000),
|
||||||
|
(uint2)(0x80008081, 0x80000000),
|
||||||
|
(uint2)(0x00008009, 0x80000000),
|
||||||
|
(uint2)(0x0000008a, 0x00000000),
|
||||||
|
(uint2)(0x00000088, 0x00000000),
|
||||||
|
(uint2)(0x80008009, 0x00000000),
|
||||||
|
(uint2)(0x8000000a, 0x00000000),
|
||||||
|
(uint2)(0x8000808b, 0x00000000),
|
||||||
|
(uint2)(0x0000008b, 0x80000000),
|
||||||
|
(uint2)(0x00008089, 0x80000000),
|
||||||
|
(uint2)(0x00008003, 0x80000000),
|
||||||
|
(uint2)(0x00008002, 0x80000000),
|
||||||
|
(uint2)(0x00000080, 0x80000000),
|
||||||
|
(uint2)(0x0000800a, 0x00000000),
|
||||||
|
(uint2)(0x8000000a, 0x80000000),
|
||||||
|
(uint2)(0x80008081, 0x80000000),
|
||||||
|
(uint2)(0x00008080, 0x80000000),
|
||||||
|
(uint2)(0x80000001, 0x00000000),
|
||||||
|
(uint2)(0x80008008, 0x80000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
#if PLATFORM == OPENCL_PLATFORM_NVIDIA && COMPUTE >= 35
|
||||||
|
static uint2 ROL2(const uint2 a, const int offset)
|
||||||
|
{
|
||||||
|
uint2 result;
|
||||||
|
if (offset >= 32)
|
||||||
|
{
|
||||||
|
asm("shf.l.wrap.b32 %0, %1, %2, %3;" : "=r"(result.x) : "r"(a.x), "r"(a.y), "r"(offset));
|
||||||
|
asm("shf.l.wrap.b32 %0, %1, %2, %3;" : "=r"(result.y) : "r"(a.y), "r"(a.x), "r"(offset));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
asm("shf.l.wrap.b32 %0, %1, %2, %3;" : "=r"(result.x) : "r"(a.y), "r"(a.x), "r"(offset));
|
||||||
|
asm("shf.l.wrap.b32 %0, %1, %2, %3;" : "=r"(result.y) : "r"(a.x), "r"(a.y), "r"(offset));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#elif PLATFORM == OPENCL_PLATFORM_AMD
|
||||||
|
#pragma OPENCL EXTENSION cl_amd_media_ops : enable
|
||||||
|
static uint2 ROL2(const uint2 vv, const int r)
|
||||||
|
{
|
||||||
|
if (r <= 32)
|
||||||
|
{
|
||||||
|
return amd_bitalign((vv).xy, (vv).yx, 32 - r);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return amd_bitalign((vv).yx, (vv).xy, 64 - r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static uint2 ROL2(const uint2 v, const int n)
|
||||||
|
{
|
||||||
|
uint2 result;
|
||||||
|
if (n <= 32)
|
||||||
|
{
|
||||||
|
result.y = ((v.y << (n)) | (v.x >> (32 - n)));
|
||||||
|
result.x = ((v.x << (n)) | (v.y >> (32 - n)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.y = ((v.x << (n - 32)) | (v.y >> (64 - n)));
|
||||||
|
result.x = ((v.y << (n - 32)) | (v.x >> (64 - n)));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void chi(uint2* a, const uint n, const uint2* t)
|
||||||
|
{
|
||||||
|
a[n + 0] = bitselect(t[n + 0] ^ t[n + 2], t[n + 0], t[n + 1]);
|
||||||
|
a[n + 1] = bitselect(t[n + 1] ^ t[n + 3], t[n + 1], t[n + 2]);
|
||||||
|
a[n + 2] = bitselect(t[n + 2] ^ t[n + 4], t[n + 2], t[n + 3]);
|
||||||
|
a[n + 3] = bitselect(t[n + 3] ^ t[n + 0], t[n + 3], t[n + 4]);
|
||||||
|
a[n + 4] = bitselect(t[n + 4] ^ t[n + 1], t[n + 4], t[n + 0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void keccak_f1600_round(uint2* a, uint r)
|
||||||
|
{
|
||||||
|
uint2 t[25];
|
||||||
|
uint2 u;
|
||||||
|
|
||||||
|
// Theta
|
||||||
|
t[0] = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20];
|
||||||
|
t[1] = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21];
|
||||||
|
t[2] = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22];
|
||||||
|
t[3] = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23];
|
||||||
|
t[4] = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24];
|
||||||
|
u = t[4] ^ ROL2(t[1], 1);
|
||||||
|
a[0] ^= u;
|
||||||
|
a[5] ^= u;
|
||||||
|
a[10] ^= u;
|
||||||
|
a[15] ^= u;
|
||||||
|
a[20] ^= u;
|
||||||
|
u = t[0] ^ ROL2(t[2], 1);
|
||||||
|
a[1] ^= u;
|
||||||
|
a[6] ^= u;
|
||||||
|
a[11] ^= u;
|
||||||
|
a[16] ^= u;
|
||||||
|
a[21] ^= u;
|
||||||
|
u = t[1] ^ ROL2(t[3], 1);
|
||||||
|
a[2] ^= u;
|
||||||
|
a[7] ^= u;
|
||||||
|
a[12] ^= u;
|
||||||
|
a[17] ^= u;
|
||||||
|
a[22] ^= u;
|
||||||
|
u = t[2] ^ ROL2(t[4], 1);
|
||||||
|
a[3] ^= u;
|
||||||
|
a[8] ^= u;
|
||||||
|
a[13] ^= u;
|
||||||
|
a[18] ^= u;
|
||||||
|
a[23] ^= u;
|
||||||
|
u = t[3] ^ ROL2(t[0], 1);
|
||||||
|
a[4] ^= u;
|
||||||
|
a[9] ^= u;
|
||||||
|
a[14] ^= u;
|
||||||
|
a[19] ^= u;
|
||||||
|
a[24] ^= u;
|
||||||
|
|
||||||
|
// Rho Pi
|
||||||
|
|
||||||
|
t[0] = a[0];
|
||||||
|
t[10] = ROL2(a[1], 1);
|
||||||
|
t[20] = ROL2(a[2], 62);
|
||||||
|
t[5] = ROL2(a[3], 28);
|
||||||
|
t[15] = ROL2(a[4], 27);
|
||||||
|
|
||||||
|
t[16] = ROL2(a[5], 36);
|
||||||
|
t[1] = ROL2(a[6], 44);
|
||||||
|
t[11] = ROL2(a[7], 6);
|
||||||
|
t[21] = ROL2(a[8], 55);
|
||||||
|
t[6] = ROL2(a[9], 20);
|
||||||
|
|
||||||
|
t[7] = ROL2(a[10], 3);
|
||||||
|
t[17] = ROL2(a[11], 10);
|
||||||
|
t[2] = ROL2(a[12], 43);
|
||||||
|
t[12] = ROL2(a[13], 25);
|
||||||
|
t[22] = ROL2(a[14], 39);
|
||||||
|
|
||||||
|
t[23] = ROL2(a[15], 41);
|
||||||
|
t[8] = ROL2(a[16], 45);
|
||||||
|
t[18] = ROL2(a[17], 15);
|
||||||
|
t[3] = ROL2(a[18], 21);
|
||||||
|
t[13] = ROL2(a[19], 8);
|
||||||
|
|
||||||
|
t[14] = ROL2(a[20], 18);
|
||||||
|
t[24] = ROL2(a[21], 2);
|
||||||
|
t[9] = ROL2(a[22], 61);
|
||||||
|
t[19] = ROL2(a[23], 56);
|
||||||
|
t[4] = ROL2(a[24], 14);
|
||||||
|
|
||||||
|
// Chi
|
||||||
|
chi(a, 0, t);
|
||||||
|
|
||||||
|
// Iota
|
||||||
|
a[0] ^= Keccak_f1600_RC[r];
|
||||||
|
|
||||||
|
chi(a, 5, t);
|
||||||
|
chi(a, 10, t);
|
||||||
|
chi(a, 15, t);
|
||||||
|
chi(a, 20, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void keccak_f1600_no_absorb(uint2* a, uint out_size, uint isolate)
|
||||||
|
{
|
||||||
|
// Originally I unrolled the first and last rounds to interface
|
||||||
|
// better with surrounding code, however I haven't done this
|
||||||
|
// without causing the AMD compiler to blow up the VGPR usage.
|
||||||
|
|
||||||
|
|
||||||
|
// uint o = 25;
|
||||||
|
for (uint r = 0; r < 24;)
|
||||||
|
{
|
||||||
|
// This dynamic branch stops the AMD compiler unrolling the loop
|
||||||
|
// and additionally saves about 33% of the VGPRs, enough to gain another
|
||||||
|
// wavefront. Ideally we'd get 4 in flight, but 3 is the best I can
|
||||||
|
// massage out of the compiler. It doesn't really seem to matter how
|
||||||
|
// much we try and help the compiler save VGPRs because it seems to throw
|
||||||
|
// that information away, hence the implementation of keccak here
|
||||||
|
// doesn't bother.
|
||||||
|
if (isolate)
|
||||||
|
{
|
||||||
|
keccak_f1600_round(a, r++);
|
||||||
|
// if (r == 23) o = out_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// final round optimised for digest size
|
||||||
|
// keccak_f1600_round(a, 23, out_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define copy(dst, src, count) \
|
||||||
|
for (uint i = 0; i != count; ++i) \
|
||||||
|
{ \
|
||||||
|
(dst)[i] = (src)[i]; \
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint fnv(uint x, uint y)
|
||||||
|
{
|
||||||
|
return x * FNV_PRIME ^ y;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint4 fnv4(uint4 x, uint4 y)
|
||||||
|
{
|
||||||
|
return x * FNV_PRIME ^ y;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
uint words[64 / sizeof(uint)];
|
||||||
|
uint2 uint2s[64 / sizeof(uint2)];
|
||||||
|
uint4 uint4s[64 / sizeof(uint4)];
|
||||||
|
} hash64_t;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
uint words[200 / sizeof(uint)];
|
||||||
|
uint2 uint2s[200 / sizeof(uint2)];
|
||||||
|
uint4 uint4s[200 / sizeof(uint4)];
|
||||||
|
} hash200_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint4 uint4s[128 / sizeof(uint4)];
|
||||||
|
} hash128_t;
|
||||||
|
|
||||||
|
static void SHA3_512(uint2* s, uint isolate)
|
||||||
|
{
|
||||||
|
for (uint i = 8; i != 25; ++i)
|
||||||
|
{
|
||||||
|
s[i] = (uint2){0, 0};
|
||||||
|
}
|
||||||
|
s[8].x = 0x00000001;
|
||||||
|
s[8].y = 0x80000000;
|
||||||
|
keccak_f1600_no_absorb(s, 8, isolate);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint fast_mod(uint a, uint4 d)
|
||||||
|
{
|
||||||
|
const ulong t = a;
|
||||||
|
const uint q = ((t + d.y) * d.x) >> d.z;
|
||||||
|
return a - q * d.w;
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel void ethash_calculate_dag_item(uint start, __global hash64_t const* g_light, __global hash64_t* g_dag, uint isolate, uint dag_words, uint4 light_words)
|
||||||
|
{
|
||||||
|
uint const node_index = start + get_global_id(0);
|
||||||
|
if (node_index >= dag_words)
|
||||||
|
return;
|
||||||
|
|
||||||
|
hash200_t dag_node;
|
||||||
|
copy(dag_node.uint4s, g_light[fast_mod(node_index, light_words)].uint4s, 4);
|
||||||
|
dag_node.words[0] ^= node_index;
|
||||||
|
SHA3_512(dag_node.uint2s, isolate);
|
||||||
|
|
||||||
|
for (uint i = 0; i != ETHASH_DATASET_PARENTS; ++i)
|
||||||
|
{
|
||||||
|
uint parent_index = fast_mod(fnv(node_index ^ i, dag_node.words[i % NODE_WORDS]), light_words);
|
||||||
|
|
||||||
|
for (uint w = 0; w != 4; ++w)
|
||||||
|
dag_node.uint4s[w] = fnv4(dag_node.uint4s[w], g_light[parent_index].uint4s[w]);
|
||||||
|
}
|
||||||
|
|
||||||
|
SHA3_512(dag_node.uint2s, isolate);
|
||||||
|
copy(g_dag[node_index].uint4s, dag_node.uint4s, 4);
|
||||||
|
}
|
196
src/backend/opencl/cl/kawpow/kawpow_dag_cl.h
Normal file
196
src/backend/opencl/cl/kawpow/kawpow_dag_cl.h
Normal file
|
@ -0,0 +1,196 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
static const char kawpow_dag_cl[5990] = {
|
||||||
|
0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x63,0x6c,0x5f,0x63,0x6c,0x61,0x6e,0x67,0x5f,0x73,0x74,0x6f,0x72,0x61,0x67,0x65,0x5f,0x63,0x6c,0x61,0x73,0x73,0x5f,0x73,0x70,
|
||||||
|
0x65,0x63,0x69,0x66,0x69,0x65,0x72,0x73,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,
|
||||||
|
0x4e,0x20,0x63,0x6c,0x5f,0x63,0x6c,0x61,0x6e,0x67,0x5f,0x73,0x74,0x6f,0x72,0x61,0x67,0x65,0x5f,0x63,0x6c,0x61,0x73,0x73,0x5f,0x73,0x70,0x65,0x63,0x69,0x66,0x69,
|
||||||
|
0x65,0x72,0x73,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x47,0x52,0x4f,0x55,
|
||||||
|
0x50,0x5f,0x53,0x49,0x5a,0x45,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x20,0x32,0x35,0x36,0x0a,0x23,0x65,
|
||||||
|
0x6e,0x64,0x69,0x66,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x41,0x52,0x45,0x20,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,
|
||||||
|
0x53,0x49,0x5a,0x45,0x20,0x2f,0x20,0x31,0x36,0x29,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,0x6e,0x73,0x69,0x67,0x6e,0x65,0x64,0x20,0x69,0x6e,0x74,0x20,
|
||||||
|
0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x3b,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,0x6e,0x73,0x69,0x67,0x6e,0x65,0x64,0x20,0x6c,0x6f,0x6e,0x67,0x20,
|
||||||
|
0x75,0x69,0x6e,0x74,0x36,0x34,0x5f,0x74,0x3b,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x52,0x4f,0x54,0x4c,0x33,0x32,0x28,0x78,0x2c,0x20,0x6e,0x29,0x20,0x72,
|
||||||
|
0x6f,0x74,0x61,0x74,0x65,0x28,0x28,0x78,0x29,0x2c,0x20,0x28,0x75,0x69,0x6e,0x74,0x33,0x32,0x5f,0x74,0x29,0x28,0x6e,0x29,0x29,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,
|
||||||
|
0x65,0x20,0x52,0x4f,0x54,0x52,0x33,0x32,0x28,0x78,0x2c,0x20,0x6e,0x29,0x20,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x28,0x78,0x29,0x2c,0x20,0x28,0x75,0x69,0x6e,0x74,
|
||||||
|
0x33,0x32,0x5f,0x74,0x29,0x28,0x33,0x32,0x2d,0x6e,0x29,0x29,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x4c,0x41,0x4e,
|
||||||
|
0x45,0x53,0x20,0x31,0x36,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x52,0x45,0x47,0x53,0x20,0x33,0x32,0x0a,0x23,0x64,
|
||||||
|
0x65,0x66,0x69,0x6e,0x65,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x44,0x41,0x47,0x5f,0x4c,0x4f,0x41,0x44,0x53,0x20,0x34,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,
|
||||||
|
0x65,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x43,0x41,0x43,0x48,0x45,0x5f,0x57,0x4f,0x52,0x44,0x53,0x20,0x34,0x30,0x39,0x36,0x0a,0x23,0x64,0x65,0x66,0x69,
|
||||||
|
0x6e,0x65,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x43,0x4e,0x54,0x5f,0x44,0x41,0x47,0x20,0x36,0x34,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x50,0x52,
|
||||||
|
0x4f,0x47,0x50,0x4f,0x57,0x5f,0x43,0x4e,0x54,0x5f,0x4d,0x41,0x54,0x48,0x20,0x31,0x38,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,
|
||||||
|
0x5f,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,0x55,0x4e,0x4b,0x4e,0x4f,0x57,0x4e,0x20,0x30,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4f,0x50,0x45,0x4e,
|
||||||
|
0x43,0x4c,0x5f,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,0x4e,0x56,0x49,0x44,0x49,0x41,0x20,0x31,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4f,0x50,0x45,
|
||||||
|
0x4e,0x43,0x4c,0x5f,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,0x41,0x4d,0x44,0x20,0x32,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4f,0x50,0x45,0x4e,0x43,
|
||||||
|
0x4c,0x5f,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,0x43,0x4c,0x4f,0x56,0x45,0x52,0x20,0x33,0x0a,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x4d,0x41,0x58,0x5f,
|
||||||
|
0x4f,0x55,0x54,0x50,0x55,0x54,0x53,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4d,0x41,0x58,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x53,0x20,0x36,0x33,0x55,0x0a,
|
||||||
|
0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,
|
||||||
|
0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,0x41,0x4d,0x44,0x0a,0x23,0x65,0x6e,
|
||||||
|
0x64,0x69,0x66,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x48,0x41,0x53,0x48,0x45,0x53,0x5f,0x50,0x45,0x52,0x5f,0x47,0x52,0x4f,0x55,0x50,0x20,0x28,0x47,0x52,
|
||||||
|
0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2f,0x20,0x50,0x52,0x4f,0x47,0x50,0x4f,0x57,0x5f,0x4c,0x41,0x4e,0x45,0x53,0x29,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,
|
||||||
|
0x65,0x20,0x46,0x4e,0x56,0x5f,0x50,0x52,0x49,0x4d,0x45,0x20,0x30,0x78,0x31,0x30,0x30,0x30,0x31,0x39,0x33,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x46,0x4e,
|
||||||
|
0x56,0x5f,0x4f,0x46,0x46,0x53,0x45,0x54,0x5f,0x42,0x41,0x53,0x49,0x53,0x20,0x30,0x78,0x38,0x31,0x31,0x63,0x39,0x64,0x63,0x35,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,
|
||||||
|
0x65,0x20,0x45,0x54,0x48,0x41,0x53,0x48,0x5f,0x44,0x41,0x54,0x41,0x53,0x45,0x54,0x5f,0x50,0x41,0x52,0x45,0x4e,0x54,0x53,0x20,0x35,0x31,0x32,0x0a,0x23,0x64,0x65,
|
||||||
|
0x66,0x69,0x6e,0x65,0x20,0x4e,0x4f,0x44,0x45,0x5f,0x57,0x4f,0x52,0x44,0x53,0x20,0x28,0x36,0x34,0x20,0x2f,0x20,0x34,0x29,0x0a,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,
|
||||||
|
0x61,0x6e,0x74,0x20,0x75,0x69,0x6e,0x74,0x32,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x4b,0x65,0x63,0x63,0x61,0x6b,0x5f,0x66,0x31,0x36,0x30,0x30,0x5f,0x52,0x43,0x5b,
|
||||||
|
0x32,0x34,0x5d,0x3d,0x7b,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x38,0x32,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x38,0x61,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x38,0x30,0x30,0x30,0x38,0x30,0x30,0x30,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x38,0x62,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x38,0x30,0x30,0x30,0x38,0x30,0x38,0x31,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x39,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x61,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x38,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x38,0x30,0x30,0x30,0x38,0x30,0x30,0x39,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x61,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x38,0x30,0x30,0x30,0x38,0x30,0x38,0x62,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x62,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x38,0x39,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x33,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x32,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x30,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x30,0x61,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x61,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x38,0x30,0x30,0x30,0x38,0x30,0x38,0x31,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x30,0x30,0x30,0x30,0x38,0x30,0x38,0x30,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x2c,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x28,0x30,0x78,0x38,0x30,0x30,0x30,0x38,0x30,0x30,0x38,0x2c,0x30,0x78,0x38,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x30,0x29,0x2c,0x0a,0x7d,0x3b,0x0a,0x23,0x69,0x66,0x20,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x20,0x3d,0x3d,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,
|
||||||
|
0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,0x4e,0x56,0x49,0x44,0x49,0x41,0x20,0x26,0x26,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x20,0x3e,0x3d,0x20,0x33,0x35,
|
||||||
|
0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x75,0x69,0x6e,0x74,0x32,0x20,0x52,0x4f,0x4c,0x32,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x32,0x20,0x61,
|
||||||
|
0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x32,0x20,0x72,0x65,0x73,0x75,0x6c,
|
||||||
|
0x74,0x3b,0x0a,0x69,0x66,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x3e,0x3d,0x33,0x32,0x29,0x0a,0x7b,0x0a,0x61,0x73,0x6d,0x28,0x22,0x73,0x68,0x66,0x2e,0x6c,0x2e,0x77,
|
||||||
|
0x72,0x61,0x70,0x2e,0x62,0x33,0x32,0x20,0x25,0x30,0x2c,0x25,0x31,0x2c,0x25,0x32,0x2c,0x25,0x33,0x3b,0x22,0x3a,0x22,0x3d,0x72,0x22,0x28,0x72,0x65,0x73,0x75,0x6c,
|
||||||
|
0x74,0x2e,0x78,0x29,0x3a,0x22,0x72,0x22,0x28,0x61,0x2e,0x78,0x29,0x2c,0x22,0x72,0x22,0x28,0x61,0x2e,0x79,0x29,0x2c,0x22,0x72,0x22,0x28,0x6f,0x66,0x66,0x73,0x65,
|
||||||
|
0x74,0x29,0x29,0x3b,0x0a,0x61,0x73,0x6d,0x28,0x22,0x73,0x68,0x66,0x2e,0x6c,0x2e,0x77,0x72,0x61,0x70,0x2e,0x62,0x33,0x32,0x20,0x25,0x30,0x2c,0x25,0x31,0x2c,0x25,
|
||||||
|
0x32,0x2c,0x25,0x33,0x3b,0x22,0x3a,0x22,0x3d,0x72,0x22,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2e,0x79,0x29,0x3a,0x22,0x72,0x22,0x28,0x61,0x2e,0x79,0x29,0x2c,0x22,
|
||||||
|
0x72,0x22,0x28,0x61,0x2e,0x78,0x29,0x2c,0x22,0x72,0x22,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0x0a,0x7d,0x0a,0x65,0x6c,0x73,0x65,0x0a,0x7b,0x0a,0x61,
|
||||||
|
0x73,0x6d,0x28,0x22,0x73,0x68,0x66,0x2e,0x6c,0x2e,0x77,0x72,0x61,0x70,0x2e,0x62,0x33,0x32,0x20,0x25,0x30,0x2c,0x25,0x31,0x2c,0x25,0x32,0x2c,0x25,0x33,0x3b,0x22,
|
||||||
|
0x3a,0x22,0x3d,0x72,0x22,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2e,0x78,0x29,0x3a,0x22,0x72,0x22,0x28,0x61,0x2e,0x79,0x29,0x2c,0x22,0x72,0x22,0x28,0x61,0x2e,0x78,
|
||||||
|
0x29,0x2c,0x22,0x72,0x22,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0x0a,0x61,0x73,0x6d,0x28,0x22,0x73,0x68,0x66,0x2e,0x6c,0x2e,0x77,0x72,0x61,0x70,0x2e,
|
||||||
|
0x62,0x33,0x32,0x20,0x25,0x30,0x2c,0x25,0x31,0x2c,0x25,0x32,0x2c,0x25,0x33,0x3b,0x22,0x3a,0x22,0x3d,0x72,0x22,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2e,0x79,0x29,
|
||||||
|
0x3a,0x22,0x72,0x22,0x28,0x61,0x2e,0x78,0x29,0x2c,0x22,0x72,0x22,0x28,0x61,0x2e,0x79,0x29,0x2c,0x22,0x72,0x22,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,
|
||||||
|
0x0a,0x7d,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x3b,0x0a,0x7d,0x0a,0x23,0x65,0x6c,0x69,0x66,0x20,0x50,0x4c,0x41,0x54,0x46,0x4f,
|
||||||
|
0x52,0x4d,0x20,0x3d,0x3d,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x50,0x4c,0x41,0x54,0x46,0x4f,0x52,0x4d,0x5f,0x41,0x4d,0x44,0x0a,0x23,0x70,0x72,0x61,0x67,0x6d,
|
||||||
|
0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x61,0x6d,0x64,0x5f,0x6d,0x65,0x64,0x69,0x61,0x5f,
|
||||||
|
0x6f,0x70,0x73,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x75,0x69,0x6e,0x74,0x32,0x20,0x52,0x4f,0x4c,0x32,0x28,0x63,
|
||||||
|
0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x32,0x20,0x76,0x76,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x29,0x0a,0x7b,0x0a,0x69,0x66,0x28,
|
||||||
|
0x72,0x3c,0x3d,0x33,0x32,0x29,0x0a,0x7b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x61,0x6d,0x64,0x5f,0x62,0x69,0x74,0x61,0x6c,0x69,0x67,0x6e,0x28,0x28,0x76,0x76,
|
||||||
|
0x29,0x2e,0x78,0x79,0x2c,0x28,0x76,0x76,0x29,0x2e,0x79,0x78,0x2c,0x33,0x32,0x2d,0x72,0x29,0x3b,0x0a,0x7d,0x0a,0x65,0x6c,0x73,0x65,0x0a,0x7b,0x0a,0x72,0x65,0x74,
|
||||||
|
0x75,0x72,0x6e,0x20,0x61,0x6d,0x64,0x5f,0x62,0x69,0x74,0x61,0x6c,0x69,0x67,0x6e,0x28,0x28,0x76,0x76,0x29,0x2e,0x79,0x78,0x2c,0x28,0x76,0x76,0x29,0x2e,0x78,0x79,
|
||||||
|
0x2c,0x36,0x34,0x2d,0x72,0x29,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x23,0x65,0x6c,0x73,0x65,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x75,0x69,0x6e,0x74,0x32,0x20,0x52,
|
||||||
|
0x4f,0x4c,0x32,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x32,0x20,0x76,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6e,0x29,0x0a,0x7b,
|
||||||
|
0x0a,0x75,0x69,0x6e,0x74,0x32,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x3b,0x0a,0x69,0x66,0x28,0x6e,0x3c,0x3d,0x33,0x32,0x29,0x0a,0x7b,0x0a,0x72,0x65,0x73,0x75,0x6c,
|
||||||
|
0x74,0x2e,0x79,0x3d,0x28,0x28,0x76,0x2e,0x79,0x3c,0x3c,0x28,0x6e,0x29,0x29,0x7c,0x28,0x76,0x2e,0x78,0x3e,0x3e,0x28,0x33,0x32,0x2d,0x6e,0x29,0x29,0x29,0x3b,0x0a,
|
||||||
|
0x72,0x65,0x73,0x75,0x6c,0x74,0x2e,0x78,0x3d,0x28,0x28,0x76,0x2e,0x78,0x3c,0x3c,0x28,0x6e,0x29,0x29,0x7c,0x28,0x76,0x2e,0x79,0x3e,0x3e,0x28,0x33,0x32,0x2d,0x6e,
|
||||||
|
0x29,0x29,0x29,0x3b,0x0a,0x7d,0x0a,0x65,0x6c,0x73,0x65,0x0a,0x7b,0x0a,0x72,0x65,0x73,0x75,0x6c,0x74,0x2e,0x79,0x3d,0x28,0x28,0x76,0x2e,0x78,0x3c,0x3c,0x28,0x6e,
|
||||||
|
0x2d,0x33,0x32,0x29,0x29,0x7c,0x28,0x76,0x2e,0x79,0x3e,0x3e,0x28,0x36,0x34,0x2d,0x6e,0x29,0x29,0x29,0x3b,0x0a,0x72,0x65,0x73,0x75,0x6c,0x74,0x2e,0x78,0x3d,0x28,
|
||||||
|
0x28,0x76,0x2e,0x79,0x3c,0x3c,0x28,0x6e,0x2d,0x33,0x32,0x29,0x29,0x7c,0x28,0x76,0x2e,0x78,0x3e,0x3e,0x28,0x36,0x34,0x2d,0x6e,0x29,0x29,0x29,0x3b,0x0a,0x7d,0x0a,
|
||||||
|
0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x3b,0x0a,0x7d,0x0a,0x23,0x65,0x6e,0x64,0x69,0x66,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x76,
|
||||||
|
0x6f,0x69,0x64,0x20,0x63,0x68,0x69,0x28,0x75,0x69,0x6e,0x74,0x32,0x2a,0x20,0x61,0x2c,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6e,0x2c,0x63,0x6f,
|
||||||
|
0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x32,0x2a,0x20,0x74,0x29,0x0a,0x7b,0x0a,0x61,0x5b,0x6e,0x2b,0x30,0x5d,0x3d,0x62,0x69,0x74,0x73,0x65,0x6c,0x65,0x63,0x74,
|
||||||
|
0x28,0x74,0x5b,0x6e,0x2b,0x30,0x5d,0x5e,0x74,0x5b,0x6e,0x2b,0x32,0x5d,0x2c,0x74,0x5b,0x6e,0x2b,0x30,0x5d,0x2c,0x74,0x5b,0x6e,0x2b,0x31,0x5d,0x29,0x3b,0x0a,0x61,
|
||||||
|
0x5b,0x6e,0x2b,0x31,0x5d,0x3d,0x62,0x69,0x74,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x74,0x5b,0x6e,0x2b,0x31,0x5d,0x5e,0x74,0x5b,0x6e,0x2b,0x33,0x5d,0x2c,0x74,0x5b,
|
||||||
|
0x6e,0x2b,0x31,0x5d,0x2c,0x74,0x5b,0x6e,0x2b,0x32,0x5d,0x29,0x3b,0x0a,0x61,0x5b,0x6e,0x2b,0x32,0x5d,0x3d,0x62,0x69,0x74,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x74,
|
||||||
|
0x5b,0x6e,0x2b,0x32,0x5d,0x5e,0x74,0x5b,0x6e,0x2b,0x34,0x5d,0x2c,0x74,0x5b,0x6e,0x2b,0x32,0x5d,0x2c,0x74,0x5b,0x6e,0x2b,0x33,0x5d,0x29,0x3b,0x0a,0x61,0x5b,0x6e,
|
||||||
|
0x2b,0x33,0x5d,0x3d,0x62,0x69,0x74,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x74,0x5b,0x6e,0x2b,0x33,0x5d,0x5e,0x74,0x5b,0x6e,0x2b,0x30,0x5d,0x2c,0x74,0x5b,0x6e,0x2b,
|
||||||
|
0x33,0x5d,0x2c,0x74,0x5b,0x6e,0x2b,0x34,0x5d,0x29,0x3b,0x0a,0x61,0x5b,0x6e,0x2b,0x34,0x5d,0x3d,0x62,0x69,0x74,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x74,0x5b,0x6e,
|
||||||
|
0x2b,0x34,0x5d,0x5e,0x74,0x5b,0x6e,0x2b,0x31,0x5d,0x2c,0x74,0x5b,0x6e,0x2b,0x34,0x5d,0x2c,0x74,0x5b,0x6e,0x2b,0x30,0x5d,0x29,0x3b,0x0a,0x7d,0x0a,0x73,0x74,0x61,
|
||||||
|
0x74,0x69,0x63,0x20,0x76,0x6f,0x69,0x64,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x5f,0x66,0x31,0x36,0x30,0x30,0x5f,0x72,0x6f,0x75,0x6e,0x64,0x28,0x75,0x69,0x6e,0x74,
|
||||||
|
0x32,0x2a,0x20,0x61,0x2c,0x75,0x69,0x6e,0x74,0x20,0x72,0x29,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x32,0x20,0x74,0x5b,0x32,0x35,0x5d,0x3b,0x0a,0x75,0x69,0x6e,0x74,
|
||||||
|
0x32,0x20,0x75,0x3b,0x0a,0x74,0x5b,0x30,0x5d,0x3d,0x61,0x5b,0x30,0x5d,0x5e,0x61,0x5b,0x35,0x5d,0x5e,0x61,0x5b,0x31,0x30,0x5d,0x5e,0x61,0x5b,0x31,0x35,0x5d,0x5e,
|
||||||
|
0x61,0x5b,0x32,0x30,0x5d,0x3b,0x0a,0x74,0x5b,0x31,0x5d,0x3d,0x61,0x5b,0x31,0x5d,0x5e,0x61,0x5b,0x36,0x5d,0x5e,0x61,0x5b,0x31,0x31,0x5d,0x5e,0x61,0x5b,0x31,0x36,
|
||||||
|
0x5d,0x5e,0x61,0x5b,0x32,0x31,0x5d,0x3b,0x0a,0x74,0x5b,0x32,0x5d,0x3d,0x61,0x5b,0x32,0x5d,0x5e,0x61,0x5b,0x37,0x5d,0x5e,0x61,0x5b,0x31,0x32,0x5d,0x5e,0x61,0x5b,
|
||||||
|
0x31,0x37,0x5d,0x5e,0x61,0x5b,0x32,0x32,0x5d,0x3b,0x0a,0x74,0x5b,0x33,0x5d,0x3d,0x61,0x5b,0x33,0x5d,0x5e,0x61,0x5b,0x38,0x5d,0x5e,0x61,0x5b,0x31,0x33,0x5d,0x5e,
|
||||||
|
0x61,0x5b,0x31,0x38,0x5d,0x5e,0x61,0x5b,0x32,0x33,0x5d,0x3b,0x0a,0x74,0x5b,0x34,0x5d,0x3d,0x61,0x5b,0x34,0x5d,0x5e,0x61,0x5b,0x39,0x5d,0x5e,0x61,0x5b,0x31,0x34,
|
||||||
|
0x5d,0x5e,0x61,0x5b,0x31,0x39,0x5d,0x5e,0x61,0x5b,0x32,0x34,0x5d,0x3b,0x0a,0x75,0x3d,0x74,0x5b,0x34,0x5d,0x5e,0x52,0x4f,0x4c,0x32,0x28,0x74,0x5b,0x31,0x5d,0x2c,
|
||||||
|
0x31,0x29,0x3b,0x0a,0x61,0x5b,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x35,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x31,0x30,0x5d,0x20,
|
||||||
|
0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x31,0x35,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x32,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x75,0x3d,
|
||||||
|
0x74,0x5b,0x30,0x5d,0x5e,0x52,0x4f,0x4c,0x32,0x28,0x74,0x5b,0x32,0x5d,0x2c,0x31,0x29,0x3b,0x0a,0x61,0x5b,0x31,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,
|
||||||
|
0x36,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x31,0x31,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x31,0x36,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,
|
||||||
|
0x0a,0x61,0x5b,0x32,0x31,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x75,0x3d,0x74,0x5b,0x31,0x5d,0x5e,0x52,0x4f,0x4c,0x32,0x28,0x74,0x5b,0x33,0x5d,0x2c,0x31,0x29,
|
||||||
|
0x3b,0x0a,0x61,0x5b,0x32,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x37,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x31,0x32,0x5d,0x20,0x5e,0x3d,
|
||||||
|
0x20,0x75,0x3b,0x0a,0x61,0x5b,0x31,0x37,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x32,0x32,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x75,0x3d,0x74,0x5b,
|
||||||
|
0x32,0x5d,0x5e,0x52,0x4f,0x4c,0x32,0x28,0x74,0x5b,0x34,0x5d,0x2c,0x31,0x29,0x3b,0x0a,0x61,0x5b,0x33,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x38,0x5d,
|
||||||
|
0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x31,0x33,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x31,0x38,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,
|
||||||
|
0x5b,0x32,0x33,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x75,0x3d,0x74,0x5b,0x33,0x5d,0x5e,0x52,0x4f,0x4c,0x32,0x28,0x74,0x5b,0x30,0x5d,0x2c,0x31,0x29,0x3b,0x0a,
|
||||||
|
0x61,0x5b,0x34,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x39,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x31,0x34,0x5d,0x20,0x5e,0x3d,0x20,0x75,
|
||||||
|
0x3b,0x0a,0x61,0x5b,0x31,0x39,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x61,0x5b,0x32,0x34,0x5d,0x20,0x5e,0x3d,0x20,0x75,0x3b,0x0a,0x74,0x5b,0x30,0x5d,0x3d,0x61,
|
||||||
|
0x5b,0x30,0x5d,0x3b,0x0a,0x74,0x5b,0x31,0x30,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x31,0x5d,0x2c,0x31,0x29,0x3b,0x0a,0x74,0x5b,0x32,0x30,0x5d,0x3d,0x52,
|
||||||
|
0x4f,0x4c,0x32,0x28,0x61,0x5b,0x32,0x5d,0x2c,0x36,0x32,0x29,0x3b,0x0a,0x74,0x5b,0x35,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x33,0x5d,0x2c,0x32,0x38,0x29,
|
||||||
|
0x3b,0x0a,0x74,0x5b,0x31,0x35,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x34,0x5d,0x2c,0x32,0x37,0x29,0x3b,0x0a,0x74,0x5b,0x31,0x36,0x5d,0x3d,0x52,0x4f,0x4c,
|
||||||
|
0x32,0x28,0x61,0x5b,0x35,0x5d,0x2c,0x33,0x36,0x29,0x3b,0x0a,0x74,0x5b,0x31,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x36,0x5d,0x2c,0x34,0x34,0x29,0x3b,0x0a,
|
||||||
|
0x74,0x5b,0x31,0x31,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x37,0x5d,0x2c,0x36,0x29,0x3b,0x0a,0x74,0x5b,0x32,0x31,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,
|
||||||
|
0x5b,0x38,0x5d,0x2c,0x35,0x35,0x29,0x3b,0x0a,0x74,0x5b,0x36,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x39,0x5d,0x2c,0x32,0x30,0x29,0x3b,0x0a,0x74,0x5b,0x37,
|
||||||
|
0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x31,0x30,0x5d,0x2c,0x33,0x29,0x3b,0x0a,0x74,0x5b,0x31,0x37,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x31,0x31,
|
||||||
|
0x5d,0x2c,0x31,0x30,0x29,0x3b,0x0a,0x74,0x5b,0x32,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x31,0x32,0x5d,0x2c,0x34,0x33,0x29,0x3b,0x0a,0x74,0x5b,0x31,0x32,
|
||||||
|
0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x31,0x33,0x5d,0x2c,0x32,0x35,0x29,0x3b,0x0a,0x74,0x5b,0x32,0x32,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x31,
|
||||||
|
0x34,0x5d,0x2c,0x33,0x39,0x29,0x3b,0x0a,0x74,0x5b,0x32,0x33,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x31,0x35,0x5d,0x2c,0x34,0x31,0x29,0x3b,0x0a,0x74,0x5b,
|
||||||
|
0x38,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x31,0x36,0x5d,0x2c,0x34,0x35,0x29,0x3b,0x0a,0x74,0x5b,0x31,0x38,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,
|
||||||
|
0x31,0x37,0x5d,0x2c,0x31,0x35,0x29,0x3b,0x0a,0x74,0x5b,0x33,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x31,0x38,0x5d,0x2c,0x32,0x31,0x29,0x3b,0x0a,0x74,0x5b,
|
||||||
|
0x31,0x33,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x31,0x39,0x5d,0x2c,0x38,0x29,0x3b,0x0a,0x74,0x5b,0x31,0x34,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,
|
||||||
|
0x32,0x30,0x5d,0x2c,0x31,0x38,0x29,0x3b,0x0a,0x74,0x5b,0x32,0x34,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x32,0x31,0x5d,0x2c,0x32,0x29,0x3b,0x0a,0x74,0x5b,
|
||||||
|
0x39,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x32,0x32,0x5d,0x2c,0x36,0x31,0x29,0x3b,0x0a,0x74,0x5b,0x31,0x39,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,
|
||||||
|
0x32,0x33,0x5d,0x2c,0x35,0x36,0x29,0x3b,0x0a,0x74,0x5b,0x34,0x5d,0x3d,0x52,0x4f,0x4c,0x32,0x28,0x61,0x5b,0x32,0x34,0x5d,0x2c,0x31,0x34,0x29,0x3b,0x0a,0x63,0x68,
|
||||||
|
0x69,0x28,0x61,0x2c,0x30,0x2c,0x74,0x29,0x3b,0x0a,0x61,0x5b,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x4b,0x65,0x63,0x63,0x61,0x6b,0x5f,0x66,0x31,0x36,0x30,0x30,0x5f,0x52,
|
||||||
|
0x43,0x5b,0x72,0x5d,0x3b,0x0a,0x63,0x68,0x69,0x28,0x61,0x2c,0x35,0x2c,0x74,0x29,0x3b,0x0a,0x63,0x68,0x69,0x28,0x61,0x2c,0x31,0x30,0x2c,0x74,0x29,0x3b,0x0a,0x63,
|
||||||
|
0x68,0x69,0x28,0x61,0x2c,0x31,0x35,0x2c,0x74,0x29,0x3b,0x0a,0x63,0x68,0x69,0x28,0x61,0x2c,0x32,0x30,0x2c,0x74,0x29,0x3b,0x0a,0x7d,0x0a,0x73,0x74,0x61,0x74,0x69,
|
||||||
|
0x63,0x20,0x76,0x6f,0x69,0x64,0x20,0x6b,0x65,0x63,0x63,0x61,0x6b,0x5f,0x66,0x31,0x36,0x30,0x30,0x5f,0x6e,0x6f,0x5f,0x61,0x62,0x73,0x6f,0x72,0x62,0x28,0x75,0x69,
|
||||||
|
0x6e,0x74,0x32,0x2a,0x20,0x61,0x2c,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x73,0x69,0x7a,0x65,0x2c,0x75,0x69,0x6e,0x74,0x20,0x69,0x73,0x6f,0x6c,0x61,0x74,
|
||||||
|
0x65,0x29,0x0a,0x7b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,0x6e,0x74,0x20,0x72,0x3d,0x30,0x3b,0x20,0x72,0x3c,0x32,0x34,0x3b,0x29,0x0a,0x7b,0x0a,0x69,0x66,0x28,
|
||||||
|
0x69,0x73,0x6f,0x6c,0x61,0x74,0x65,0x29,0x0a,0x7b,0x0a,0x6b,0x65,0x63,0x63,0x61,0x6b,0x5f,0x66,0x31,0x36,0x30,0x30,0x5f,0x72,0x6f,0x75,0x6e,0x64,0x28,0x61,0x2c,
|
||||||
|
0x72,0x2b,0x2b,0x29,0x3b,0x0a,0x7d,0x0a,0x7d,0x0a,0x7d,0x0a,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x63,0x6f,0x70,0x79,0x28,0x64,0x73,0x74,0x2c,0x20,0x73,0x72,
|
||||||
|
0x63,0x2c,0x20,0x63,0x6f,0x75,0x6e,0x74,0x29,0x20,0x5c,0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x21,0x3d,0x63,0x6f,
|
||||||
|
0x75,0x6e,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x20,0x5c,0x0a,0x7b,0x20,0x5c,0x0a,0x28,0x64,0x73,0x74,0x29,0x5b,0x69,0x5d,0x3d,0x28,0x73,0x72,0x63,0x29,0x5b,0x69,
|
||||||
|
0x5d,0x3b,0x20,0x5c,0x0a,0x7d,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x6e,0x76,0x28,0x75,0x69,0x6e,0x74,0x20,0x78,0x2c,0x75,0x69,
|
||||||
|
0x6e,0x74,0x20,0x79,0x29,0x0a,0x7b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x78,0x2a,0x46,0x4e,0x56,0x5f,0x50,0x52,0x49,0x4d,0x45,0x5e,0x79,0x3b,0x0a,0x7d,0x0a,
|
||||||
|
0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x75,0x69,0x6e,0x74,0x34,0x20,0x66,0x6e,0x76,0x34,0x28,0x75,0x69,0x6e,0x74,0x34,0x20,0x78,0x2c,0x75,0x69,0x6e,0x74,0x34,0x20,
|
||||||
|
0x79,0x29,0x0a,0x7b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x78,0x2a,0x46,0x4e,0x56,0x5f,0x50,0x52,0x49,0x4d,0x45,0x5e,0x79,0x3b,0x0a,0x7d,0x0a,0x74,0x79,0x70,
|
||||||
|
0x65,0x64,0x65,0x66,0x20,0x75,0x6e,0x69,0x6f,0x6e,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x77,0x6f,0x72,0x64,0x73,0x5b,0x36,0x34,0x2f,0x73,0x69,0x7a,0x65,0x6f,
|
||||||
|
0x66,0x28,0x75,0x69,0x6e,0x74,0x29,0x5d,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x32,0x20,0x75,0x69,0x6e,0x74,0x32,0x73,0x5b,0x36,0x34,0x2f,0x73,0x69,0x7a,0x65,0x6f,0x66,
|
||||||
|
0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x5d,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x34,0x20,0x75,0x69,0x6e,0x74,0x34,0x73,0x5b,0x36,0x34,0x2f,0x73,0x69,0x7a,0x65,0x6f,0x66,
|
||||||
|
0x28,0x75,0x69,0x6e,0x74,0x34,0x29,0x5d,0x3b,0x0a,0x7d,0x20,0x68,0x61,0x73,0x68,0x36,0x34,0x5f,0x74,0x3b,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x75,0x6e,
|
||||||
|
0x69,0x6f,0x6e,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x77,0x6f,0x72,0x64,0x73,0x5b,0x32,0x30,0x30,0x2f,0x73,0x69,0x7a,0x65,0x6f,0x66,0x28,0x75,0x69,0x6e,0x74,
|
||||||
|
0x29,0x5d,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x32,0x20,0x75,0x69,0x6e,0x74,0x32,0x73,0x5b,0x32,0x30,0x30,0x2f,0x73,0x69,0x7a,0x65,0x6f,0x66,0x28,0x75,0x69,0x6e,0x74,
|
||||||
|
0x32,0x29,0x5d,0x3b,0x0a,0x75,0x69,0x6e,0x74,0x34,0x20,0x75,0x69,0x6e,0x74,0x34,0x73,0x5b,0x32,0x30,0x30,0x2f,0x73,0x69,0x7a,0x65,0x6f,0x66,0x28,0x75,0x69,0x6e,
|
||||||
|
0x74,0x34,0x29,0x5d,0x3b,0x0a,0x7d,0x20,0x68,0x61,0x73,0x68,0x32,0x30,0x30,0x5f,0x74,0x3b,0x0a,0x74,0x79,0x70,0x65,0x64,0x65,0x66,0x20,0x73,0x74,0x72,0x75,0x63,
|
||||||
|
0x74,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x34,0x20,0x75,0x69,0x6e,0x74,0x34,0x73,0x5b,0x31,0x32,0x38,0x2f,0x73,0x69,0x7a,0x65,0x6f,0x66,0x28,0x75,0x69,0x6e,0x74,
|
||||||
|
0x34,0x29,0x5d,0x3b,0x0a,0x7d,0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x38,0x5f,0x74,0x3b,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x76,0x6f,0x69,0x64,0x20,0x53,0x48,
|
||||||
|
0x41,0x33,0x5f,0x35,0x31,0x32,0x28,0x75,0x69,0x6e,0x74,0x32,0x2a,0x20,0x73,0x2c,0x75,0x69,0x6e,0x74,0x20,0x69,0x73,0x6f,0x6c,0x61,0x74,0x65,0x29,0x0a,0x7b,0x0a,
|
||||||
|
0x66,0x6f,0x72,0x20,0x28,0x75,0x69,0x6e,0x74,0x20,0x69,0x3d,0x38,0x3b,0x20,0x69,0x21,0x3d,0x32,0x35,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x0a,0x7b,0x0a,0x73,0x5b,0x69,
|
||||||
|
0x5d,0x3d,0x28,0x75,0x69,0x6e,0x74,0x32,0x29,0x7b,0x30,0x2c,0x30,0x7d,0x3b,0x0a,0x7d,0x0a,0x73,0x5b,0x38,0x5d,0x2e,0x78,0x3d,0x30,0x78,0x30,0x30,0x30,0x30,0x30,
|
||||||
|
0x30,0x30,0x31,0x3b,0x0a,0x73,0x5b,0x38,0x5d,0x2e,0x79,0x3d,0x30,0x78,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3b,0x0a,0x6b,0x65,0x63,0x63,0x61,0x6b,0x5f,0x66,
|
||||||
|
0x31,0x36,0x30,0x30,0x5f,0x6e,0x6f,0x5f,0x61,0x62,0x73,0x6f,0x72,0x62,0x28,0x73,0x2c,0x38,0x2c,0x69,0x73,0x6f,0x6c,0x61,0x74,0x65,0x29,0x3b,0x0a,0x7d,0x0a,0x73,
|
||||||
|
0x74,0x61,0x74,0x69,0x63,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x61,0x73,0x74,0x5f,0x6d,0x6f,0x64,0x28,0x75,0x69,0x6e,0x74,0x20,0x61,0x2c,0x75,0x69,0x6e,0x74,0x34,
|
||||||
|
0x20,0x64,0x29,0x0a,0x7b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x6c,0x6f,0x6e,0x67,0x20,0x74,0x3d,0x61,0x3b,0x0a,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,
|
||||||
|
0x74,0x20,0x71,0x3d,0x28,0x28,0x74,0x2b,0x64,0x2e,0x79,0x29,0x2a,0x64,0x2e,0x78,0x29,0x3e,0x3e,0x64,0x2e,0x7a,0x3b,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x61,
|
||||||
|
0x2d,0x71,0x2a,0x64,0x2e,0x77,0x3b,0x0a,0x7d,0x0a,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x65,0x74,0x68,0x61,0x73,0x68,0x5f,0x63,
|
||||||
|
0x61,0x6c,0x63,0x75,0x6c,0x61,0x74,0x65,0x5f,0x64,0x61,0x67,0x5f,0x69,0x74,0x65,0x6d,0x28,0x75,0x69,0x6e,0x74,0x20,0x73,0x74,0x61,0x72,0x74,0x2c,0x5f,0x5f,0x67,
|
||||||
|
0x6c,0x6f,0x62,0x61,0x6c,0x20,0x68,0x61,0x73,0x68,0x36,0x34,0x5f,0x74,0x20,0x63,0x6f,0x6e,0x73,0x74,0x2a,0x20,0x67,0x5f,0x6c,0x69,0x67,0x68,0x74,0x2c,0x5f,0x5f,
|
||||||
|
0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x68,0x61,0x73,0x68,0x36,0x34,0x5f,0x74,0x2a,0x20,0x67,0x5f,0x64,0x61,0x67,0x2c,0x75,0x69,0x6e,0x74,0x20,0x69,0x73,0x6f,0x6c,
|
||||||
|
0x61,0x74,0x65,0x2c,0x75,0x69,0x6e,0x74,0x20,0x64,0x61,0x67,0x5f,0x77,0x6f,0x72,0x64,0x73,0x2c,0x75,0x69,0x6e,0x74,0x34,0x20,0x6c,0x69,0x67,0x68,0x74,0x5f,0x77,
|
||||||
|
0x6f,0x72,0x64,0x73,0x29,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x6e,0x6f,0x64,0x65,0x5f,0x69,0x6e,0x64,0x65,0x78,0x3d,0x73,0x74,
|
||||||
|
0x61,0x72,0x74,0x2b,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x0a,0x69,0x66,0x28,0x6e,0x6f,0x64,0x65,0x5f,0x69,0x6e,
|
||||||
|
0x64,0x65,0x78,0x3e,0x3d,0x64,0x61,0x67,0x5f,0x77,0x6f,0x72,0x64,0x73,0x29,0x0a,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x0a,0x68,0x61,0x73,0x68,0x32,0x30,0x30,0x5f,
|
||||||
|
0x74,0x20,0x64,0x61,0x67,0x5f,0x6e,0x6f,0x64,0x65,0x3b,0x0a,0x63,0x6f,0x70,0x79,0x28,0x64,0x61,0x67,0x5f,0x6e,0x6f,0x64,0x65,0x2e,0x75,0x69,0x6e,0x74,0x34,0x73,
|
||||||
|
0x2c,0x67,0x5f,0x6c,0x69,0x67,0x68,0x74,0x5b,0x66,0x61,0x73,0x74,0x5f,0x6d,0x6f,0x64,0x28,0x6e,0x6f,0x64,0x65,0x5f,0x69,0x6e,0x64,0x65,0x78,0x2c,0x6c,0x69,0x67,
|
||||||
|
0x68,0x74,0x5f,0x77,0x6f,0x72,0x64,0x73,0x29,0x5d,0x2e,0x75,0x69,0x6e,0x74,0x34,0x73,0x2c,0x34,0x29,0x3b,0x0a,0x64,0x61,0x67,0x5f,0x6e,0x6f,0x64,0x65,0x2e,0x77,
|
||||||
|
0x6f,0x72,0x64,0x73,0x5b,0x30,0x5d,0x20,0x5e,0x3d,0x20,0x6e,0x6f,0x64,0x65,0x5f,0x69,0x6e,0x64,0x65,0x78,0x3b,0x0a,0x53,0x48,0x41,0x33,0x5f,0x35,0x31,0x32,0x28,
|
||||||
|
0x64,0x61,0x67,0x5f,0x6e,0x6f,0x64,0x65,0x2e,0x75,0x69,0x6e,0x74,0x32,0x73,0x2c,0x69,0x73,0x6f,0x6c,0x61,0x74,0x65,0x29,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,
|
||||||
|
0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x21,0x3d,0x45,0x54,0x48,0x41,0x53,0x48,0x5f,0x44,0x41,0x54,0x41,0x53,0x45,0x54,0x5f,0x50,0x41,0x52,0x45,0x4e,
|
||||||
|
0x54,0x53,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x0a,0x7b,0x0a,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x72,0x65,0x6e,0x74,0x5f,0x69,0x6e,0x64,0x65,0x78,0x3d,0x66,0x61,0x73,
|
||||||
|
0x74,0x5f,0x6d,0x6f,0x64,0x28,0x66,0x6e,0x76,0x28,0x6e,0x6f,0x64,0x65,0x5f,0x69,0x6e,0x64,0x65,0x78,0x5e,0x69,0x2c,0x64,0x61,0x67,0x5f,0x6e,0x6f,0x64,0x65,0x2e,
|
||||||
|
0x77,0x6f,0x72,0x64,0x73,0x5b,0x69,0x20,0x25,0x20,0x4e,0x4f,0x44,0x45,0x5f,0x57,0x4f,0x52,0x44,0x53,0x5d,0x29,0x2c,0x6c,0x69,0x67,0x68,0x74,0x5f,0x77,0x6f,0x72,
|
||||||
|
0x64,0x73,0x29,0x3b,0x0a,0x66,0x6f,0x72,0x20,0x28,0x75,0x69,0x6e,0x74,0x20,0x77,0x3d,0x30,0x3b,0x20,0x77,0x21,0x3d,0x34,0x3b,0x20,0x2b,0x2b,0x77,0x29,0x0a,0x64,
|
||||||
|
0x61,0x67,0x5f,0x6e,0x6f,0x64,0x65,0x2e,0x75,0x69,0x6e,0x74,0x34,0x73,0x5b,0x77,0x5d,0x3d,0x66,0x6e,0x76,0x34,0x28,0x64,0x61,0x67,0x5f,0x6e,0x6f,0x64,0x65,0x2e,
|
||||||
|
0x75,0x69,0x6e,0x74,0x34,0x73,0x5b,0x77,0x5d,0x2c,0x67,0x5f,0x6c,0x69,0x67,0x68,0x74,0x5b,0x70,0x61,0x72,0x65,0x6e,0x74,0x5f,0x69,0x6e,0x64,0x65,0x78,0x5d,0x2e,
|
||||||
|
0x75,0x69,0x6e,0x74,0x34,0x73,0x5b,0x77,0x5d,0x29,0x3b,0x0a,0x7d,0x0a,0x53,0x48,0x41,0x33,0x5f,0x35,0x31,0x32,0x28,0x64,0x61,0x67,0x5f,0x6e,0x6f,0x64,0x65,0x2e,
|
||||||
|
0x75,0x69,0x6e,0x74,0x32,0x73,0x2c,0x69,0x73,0x6f,0x6c,0x61,0x74,0x65,0x29,0x3b,0x0a,0x63,0x6f,0x70,0x79,0x28,0x67,0x5f,0x64,0x61,0x67,0x5b,0x6e,0x6f,0x64,0x65,
|
||||||
|
0x5f,0x69,0x6e,0x64,0x65,0x78,0x5d,0x2e,0x75,0x69,0x6e,0x74,0x34,0x73,0x2c,0x64,0x61,0x67,0x5f,0x6e,0x6f,0x64,0x65,0x2e,0x75,0x69,0x6e,0x74,0x34,0x73,0x2c,0x34,
|
||||||
|
0x29,0x3b,0x0a,0x7d,0x0a,0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace xmrig
|
File diff suppressed because it is too large
Load diff
|
@ -1,87 +0,0 @@
|
||||||
/* XMRig
|
|
||||||
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
|
||||||
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
|
||||||
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
|
||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
|
||||||
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
|
||||||
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
|
||||||
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/OclThreads.h"
|
|
||||||
#include "backend/opencl/wrappers/OclDevice.h"
|
|
||||||
#include "base/crypto/Algorithm.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
|
||||||
|
|
||||||
|
|
||||||
constexpr const size_t oneMiB = 1024u * 1024u;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool ocl_generic_cn_gpu_generator(const OclDevice &device, const Algorithm &algorithm, OclThreads &threads)
|
|
||||||
{
|
|
||||||
if (algorithm != Algorithm::CN_GPU) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t worksize = 8;
|
|
||||||
uint32_t numThreads = 1u;
|
|
||||||
size_t minFreeMem = 128u * oneMiB;
|
|
||||||
|
|
||||||
if (device.type() == OclDevice::Vega_10 || device.type() == OclDevice::Vega_20) {
|
|
||||||
minFreeMem = oneMiB;
|
|
||||||
worksize = 16;
|
|
||||||
}
|
|
||||||
else if (device.type() == OclDevice::Navi_10) {
|
|
||||||
numThreads = 2u;
|
|
||||||
}
|
|
||||||
else if (device.name() == "Fiji") {
|
|
||||||
worksize = 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t maxThreads = device.computeUnits() * 6 * 8;
|
|
||||||
|
|
||||||
const size_t maxAvailableFreeMem = device.freeMemSize() - minFreeMem;
|
|
||||||
const size_t memPerThread = std::min(device.maxMemAllocSize(), maxAvailableFreeMem);
|
|
||||||
|
|
||||||
size_t memPerHash = algorithm.l3() + 240u;
|
|
||||||
size_t maxIntensity = memPerThread / memPerHash;
|
|
||||||
size_t possibleIntensity = std::min(maxThreads, maxIntensity);
|
|
||||||
size_t intensity = 0;
|
|
||||||
size_t cuUtilization = ((possibleIntensity * 100) / (worksize * device.computeUnits())) % 100;
|
|
||||||
|
|
||||||
if (cuUtilization >= 75) {
|
|
||||||
intensity = (possibleIntensity / worksize) * worksize;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
intensity = (possibleIntensity / (worksize * device.computeUnits())) * device.computeUnits() * worksize;
|
|
||||||
}
|
|
||||||
|
|
||||||
threads.add(OclThread(device.index(), intensity, worksize, numThreads, 1));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace xmrig
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
|
||||||
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "backend/opencl/OclThreads.h"
|
||||||
|
#include "backend/opencl/wrappers/OclDevice.h"
|
||||||
|
#include "base/crypto/Algorithm.h"
|
||||||
|
#include "crypto/randomx/randomx.h"
|
||||||
|
#include "crypto/rx/RxAlgo.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
bool ocl_generic_kawpow_generator(const OclDevice &device, const Algorithm &algorithm, OclThreads &threads)
|
||||||
|
{
|
||||||
|
if (algorithm.family() != Algorithm::KAWPOW) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isNavi = false;
|
||||||
|
|
||||||
|
switch (device.type()) {
|
||||||
|
case OclDevice::Navi_10:
|
||||||
|
case OclDevice::Navi_12:
|
||||||
|
case OclDevice::Navi_14:
|
||||||
|
isNavi = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint32_t cu_intensity = isNavi ? 524288 : 262144;
|
||||||
|
const uint32_t worksize = isNavi ? 128 : 256;
|
||||||
|
threads.add(OclThread(device.index(), device.computeUnits() * cu_intensity, worksize, 1));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xmrig
|
|
@ -66,6 +66,7 @@ public:
|
||||||
virtual void init() = 0;
|
virtual void init() = 0;
|
||||||
virtual void run(uint32_t nonce, uint32_t *hashOutput) = 0;
|
virtual void run(uint32_t nonce, uint32_t *hashOutput) = 0;
|
||||||
virtual void set(const Job &job, uint8_t *blob) = 0;
|
virtual void set(const Job &job, uint8_t *blob) = 0;
|
||||||
|
virtual void jobEarlyNotification(const Job&) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual size_t bufferSize() const = 0;
|
virtual size_t bufferSize() const = 0;
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
/* XMRig
|
|
||||||
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
|
||||||
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
|
||||||
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
|
||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/kernels/Cn00RyoKernel.h"
|
|
||||||
#include "backend/opencl/wrappers/OclLib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void xmrig::Cn00RyoKernel::enqueue(cl_command_queue queue, size_t threads)
|
|
||||||
{
|
|
||||||
const size_t gthreads = threads * 64;
|
|
||||||
const size_t lthreads = 64;
|
|
||||||
|
|
||||||
enqueueNDRange(queue, 1, nullptr, >hreads, <hreads);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// __kernel void cn00(__global int *Scratchpad, __global ulong *states)
|
|
||||||
void xmrig::Cn00RyoKernel::setArgs(cl_mem scratchpads, cl_mem states)
|
|
||||||
{
|
|
||||||
setArg(0, sizeof(cl_mem), &scratchpads);
|
|
||||||
setArg(1, sizeof(cl_mem), &states);
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
/* XMRig
|
|
||||||
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
|
||||||
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
|
||||||
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
|
||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/kernels/Cn2RyoKernel.h"
|
|
||||||
#include "backend/opencl/wrappers/OclLib.h"
|
|
||||||
|
|
||||||
|
|
||||||
void xmrig::Cn2RyoKernel::enqueue(cl_command_queue queue, uint32_t nonce, size_t threads)
|
|
||||||
{
|
|
||||||
const size_t offset[2] = { nonce, 1 };
|
|
||||||
const size_t gthreads[2] = { threads, 8 };
|
|
||||||
static const size_t lthreads[2] = { 8, 8 };
|
|
||||||
|
|
||||||
enqueueNDRange(queue, 2, offset, gthreads, lthreads);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// __kernel void cn2(__global uint4 *Scratchpad, __global ulong *states, __global uint *output, ulong Target, uint Threads)
|
|
||||||
void xmrig::Cn2RyoKernel::setArgs(cl_mem scratchpads, cl_mem states, cl_mem output, uint32_t threads)
|
|
||||||
{
|
|
||||||
setArg(0, sizeof(cl_mem), &scratchpads);
|
|
||||||
setArg(1, sizeof(cl_mem), &states);
|
|
||||||
setArg(2, sizeof(cl_mem), &output);
|
|
||||||
setArg(4, sizeof(uint32_t), &threads);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void xmrig::Cn2RyoKernel::setTarget(uint64_t target)
|
|
||||||
{
|
|
||||||
setArg(3, sizeof(cl_ulong), &target);
|
|
||||||
}
|
|
|
@ -5,8 +5,8 @@
|
||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -23,26 +23,31 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <string>
|
#include "KawPow_CalculateDAGKernel.h"
|
||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/kernels/Cn1RyoKernel.h"
|
|
||||||
#include "backend/opencl/wrappers/OclLib.h"
|
#include "backend/opencl/wrappers/OclLib.h"
|
||||||
|
#include "crypto/kawpow/KPCache.h"
|
||||||
|
|
||||||
|
|
||||||
void xmrig::Cn1RyoKernel::enqueue(cl_command_queue queue, size_t threads, size_t worksize)
|
void xmrig::KawPow_CalculateDAGKernel::enqueue(cl_command_queue queue, size_t threads, size_t workgroup_size)
|
||||||
{
|
{
|
||||||
const size_t gthreads = threads * 16;
|
enqueueNDRange(queue, 1, nullptr, &threads, &workgroup_size);
|
||||||
const size_t lthreads = worksize * 16;
|
|
||||||
|
|
||||||
enqueueNDRange(queue, 1, nullptr, >hreads, <hreads);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// __kernel void cn1(__global int *lpad_in, __global int *spad, uint numThreads)
|
void xmrig::KawPow_CalculateDAGKernel::setArgs(uint32_t start, cl_mem g_light, cl_mem g_dag, uint32_t dag_words, uint32_t light_words)
|
||||||
void xmrig::Cn1RyoKernel::setArgs(cl_mem scratchpads, cl_mem states, uint32_t threads)
|
|
||||||
{
|
{
|
||||||
setArg(0, sizeof(cl_mem), &scratchpads);
|
setArg(0, sizeof(start), &start);
|
||||||
setArg(1, sizeof(cl_mem), &states);
|
setArg(1, sizeof(g_light), &g_light);
|
||||||
setArg(2, sizeof(uint32_t), &threads);
|
setArg(2, sizeof(g_dag), &g_dag);
|
||||||
|
|
||||||
|
const uint32_t isolate = 1;
|
||||||
|
setArg(3, sizeof(isolate), &isolate);
|
||||||
|
|
||||||
|
setArg(4, sizeof(dag_words), &dag_words);
|
||||||
|
|
||||||
|
uint32_t light_words4[4];
|
||||||
|
KPCache::calculate_fast_mod_data(light_words, light_words4[0], light_words4[1], light_words4[2]);
|
||||||
|
light_words4[3] = light_words;
|
||||||
|
|
||||||
|
setArg(5, sizeof(light_words4), light_words4);
|
||||||
}
|
}
|
|
@ -5,8 +5,8 @@
|
||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -22,8 +22,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XMRIG_CN1RYOKERNEL_H
|
#ifndef XMRIG_KAWPOW_CALCULATEDAGKERNEL_H
|
||||||
#define XMRIG_CN1RYOKERNEL_H
|
#define XMRIG_KAWPOW_CALCULATEDAGKERNEL_H
|
||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/wrappers/OclKernel.h"
|
#include "backend/opencl/wrappers/OclKernel.h"
|
||||||
|
@ -32,17 +32,17 @@
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
class Cn1RyoKernel : public OclKernel
|
class KawPow_CalculateDAGKernel : public OclKernel
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline Cn1RyoKernel(cl_program program) : OclKernel(program, "cn1") {}
|
inline KawPow_CalculateDAGKernel(cl_program program) : OclKernel(program, "ethash_calculate_dag_item") {}
|
||||||
|
|
||||||
void enqueue(cl_command_queue queue, size_t threads, size_t worksize);
|
void enqueue(cl_command_queue queue, size_t threads, size_t workgroup_size);
|
||||||
void setArgs(cl_mem scratchpads, cl_mem states, uint32_t threads);
|
void setArgs(uint32_t start, cl_mem g_light, cl_mem g_dag, uint32_t dag_words, uint32_t light_words);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
} // namespace xmrig
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
#endif /* XMRIG_CN1RYOKERNEL_H */
|
#endif /* XMRIG_KAWPOW_CALCULATEDAGKERNEL_H */
|
|
@ -125,20 +125,18 @@ if (WITH_OPENCL)
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WITH_CN_GPU AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
if (WITH_KAWPOW)
|
||||||
list(APPEND HEADERS_BACKEND_OPENCL
|
list(APPEND HEADERS_BACKEND_OPENCL
|
||||||
src/backend/opencl/kernels/Cn00RyoKernel.h
|
src/backend/opencl/kernels/kawpow/KawPow_CalculateDAGKernel.h
|
||||||
src/backend/opencl/kernels/Cn1RyoKernel.h
|
src/backend/opencl/runners/OclKawPowRunner.h
|
||||||
src/backend/opencl/kernels/Cn2RyoKernel.h
|
src/backend/opencl/runners/tools/OclKawPow.h
|
||||||
src/backend/opencl/runners/OclRyoRunner.h
|
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND SOURCES_BACKEND_OPENCL
|
list(APPEND SOURCES_BACKEND_OPENCL
|
||||||
src/backend/opencl/generators/ocl_generic_cn_gpu_generator.cpp
|
src/backend/opencl/generators/ocl_generic_kawpow_generator.cpp
|
||||||
src/backend/opencl/kernels/Cn00RyoKernel.cpp
|
src/backend/opencl/kernels/kawpow/KawPow_CalculateDAGKernel.cpp
|
||||||
src/backend/opencl/kernels/Cn1RyoKernel.cpp
|
src/backend/opencl/runners/OclKawPowRunner.cpp
|
||||||
src/backend/opencl/kernels/Cn2RyoKernel.cpp
|
src/backend/opencl/runners/tools/OclKawPow.cpp
|
||||||
src/backend/opencl/runners/OclRyoRunner.cpp
|
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
@ -49,16 +49,17 @@ public:
|
||||||
~OclBaseRunner() override;
|
~OclBaseRunner() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
inline cl_context ctx() const override { return m_ctx; }
|
inline cl_context ctx() const override { return m_ctx; }
|
||||||
inline const Algorithm &algorithm() const override { return m_algorithm; }
|
inline const Algorithm &algorithm() const override { return m_algorithm; }
|
||||||
inline const char *buildOptions() const override { return m_options.c_str(); }
|
inline const char *buildOptions() const override { return m_options.c_str(); }
|
||||||
inline const char *deviceKey() const override { return m_deviceKey.c_str(); }
|
inline const char *deviceKey() const override { return m_deviceKey.c_str(); }
|
||||||
inline const char *source() const override { return m_source; }
|
inline const char *source() const override { return m_source; }
|
||||||
inline const OclLaunchData &data() const override { return m_data; }
|
inline const OclLaunchData &data() const override { return m_data; }
|
||||||
inline size_t intensity() const override { return m_intensity; }
|
inline size_t intensity() const override { return m_intensity; }
|
||||||
inline size_t threadId() const override { return m_threadId; }
|
inline size_t threadId() const override { return m_threadId; }
|
||||||
inline uint32_t roundSize() const override { return m_intensity; }
|
inline uint32_t roundSize() const override { return m_intensity; }
|
||||||
inline uint32_t processedHashes() const override { return m_intensity; }
|
inline uint32_t processedHashes() const override { return m_intensity; }
|
||||||
|
inline void jobEarlyNotification(const Job&) override {}
|
||||||
|
|
||||||
size_t bufferSize() const override;
|
size_t bufferSize() const override;
|
||||||
uint32_t deviceIndex() const override;
|
uint32_t deviceIndex() const override;
|
||||||
|
|
213
src/backend/opencl/runners/OclKawPowRunner.cpp
Normal file
213
src/backend/opencl/runners/OclKawPowRunner.cpp
Normal file
|
@ -0,0 +1,213 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "backend/opencl/runners/OclKawPowRunner.h"
|
||||||
|
#include "backend/common/Tags.h"
|
||||||
|
#include "3rdparty/libethash/ethash_internal.h"
|
||||||
|
#include "backend/opencl/kernels/kawpow/KawPow_CalculateDAGKernel.h"
|
||||||
|
#include "backend/opencl/OclLaunchData.h"
|
||||||
|
#include "backend/opencl/runners/tools/OclKawPow.h"
|
||||||
|
#include "backend/opencl/wrappers/OclError.h"
|
||||||
|
#include "backend/opencl/wrappers/OclLib.h"
|
||||||
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
|
#include "base/net/stratum/Job.h"
|
||||||
|
#include "base/tools/Chrono.h"
|
||||||
|
#include "crypto/common/VirtualMemory.h"
|
||||||
|
#include "crypto/kawpow/KPHash.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
OclKawPowRunner::OclKawPowRunner(size_t index, const OclLaunchData &data) : OclBaseRunner(index, data)
|
||||||
|
{
|
||||||
|
switch (data.thread.worksize())
|
||||||
|
{
|
||||||
|
case 64:
|
||||||
|
case 128:
|
||||||
|
case 256:
|
||||||
|
case 512:
|
||||||
|
m_workGroupSize = data.thread.worksize();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.device.vendorId() == OclVendor::OCL_VENDOR_NVIDIA) {
|
||||||
|
m_options += " -DPLATFORM=OPENCL_PLATFORM_NVIDIA";
|
||||||
|
m_dagWorkGroupSize = 32;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
OclKawPowRunner::~OclKawPowRunner()
|
||||||
|
{
|
||||||
|
OclLib::release(m_lightCache);
|
||||||
|
OclLib::release(m_dag);
|
||||||
|
|
||||||
|
delete m_calculateDagKernel;
|
||||||
|
|
||||||
|
OclLib::release(m_searchKernel);
|
||||||
|
|
||||||
|
OclLib::release(m_controlQueue);
|
||||||
|
OclLib::release(m_stop);
|
||||||
|
|
||||||
|
OclKawPow::clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OclKawPowRunner::run(uint32_t nonce, uint32_t *hashOutput)
|
||||||
|
{
|
||||||
|
const size_t local_work_size = m_workGroupSize;
|
||||||
|
const size_t global_work_offset = nonce;
|
||||||
|
const size_t global_work_size = m_intensity - (m_intensity % m_workGroupSize);
|
||||||
|
|
||||||
|
enqueueWriteBuffer(m_input, CL_FALSE, 0, 40, m_blob);
|
||||||
|
|
||||||
|
const uint32_t zero[2] = {};
|
||||||
|
enqueueWriteBuffer(m_output, CL_FALSE, 0, sizeof(uint32_t), zero);
|
||||||
|
enqueueWriteBuffer(m_stop, CL_FALSE, 0, sizeof(uint32_t) * 2, zero);
|
||||||
|
|
||||||
|
m_skippedHashes = 0;
|
||||||
|
|
||||||
|
const cl_int ret = OclLib::enqueueNDRangeKernel(m_queue, m_searchKernel, 1, &global_work_offset, &global_work_size, &local_work_size, 0, nullptr, nullptr);
|
||||||
|
if (ret != CL_SUCCESS) {
|
||||||
|
LOG_ERR("%s" RED(" error ") RED_BOLD("%s") RED(" when calling ") RED_BOLD("clEnqueueNDRangeKernel") RED(" for kernel ") RED_BOLD("progpow_search"),
|
||||||
|
ocl_tag(), OclError::toString(ret));
|
||||||
|
|
||||||
|
throw std::runtime_error(OclError::toString(ret));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t stop[2] = {};
|
||||||
|
enqueueReadBuffer(m_stop, CL_FALSE, 0, sizeof(stop), stop);
|
||||||
|
|
||||||
|
uint32_t output[16] = {};
|
||||||
|
enqueueReadBuffer(m_output, CL_TRUE, 0, sizeof(output), output);
|
||||||
|
|
||||||
|
m_skippedHashes = stop[1] * m_workGroupSize;
|
||||||
|
|
||||||
|
if (output[0] > 15) {
|
||||||
|
output[0] = 15;
|
||||||
|
}
|
||||||
|
|
||||||
|
hashOutput[0xFF] = output[0];
|
||||||
|
memcpy(hashOutput, output + 1, output[0] * sizeof(uint32_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OclKawPowRunner::set(const Job &job, uint8_t *blob)
|
||||||
|
{
|
||||||
|
m_blockHeight = static_cast<uint32_t>(job.height());
|
||||||
|
m_searchProgram = OclKawPow::get(*this, m_blockHeight, m_workGroupSize);
|
||||||
|
m_searchKernel = OclLib::createKernel(m_searchProgram, "progpow_search");
|
||||||
|
|
||||||
|
const uint32_t epoch = m_blockHeight / KPHash::EPOCH_LENGTH;
|
||||||
|
|
||||||
|
const uint64_t dag_size = KPCache::dag_size(epoch);
|
||||||
|
if (dag_size > m_dagCapacity) {
|
||||||
|
OclLib::release(m_dag);
|
||||||
|
|
||||||
|
m_dagCapacity = VirtualMemory::align(dag_size, 16 * 1024 * 1024);
|
||||||
|
m_dag = OclLib::createBuffer(m_ctx, CL_MEM_READ_WRITE, m_dagCapacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (epoch != m_epoch) {
|
||||||
|
m_epoch = epoch;
|
||||||
|
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(KPCache::s_cacheMutex);
|
||||||
|
|
||||||
|
KPCache::s_cache.init(epoch);
|
||||||
|
|
||||||
|
if (KPCache::s_cache.size() > m_lightCacheCapacity) {
|
||||||
|
OclLib::release(m_lightCache);
|
||||||
|
|
||||||
|
m_lightCacheCapacity = VirtualMemory::align(KPCache::s_cache.size());
|
||||||
|
m_lightCache = OclLib::createBuffer(m_ctx, CL_MEM_READ_ONLY, m_lightCacheCapacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_lightCacheSize = KPCache::s_cache.size();
|
||||||
|
enqueueWriteBuffer(m_lightCache, CL_TRUE, 0, m_lightCacheSize, KPCache::s_cache.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint64_t start_ms = Chrono::steadyMSecs();
|
||||||
|
|
||||||
|
const uint32_t dag_words = dag_size / sizeof(node);
|
||||||
|
m_calculateDagKernel->setArgs(0, m_lightCache, m_dag, dag_words, m_lightCacheSize / sizeof(node));
|
||||||
|
|
||||||
|
constexpr uint32_t N = 1 << 20;
|
||||||
|
|
||||||
|
for (uint32_t start = 0; start < dag_words; start += N) {
|
||||||
|
m_calculateDagKernel->setArg(0, sizeof(start), &start);
|
||||||
|
m_calculateDagKernel->enqueue(m_queue, N, m_dagWorkGroupSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
OclLib::finish(m_queue);
|
||||||
|
|
||||||
|
LOG_INFO("%s " YELLOW("KawPow") " DAG for epoch " WHITE_BOLD("%u") " calculated " BLACK_BOLD("(%" PRIu64 "ms)"), Tags::opencl(), epoch, Chrono::steadyMSecs() - start_ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint64_t target = job.target();
|
||||||
|
const uint32_t hack_false = 0;
|
||||||
|
|
||||||
|
OclLib::setKernelArg(m_searchKernel, 0, sizeof(m_dag), &m_dag);
|
||||||
|
OclLib::setKernelArg(m_searchKernel, 1, sizeof(m_input), &m_input);
|
||||||
|
OclLib::setKernelArg(m_searchKernel, 2, sizeof(target), &target);
|
||||||
|
OclLib::setKernelArg(m_searchKernel, 3, sizeof(hack_false), &hack_false);
|
||||||
|
OclLib::setKernelArg(m_searchKernel, 4, sizeof(m_output), &m_output);
|
||||||
|
OclLib::setKernelArg(m_searchKernel, 5, sizeof(m_stop), &m_stop);
|
||||||
|
|
||||||
|
m_blob = blob;
|
||||||
|
enqueueWriteBuffer(m_input, CL_TRUE, 0, sizeof(m_blob), m_blob);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OclKawPowRunner::jobEarlyNotification(const Job&)
|
||||||
|
{
|
||||||
|
const uint32_t one = 1;
|
||||||
|
const cl_int ret = OclLib::enqueueWriteBuffer(m_controlQueue, m_stop, CL_TRUE, 0, sizeof(one), &one, 0, nullptr, nullptr);
|
||||||
|
if (ret != CL_SUCCESS) {
|
||||||
|
throw std::runtime_error(OclError::toString(ret));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::OclKawPowRunner::build()
|
||||||
|
{
|
||||||
|
OclBaseRunner::build();
|
||||||
|
|
||||||
|
m_calculateDagKernel = new KawPow_CalculateDAGKernel(m_program);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void xmrig::OclKawPowRunner::init()
|
||||||
|
{
|
||||||
|
OclBaseRunner::init();
|
||||||
|
|
||||||
|
m_controlQueue = OclLib::createCommandQueue(m_ctx, data().device.id());
|
||||||
|
m_stop = OclLib::createBuffer(m_ctx, CL_MEM_READ_ONLY, sizeof(uint32_t) * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace xmrig
|
86
src/backend/opencl/runners/OclKawPowRunner.h
Normal file
86
src/backend/opencl/runners/OclKawPowRunner.h
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_OCLKAWPOWRUNNER_H
|
||||||
|
#define XMRIG_OCLKAWPOWRUNNER_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "backend/opencl/runners/OclBaseRunner.h"
|
||||||
|
#include "crypto/kawpow/KPCache.h"
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
class KawPow_CalculateDAGKernel;
|
||||||
|
|
||||||
|
|
||||||
|
class OclKawPowRunner : public OclBaseRunner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
XMRIG_DISABLE_COPY_MOVE_DEFAULT(OclKawPowRunner)
|
||||||
|
|
||||||
|
OclKawPowRunner(size_t index, const OclLaunchData &data);
|
||||||
|
~OclKawPowRunner() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void run(uint32_t nonce, uint32_t *hashOutput) override;
|
||||||
|
void set(const Job &job, uint8_t *blob) override;
|
||||||
|
void build() override;
|
||||||
|
void init() override;
|
||||||
|
void jobEarlyNotification(const Job& job) override;
|
||||||
|
uint32_t processedHashes() const override { return m_intensity - m_skippedHashes; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint8_t* m_blob = nullptr;
|
||||||
|
uint32_t m_skippedHashes = 0;
|
||||||
|
|
||||||
|
uint32_t m_blockHeight = 0;
|
||||||
|
uint32_t m_epoch = 0xFFFFFFFFUL;
|
||||||
|
|
||||||
|
cl_mem m_lightCache = nullptr;
|
||||||
|
size_t m_lightCacheSize = 0;
|
||||||
|
size_t m_lightCacheCapacity = 0;
|
||||||
|
|
||||||
|
cl_mem m_dag = nullptr;
|
||||||
|
size_t m_dagCapacity = 0;
|
||||||
|
|
||||||
|
KawPow_CalculateDAGKernel* m_calculateDagKernel = nullptr;
|
||||||
|
|
||||||
|
cl_program m_searchProgram = nullptr;
|
||||||
|
cl_kernel m_searchKernel = nullptr;
|
||||||
|
|
||||||
|
size_t m_workGroupSize = 256;
|
||||||
|
size_t m_dagWorkGroupSize = 64;
|
||||||
|
|
||||||
|
cl_command_queue m_controlQueue = nullptr;
|
||||||
|
cl_mem m_stop = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
#endif // XMRIG_OCLKAWPOWRUNNER_H
|
|
@ -1,128 +0,0 @@
|
||||||
/* XMRig
|
|
||||||
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
|
||||||
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
|
||||||
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
|
||||||
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
|
||||||
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
|
||||||
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/runners/OclRyoRunner.h"
|
|
||||||
#include "backend/opencl/kernels/Cn00RyoKernel.h"
|
|
||||||
#include "backend/opencl/kernels/Cn0Kernel.h"
|
|
||||||
#include "backend/opencl/kernels/Cn1RyoKernel.h"
|
|
||||||
#include "backend/opencl/kernels/Cn2RyoKernel.h"
|
|
||||||
#include "backend/opencl/kernels/CnBranchKernel.h"
|
|
||||||
#include "backend/opencl/OclLaunchData.h"
|
|
||||||
#include "backend/opencl/wrappers/OclLib.h"
|
|
||||||
#include "base/io/log/Log.h"
|
|
||||||
#include "base/net/stratum/Job.h"
|
|
||||||
#include "crypto/cn/CnAlgo.h"
|
|
||||||
|
|
||||||
|
|
||||||
xmrig::OclRyoRunner::OclRyoRunner(size_t index, const OclLaunchData &data) : OclBaseRunner(index, data)
|
|
||||||
{
|
|
||||||
m_options += " -DITERATIONS=" + std::to_string(CnAlgo<>::iterations(m_algorithm)) + "U";
|
|
||||||
m_options += " -DMASK=" + std::to_string(CnAlgo<>::mask(m_algorithm)) + "U";
|
|
||||||
m_options += " -DWORKSIZE=" + std::to_string(data.thread.worksize()) + "U";
|
|
||||||
m_options += " -DMEMORY=" + std::to_string(m_algorithm.l3()) + "LU";
|
|
||||||
m_options += " -DCN_UNROLL=" + std::to_string(data.thread.unrollFactor());
|
|
||||||
|
|
||||||
m_options += " -cl-fp32-correctly-rounded-divide-sqrt";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
xmrig::OclRyoRunner::~OclRyoRunner()
|
|
||||||
{
|
|
||||||
delete m_cn00;
|
|
||||||
delete m_cn0;
|
|
||||||
delete m_cn1;
|
|
||||||
delete m_cn2;
|
|
||||||
|
|
||||||
OclLib::release(m_scratchpads);
|
|
||||||
OclLib::release(m_states);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
size_t xmrig::OclRyoRunner::bufferSize() const
|
|
||||||
{
|
|
||||||
return OclBaseRunner::bufferSize() + align(data().algorithm.l3() * m_intensity) + align(200 * m_intensity);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void xmrig::OclRyoRunner::run(uint32_t nonce, uint32_t *hashOutput)
|
|
||||||
{
|
|
||||||
static const cl_uint zero = 0;
|
|
||||||
|
|
||||||
const size_t w_size = data().thread.worksize();
|
|
||||||
const size_t g_thd = ((m_intensity + w_size - 1u) / w_size) * w_size;
|
|
||||||
|
|
||||||
assert(g_thd % w_size == 0);
|
|
||||||
|
|
||||||
enqueueWriteBuffer(m_output, CL_FALSE, sizeof(cl_uint) * 0xFF, sizeof(cl_uint), &zero);
|
|
||||||
|
|
||||||
m_cn0->enqueue(m_queue, nonce, g_thd);
|
|
||||||
m_cn00->enqueue(m_queue, g_thd);
|
|
||||||
m_cn1->enqueue(m_queue, g_thd, w_size);
|
|
||||||
m_cn2->enqueue(m_queue, nonce, g_thd);
|
|
||||||
|
|
||||||
finalize(hashOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void xmrig::OclRyoRunner::set(const Job &job, uint8_t *blob)
|
|
||||||
{
|
|
||||||
if (job.size() > (Job::kMaxBlobSize - 4)) {
|
|
||||||
throw std::length_error("job size too big");
|
|
||||||
}
|
|
||||||
|
|
||||||
blob[job.size()] = 0x01;
|
|
||||||
memset(blob + job.size() + 1, 0, Job::kMaxBlobSize - job.size() - 1);
|
|
||||||
|
|
||||||
enqueueWriteBuffer(m_input, CL_TRUE, 0, Job::kMaxBlobSize, blob);
|
|
||||||
|
|
||||||
m_cn2->setTarget(job.target());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void xmrig::OclRyoRunner::build()
|
|
||||||
{
|
|
||||||
OclBaseRunner::build();
|
|
||||||
|
|
||||||
m_cn00 = new Cn00RyoKernel(m_program);
|
|
||||||
m_cn00->setArgs(m_scratchpads, m_states);
|
|
||||||
|
|
||||||
m_cn0 = new Cn0Kernel(m_program);
|
|
||||||
m_cn0->setArgs(m_input, m_scratchpads, m_states, m_intensity);
|
|
||||||
|
|
||||||
m_cn1 = new Cn1RyoKernel(m_program);
|
|
||||||
m_cn1->setArgs(m_scratchpads, m_states, m_intensity);
|
|
||||||
|
|
||||||
m_cn2 = new Cn2RyoKernel(m_program);
|
|
||||||
m_cn2->setArgs(m_scratchpads, m_states, m_output, m_intensity);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void xmrig::OclRyoRunner::init()
|
|
||||||
{
|
|
||||||
OclBaseRunner::init();
|
|
||||||
|
|
||||||
m_scratchpads = createSubBuffer(CL_MEM_READ_WRITE, data().algorithm.l3() * m_intensity);
|
|
||||||
m_states = createSubBuffer(CL_MEM_READ_WRITE, 200 * m_intensity);
|
|
||||||
}
|
|
|
@ -67,9 +67,9 @@ public:
|
||||||
cl_program program;
|
cl_program program;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Algorithm m_algo;
|
Algorithm m_algo;
|
||||||
const uint32_t m_index;
|
uint32_t m_index;
|
||||||
const uint64_t m_offset;
|
uint64_t m_offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -126,10 +126,11 @@ private:
|
||||||
void gc(uint64_t offset)
|
void gc(uint64_t offset)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < m_data.size();) {
|
for (size_t i = 0; i < m_data.size();) {
|
||||||
const auto &entry = m_data[i];
|
auto &entry = m_data[i];
|
||||||
|
|
||||||
if (entry.isExpired(offset)) {
|
if (entry.isExpired(offset)) {
|
||||||
m_data.back().release();
|
entry.release();
|
||||||
|
entry = m_data.back();
|
||||||
m_data.pop_back();
|
m_data.pop_back();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
413
src/backend/opencl/runners/tools/OclKawPow.cpp
Normal file
413
src/backend/opencl/runners/tools/OclKawPow.cpp
Normal file
|
@ -0,0 +1,413 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "backend/opencl/runners/tools/OclKawPow.h"
|
||||||
|
#include "3rdparty/libethash/data_sizes.h"
|
||||||
|
#include "3rdparty/libethash/ethash_internal.h"
|
||||||
|
#include "backend/opencl/cl/kawpow/kawpow_cl.h"
|
||||||
|
#include "backend/opencl/interfaces/IOclRunner.h"
|
||||||
|
#include "backend/opencl/OclCache.h"
|
||||||
|
#include "backend/opencl/OclLaunchData.h"
|
||||||
|
#include "backend/opencl/OclThread.h"
|
||||||
|
#include "backend/opencl/wrappers/OclError.h"
|
||||||
|
#include "backend/opencl/wrappers/OclLib.h"
|
||||||
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
|
#include "base/tools/Baton.h"
|
||||||
|
#include "base/tools/Chrono.h"
|
||||||
|
#include "crypto/kawpow/KPHash.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <mutex>
|
||||||
|
#include <regex>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
#include <uv.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
class KawPowCacheEntry
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
inline KawPowCacheEntry(const Algorithm &algo, uint64_t period, uint32_t worksize, uint32_t index, cl_program program) :
|
||||||
|
program(program),
|
||||||
|
m_algo(algo),
|
||||||
|
m_index(index),
|
||||||
|
m_period(period),
|
||||||
|
m_worksize(worksize)
|
||||||
|
{}
|
||||||
|
|
||||||
|
inline bool isExpired(uint64_t period) const { return m_period + 1 < period; }
|
||||||
|
inline bool match(const Algorithm &algo, uint64_t period, uint32_t worksize, uint32_t index) const { return m_algo == algo && m_period == period && m_worksize == worksize && m_index == index; }
|
||||||
|
inline bool match(const IOclRunner &runner, uint64_t period, uint32_t worksize) const { return match(runner.algorithm(), period, worksize, runner.deviceIndex()); }
|
||||||
|
inline void release() { OclLib::release(program); }
|
||||||
|
|
||||||
|
cl_program program;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Algorithm m_algo;
|
||||||
|
uint32_t m_index;
|
||||||
|
uint64_t m_period;
|
||||||
|
uint32_t m_worksize;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class KawPowCache
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
KawPowCache() = default;
|
||||||
|
|
||||||
|
inline cl_program search(const IOclRunner &runner, uint64_t period, uint32_t worksize) { return search(runner.algorithm(), period, worksize, runner.deviceIndex()); }
|
||||||
|
|
||||||
|
|
||||||
|
inline cl_program search(const Algorithm &algo, uint64_t period, uint32_t worksize, uint32_t index)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
|
|
||||||
|
for (const auto &entry : m_data) {
|
||||||
|
if (entry.match(algo, period, worksize, index)) {
|
||||||
|
return entry.program;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void add(const Algorithm &algo, uint64_t period, uint32_t worksize, uint32_t index, cl_program program)
|
||||||
|
{
|
||||||
|
if (search(algo, period, worksize, index)) {
|
||||||
|
OclLib::release(program);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
|
|
||||||
|
gc(period);
|
||||||
|
m_data.emplace_back(algo, period, worksize, index, program);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
|
|
||||||
|
for (auto &entry : m_data) {
|
||||||
|
entry.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_data.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
void gc(uint64_t period)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < m_data.size();) {
|
||||||
|
auto& entry = m_data[i];
|
||||||
|
|
||||||
|
if (entry.isExpired(period)) {
|
||||||
|
entry.release();
|
||||||
|
entry = m_data.back();
|
||||||
|
m_data.pop_back();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::mutex m_mutex;
|
||||||
|
std::vector<KawPowCacheEntry> m_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static KawPowCache cache;
|
||||||
|
|
||||||
|
|
||||||
|
#define rnd() (kiss99(rnd_state))
|
||||||
|
#define mix_src() ("mix[" + std::to_string(rnd() % KPHash::REGS) + "]")
|
||||||
|
#define mix_dst() ("mix[" + std::to_string(mix_seq_dst[(mix_seq_dst_cnt++) % KPHash::REGS]) + "]")
|
||||||
|
#define mix_cache() ("mix[" + std::to_string(mix_seq_cache[(mix_seq_cache_cnt++) % KPHash::REGS]) + "]")
|
||||||
|
|
||||||
|
class KawPowBuilder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cl_program build(const IOclRunner &runner, uint64_t period, uint32_t worksize)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
|
|
||||||
|
const uint64_t ts = Chrono::steadyMSecs();
|
||||||
|
|
||||||
|
cl_program program = cache.search(runner, period, worksize);
|
||||||
|
if (program) {
|
||||||
|
return program;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_int ret;
|
||||||
|
const std::string source = getSource(period);
|
||||||
|
cl_device_id device = runner.data().device.id();
|
||||||
|
const char *s = source.c_str();
|
||||||
|
|
||||||
|
program = OclLib::createProgramWithSource(runner.ctx(), 1, &s, nullptr, &ret);
|
||||||
|
if (ret != CL_SUCCESS) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string options = " -DPROGPOW_DAG_ELEMENTS=";
|
||||||
|
|
||||||
|
const uint64_t epoch = (period * KPHash::PERIOD_LENGTH) / KPHash::EPOCH_LENGTH;
|
||||||
|
const uint64_t dag_elements = dag_sizes[epoch] / 256;
|
||||||
|
|
||||||
|
options += std::to_string(dag_elements);
|
||||||
|
|
||||||
|
options += " -DGROUP_SIZE=";
|
||||||
|
options += std::to_string(worksize);
|
||||||
|
|
||||||
|
options += runner.buildOptions();
|
||||||
|
|
||||||
|
if (OclLib::buildProgram(program, 1, &device, options.c_str()) != CL_SUCCESS) {
|
||||||
|
printf("BUILD LOG:\n%s\n", OclLib::getProgramBuildLog(program, device).data());
|
||||||
|
|
||||||
|
OclLib::release(program);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_INFO("%s " YELLOW("KawPow") " program for period " WHITE_BOLD("%" PRIu64) " compiled " BLACK_BOLD("(%" PRIu64 "ms)"), Tags::opencl(), period, Chrono::steadyMSecs() - ts);
|
||||||
|
|
||||||
|
cache.add(runner.algorithm(), period, worksize, runner.deviceIndex(), program);
|
||||||
|
|
||||||
|
return program;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::mutex m_mutex;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t z, w, jsr, jcong;
|
||||||
|
} kiss99_t;
|
||||||
|
|
||||||
|
|
||||||
|
std::string getSource(uint64_t prog_seed) const
|
||||||
|
{
|
||||||
|
std::stringstream ret;
|
||||||
|
|
||||||
|
uint32_t seed0 = static_cast<uint32_t>(prog_seed);
|
||||||
|
uint32_t seed1 = static_cast<uint32_t>(prog_seed >> 32);
|
||||||
|
|
||||||
|
kiss99_t rnd_state;
|
||||||
|
uint32_t fnv_hash = 0x811c9dc5;
|
||||||
|
rnd_state.z = fnv1a(fnv_hash, seed0);
|
||||||
|
rnd_state.w = fnv1a(fnv_hash, seed1);
|
||||||
|
rnd_state.jsr = fnv1a(fnv_hash, seed0);
|
||||||
|
rnd_state.jcong = fnv1a(fnv_hash, seed1);
|
||||||
|
|
||||||
|
// Create a random sequence of mix destinations and cache sources
|
||||||
|
// Merge is a read-modify-write, guaranteeing every mix element is modified every loop
|
||||||
|
// Guarantee no cache load is duplicated and can be optimized away
|
||||||
|
int mix_seq_dst[KPHash::REGS];
|
||||||
|
int mix_seq_cache[KPHash::REGS];
|
||||||
|
int mix_seq_dst_cnt = 0;
|
||||||
|
int mix_seq_cache_cnt = 0;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < KPHash::REGS; i++) {
|
||||||
|
mix_seq_dst[i] = i;
|
||||||
|
mix_seq_cache[i] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = KPHash::REGS - 1; i > 0; i--) {
|
||||||
|
int j;
|
||||||
|
j = rnd() % (i + 1);
|
||||||
|
std::swap(mix_seq_dst[i], mix_seq_dst[j]);
|
||||||
|
j = rnd() % (i + 1);
|
||||||
|
std::swap(mix_seq_cache[i], mix_seq_cache[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; (i < KPHash::CNT_CACHE) || (i < KPHash::CNT_MATH); ++i) {
|
||||||
|
if (i < KPHash::CNT_CACHE) {
|
||||||
|
// Cached memory access
|
||||||
|
// lanes access random locations
|
||||||
|
std::string src = mix_cache();
|
||||||
|
std::string dest = mix_dst();
|
||||||
|
uint32_t r = rnd();
|
||||||
|
ret << "offset = " << src << " % PROGPOW_CACHE_WORDS;\n";
|
||||||
|
ret << "data = c_dag[offset];\n";
|
||||||
|
ret << merge(dest, "data", r);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < KPHash::CNT_MATH) {
|
||||||
|
// Random Math
|
||||||
|
// Generate 2 unique sources
|
||||||
|
int src_rnd = rnd() % ((KPHash::REGS - 1) * KPHash::REGS);
|
||||||
|
int src1 = src_rnd % KPHash::REGS; // 0 <= src1 < KPHash::REGS
|
||||||
|
int src2 = src_rnd / KPHash::REGS; // 0 <= src2 < KPHash::REGS - 1
|
||||||
|
if (src2 >= src1) ++src2; // src2 is now any reg other than src1
|
||||||
|
std::string src1_str = "mix[" + std::to_string(src1) + "]";
|
||||||
|
std::string src2_str = "mix[" + std::to_string(src2) + "]";
|
||||||
|
uint32_t r1 = rnd();
|
||||||
|
std::string dest = mix_dst();
|
||||||
|
uint32_t r2 = rnd();
|
||||||
|
ret << math("data", src1_str, src2_str, r1);
|
||||||
|
ret << merge(dest, "data", r2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string kernel = std::regex_replace(std::string(kawpow_cl), std::regex("XMRIG_INCLUDE_PROGPOW_RANDOM_MATH"), ret.str());
|
||||||
|
ret.str(std::string());
|
||||||
|
|
||||||
|
ret << merge("mix[0]", "data_dag.s[0]", rnd());
|
||||||
|
|
||||||
|
constexpr size_t num_words_per_lane = 256 / (sizeof(uint32_t) * KPHash::LANES);
|
||||||
|
for (size_t i = 1; i < num_words_per_lane; i++)
|
||||||
|
{
|
||||||
|
std::string dest = mix_dst();
|
||||||
|
uint32_t r = rnd();
|
||||||
|
ret << merge(dest, "data_dag.s[" + std::to_string(i) + "]", r);
|
||||||
|
}
|
||||||
|
|
||||||
|
kernel = std::regex_replace(kernel, std::regex("XMRIG_INCLUDE_PROGPOW_DATA_LOADS"), ret.str());
|
||||||
|
return kernel;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static std::string merge(std::string a, std::string b, uint32_t r)
|
||||||
|
{
|
||||||
|
switch (r % 4)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return a + " = (" + a + " * 33) + " + b + ";\n";
|
||||||
|
case 1:
|
||||||
|
return a + " = (" + a + " ^ " + b + ") * 33;\n";
|
||||||
|
case 2:
|
||||||
|
return a + " = ROTL32(" + a + ", " + std::to_string(((r >> 16) % 31) + 1) + ") ^ " + b + ";\n";
|
||||||
|
case 3:
|
||||||
|
return a + " = ROTR32(" + a + ", " + std::to_string(((r >> 16) % 31) + 1) + ") ^ " + b + ";\n";
|
||||||
|
}
|
||||||
|
return "#error\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static std::string math(std::string d, std::string a, std::string b, uint32_t r)
|
||||||
|
{
|
||||||
|
switch (r % 11)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return d + " = " + a + " + " + b + ";\n";
|
||||||
|
case 1:
|
||||||
|
return d + " = " + a + " * " + b + ";\n";
|
||||||
|
case 2:
|
||||||
|
return d + " = mul_hi(" + a + ", " + b + ");\n";
|
||||||
|
case 3:
|
||||||
|
return d + " = min(" + a + ", " + b + ");\n";
|
||||||
|
case 4:
|
||||||
|
return d + " = ROTL32(" + a + ", " + b + " % 32);\n";
|
||||||
|
case 5:
|
||||||
|
return d + " = ROTR32(" + a + ", " + b + " % 32);\n";
|
||||||
|
case 6:
|
||||||
|
return d + " = " + a + " & " + b + ";\n";
|
||||||
|
case 7:
|
||||||
|
return d + " = " + a + " | " + b + ";\n";
|
||||||
|
case 8:
|
||||||
|
return d + " = " + a + " ^ " + b + ";\n";
|
||||||
|
case 9:
|
||||||
|
return d + " = clz(" + a + ") + clz(" + b + ");\n";
|
||||||
|
case 10:
|
||||||
|
return d + " = popcount(" + a + ") + popcount(" + b + ");\n";
|
||||||
|
}
|
||||||
|
return "#error\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static uint32_t fnv1a(uint32_t& h, uint32_t d)
|
||||||
|
{
|
||||||
|
return h = (h ^ d) * 0x1000193;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t kiss99(kiss99_t& st)
|
||||||
|
{
|
||||||
|
st.z = 36969 * (st.z & 65535) + (st.z >> 16);
|
||||||
|
st.w = 18000 * (st.w & 65535) + (st.w >> 16);
|
||||||
|
uint32_t MWC = ((st.z << 16) + st.w);
|
||||||
|
st.jsr ^= (st.jsr << 17);
|
||||||
|
st.jsr ^= (st.jsr >> 13);
|
||||||
|
st.jsr ^= (st.jsr << 5);
|
||||||
|
st.jcong = 69069 * st.jcong + 1234567;
|
||||||
|
return ((MWC ^ st.jcong) + st.jsr);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class KawPowBaton : public Baton<uv_work_t>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
inline KawPowBaton(const IOclRunner &runner, uint64_t period, uint32_t worksize) :
|
||||||
|
runner(runner),
|
||||||
|
period(period),
|
||||||
|
worksize(worksize)
|
||||||
|
{}
|
||||||
|
|
||||||
|
const IOclRunner &runner;
|
||||||
|
const uint64_t period;
|
||||||
|
const uint32_t worksize;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static KawPowBuilder builder;
|
||||||
|
|
||||||
|
|
||||||
|
cl_program OclKawPow::get(const IOclRunner &runner, uint64_t height, uint32_t worksize)
|
||||||
|
{
|
||||||
|
const uint64_t period = height / KPHash::PERIOD_LENGTH;
|
||||||
|
|
||||||
|
KawPowBaton* baton = new KawPowBaton(runner, period + 1, worksize);
|
||||||
|
|
||||||
|
uv_queue_work(uv_default_loop(), &baton->req,
|
||||||
|
[](uv_work_t *req) {
|
||||||
|
KawPowBaton* baton = static_cast<KawPowBaton*>(req->data);
|
||||||
|
builder.build(baton->runner, baton->period, baton->worksize);
|
||||||
|
},
|
||||||
|
[](uv_work_t *req, int) { delete static_cast<KawPowBaton*>(req->data); }
|
||||||
|
);
|
||||||
|
|
||||||
|
cl_program program = cache.search(runner, period, worksize);
|
||||||
|
if (program) {
|
||||||
|
return program;
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.build(runner, period, worksize);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OclKawPow::clear()
|
||||||
|
{
|
||||||
|
cache.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace xmrig
|
|
@ -22,27 +22,32 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XMRIG_CN00RYOKERNEL_H
|
#ifndef XMRIG_OCLKAWPOW_H
|
||||||
#define XMRIG_CN00RYOKERNEL_H
|
#define XMRIG_OCLKAWPOW_H
|
||||||
|
|
||||||
|
|
||||||
#include "backend/opencl/wrappers/OclKernel.h"
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
|
||||||
|
using cl_program = struct _cl_program *;
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
class Cn00RyoKernel : public OclKernel
|
class IOclRunner;
|
||||||
|
|
||||||
|
|
||||||
|
class OclKawPow
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline Cn00RyoKernel(cl_program program) : OclKernel(program, "cn00") {}
|
static cl_program get(const IOclRunner &runner, uint64_t height, uint32_t worksize);
|
||||||
|
static void clear();
|
||||||
void enqueue(cl_command_queue queue, size_t threads);
|
|
||||||
void setArgs(cl_mem scratchpads, cl_mem states);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
} // namespace xmrig
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
#endif /* XMRIG_CN00RYOKERNEL_H */
|
#endif /* XMRIG_OCLKAWPOW_H */
|
|
@ -57,8 +57,8 @@ extern bool ocl_generic_rx_generator(const OclDevice &device, const Algorithm &a
|
||||||
extern bool ocl_generic_astrobwt_generator(const OclDevice& device, const Algorithm& algorithm, OclThreads& threads);
|
extern bool ocl_generic_astrobwt_generator(const OclDevice& device, const Algorithm& algorithm, OclThreads& threads);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef XMRIG_ALGO_CN_GPU
|
#ifdef XMRIG_ALGO_KAWPOW
|
||||||
extern bool ocl_generic_cn_gpu_generator(const OclDevice &device, const Algorithm &algorithm, OclThreads &threads);
|
extern bool ocl_generic_kawpow_generator(const OclDevice& device, const Algorithm& algorithm, OclThreads& threads);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern bool ocl_vega_cn_generator(const OclDevice &device, const Algorithm &algorithm, OclThreads &threads);
|
extern bool ocl_vega_cn_generator(const OclDevice &device, const Algorithm &algorithm, OclThreads &threads);
|
||||||
|
@ -72,8 +72,8 @@ static ocl_gen_config_fun generators[] = {
|
||||||
# ifdef XMRIG_ALGO_ASTROBWT
|
# ifdef XMRIG_ALGO_ASTROBWT
|
||||||
ocl_generic_astrobwt_generator,
|
ocl_generic_astrobwt_generator,
|
||||||
# endif
|
# endif
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
# ifdef XMRIG_ALGO_KAWPOW
|
||||||
ocl_generic_cn_gpu_generator,
|
ocl_generic_kawpow_generator,
|
||||||
# endif
|
# endif
|
||||||
ocl_vega_cn_generator,
|
ocl_vega_cn_generator,
|
||||||
ocl_generic_cn_generator
|
ocl_generic_cn_generator
|
||||||
|
|
|
@ -3,6 +3,7 @@ set(HEADERS_BASE
|
||||||
src/base/crypto/Algorithm.h
|
src/base/crypto/Algorithm.h
|
||||||
src/base/crypto/Coin.h
|
src/base/crypto/Coin.h
|
||||||
src/base/crypto/keccak.h
|
src/base/crypto/keccak.h
|
||||||
|
src/base/crypto/sha3.h
|
||||||
src/base/io/Console.h
|
src/base/io/Console.h
|
||||||
src/base/io/Env.h
|
src/base/io/Env.h
|
||||||
src/base/io/json/Json.h
|
src/base/io/json/Json.h
|
||||||
|
@ -12,11 +13,13 @@ set(HEADERS_BASE
|
||||||
src/base/io/log/backends/FileLog.h
|
src/base/io/log/backends/FileLog.h
|
||||||
src/base/io/log/FileLogWriter.h
|
src/base/io/log/FileLogWriter.h
|
||||||
src/base/io/log/Log.h
|
src/base/io/log/Log.h
|
||||||
|
src/base/io/log/Tags.h
|
||||||
src/base/io/Signals.h
|
src/base/io/Signals.h
|
||||||
src/base/io/Watcher.h
|
src/base/io/Watcher.h
|
||||||
src/base/kernel/Base.h
|
src/base/kernel/Base.h
|
||||||
src/base/kernel/config/BaseConfig.h
|
src/base/kernel/config/BaseConfig.h
|
||||||
src/base/kernel/config/BaseTransform.h
|
src/base/kernel/config/BaseTransform.h
|
||||||
|
src/base/kernel/config/Title.h
|
||||||
src/base/kernel/Entry.h
|
src/base/kernel/Entry.h
|
||||||
src/base/kernel/interfaces/IBaseListener.h
|
src/base/kernel/interfaces/IBaseListener.h
|
||||||
src/base/kernel/interfaces/IClient.h
|
src/base/kernel/interfaces/IClient.h
|
||||||
|
@ -69,6 +72,7 @@ set(SOURCES_BASE
|
||||||
src/base/crypto/Algorithm.cpp
|
src/base/crypto/Algorithm.cpp
|
||||||
src/base/crypto/Coin.cpp
|
src/base/crypto/Coin.cpp
|
||||||
src/base/crypto/keccak.cpp
|
src/base/crypto/keccak.cpp
|
||||||
|
src/base/crypto/sha3.cpp
|
||||||
src/base/io/Console.cpp
|
src/base/io/Console.cpp
|
||||||
src/base/io/Env.cpp
|
src/base/io/Env.cpp
|
||||||
src/base/io/json/Json.cpp
|
src/base/io/json/Json.cpp
|
||||||
|
@ -78,11 +82,13 @@ set(SOURCES_BASE
|
||||||
src/base/io/log/backends/FileLog.cpp
|
src/base/io/log/backends/FileLog.cpp
|
||||||
src/base/io/log/FileLogWriter.cpp
|
src/base/io/log/FileLogWriter.cpp
|
||||||
src/base/io/log/Log.cpp
|
src/base/io/log/Log.cpp
|
||||||
|
src/base/io/log/Tags.cpp
|
||||||
src/base/io/Signals.cpp
|
src/base/io/Signals.cpp
|
||||||
src/base/io/Watcher.cpp
|
src/base/io/Watcher.cpp
|
||||||
src/base/kernel/Base.cpp
|
src/base/kernel/Base.cpp
|
||||||
src/base/kernel/config/BaseConfig.cpp
|
src/base/kernel/config/BaseConfig.cpp
|
||||||
src/base/kernel/config/BaseTransform.cpp
|
src/base/kernel/config/BaseTransform.cpp
|
||||||
|
src/base/kernel/config/Title.cpp
|
||||||
src/base/kernel/Entry.cpp
|
src/base/kernel/Entry.cpp
|
||||||
src/base/kernel/Platform.cpp
|
src/base/kernel/Platform.cpp
|
||||||
src/base/kernel/Process.cpp
|
src/base/kernel/Process.cpp
|
||||||
|
@ -203,3 +209,16 @@ if (WITH_ENV_VARS)
|
||||||
else()
|
else()
|
||||||
remove_definitions(/DXMRIG_FEATURE_ENV)
|
remove_definitions(/DXMRIG_FEATURE_ENV)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if (WITH_KAWPOW)
|
||||||
|
list(APPEND HEADERS_BASE
|
||||||
|
src/base/net/stratum/AutoClient.h
|
||||||
|
src/base/net/stratum/EthStratumClient.h
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND SOURCES_BASE
|
||||||
|
src/base/net/stratum/AutoClient.cpp
|
||||||
|
src/base/net/stratum/EthStratumClient.cpp
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
|
@ -70,10 +70,6 @@ static AlgoName const algorithm_names[] = {
|
||||||
{ "cryptonight/rwz", "cn/rwz", Algorithm::CN_RWZ },
|
{ "cryptonight/rwz", "cn/rwz", Algorithm::CN_RWZ },
|
||||||
{ "cryptonight/zls", "cn/zls", Algorithm::CN_ZLS },
|
{ "cryptonight/zls", "cn/zls", Algorithm::CN_ZLS },
|
||||||
{ "cryptonight/double", "cn/double", Algorithm::CN_DOUBLE },
|
{ "cryptonight/double", "cn/double", Algorithm::CN_DOUBLE },
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
{ "cryptonight/gpu", "cn/gpu", Algorithm::CN_GPU },
|
|
||||||
{ "cryptonight_gpu", nullptr, Algorithm::CN_GPU },
|
|
||||||
# endif
|
|
||||||
# ifdef XMRIG_ALGO_CN_LITE
|
# ifdef XMRIG_ALGO_CN_LITE
|
||||||
{ "cryptonight-lite/0", "cn-lite/0", Algorithm::CN_LITE_0 },
|
{ "cryptonight-lite/0", "cn-lite/0", Algorithm::CN_LITE_0 },
|
||||||
{ "cryptonight-lite/1", "cn-lite/1", Algorithm::CN_LITE_1 },
|
{ "cryptonight-lite/1", "cn-lite/1", Algorithm::CN_LITE_1 },
|
||||||
|
@ -127,6 +123,12 @@ static AlgoName const algorithm_names[] = {
|
||||||
{ "astrobwt", nullptr, Algorithm::ASTROBWT_DERO },
|
{ "astrobwt", nullptr, Algorithm::ASTROBWT_DERO },
|
||||||
{ "astrobwt/dero", nullptr, Algorithm::ASTROBWT_DERO },
|
{ "astrobwt/dero", nullptr, Algorithm::ASTROBWT_DERO },
|
||||||
# endif
|
# endif
|
||||||
|
# ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
{ "kawpow", nullptr, Algorithm::KAWPOW_RVN },
|
||||||
|
{ "kawpow/rvn", nullptr, Algorithm::KAWPOW_RVN },
|
||||||
|
# endif
|
||||||
|
{ "cryptonight/ccx", "cn/ccx", Algorithm::CN_CCX },
|
||||||
|
{ "cryptonight/conceal", "cn/conceal", Algorithm::CN_CCX },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -238,6 +240,18 @@ size_t xmrig::Algorithm::l3() const
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
if (f == KAWPOW) {
|
||||||
|
switch (m_id) {
|
||||||
|
case KAWPOW_RVN:
|
||||||
|
return 32768;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,12 +276,6 @@ uint32_t xmrig::Algorithm::maxIntensity() const
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
|
||||||
if (m_id == CN_GPU) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,9 +294,7 @@ xmrig::Algorithm::Family xmrig::Algorithm::family(Id id)
|
||||||
case CN_RWZ:
|
case CN_RWZ:
|
||||||
case CN_ZLS:
|
case CN_ZLS:
|
||||||
case CN_DOUBLE:
|
case CN_DOUBLE:
|
||||||
# ifdef XMRIG_ALGO_CN_GPU
|
case CN_CCX:
|
||||||
case CN_GPU:
|
|
||||||
# endif
|
|
||||||
return CN;
|
return CN;
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_CN_LITE
|
# ifdef XMRIG_ALGO_CN_LITE
|
||||||
|
@ -331,6 +337,11 @@ xmrig::Algorithm::Family xmrig::Algorithm::family(Id id)
|
||||||
return ASTROBWT;
|
return ASTROBWT;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_KAWPOW
|
||||||
|
case KAWPOW_RVN:
|
||||||
|
return KAWPOW;
|
||||||
|
# endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,6 @@ public:
|
||||||
CN_RWZ, // "cn/rwz" CryptoNight variant 2 with 3/4 iterations and reversed shuffle operation (Graft).
|
CN_RWZ, // "cn/rwz" CryptoNight variant 2 with 3/4 iterations and reversed shuffle operation (Graft).
|
||||||
CN_ZLS, // "cn/zls" CryptoNight variant 2 with 3/4 iterations (Zelerius).
|
CN_ZLS, // "cn/zls" CryptoNight variant 2 with 3/4 iterations (Zelerius).
|
||||||
CN_DOUBLE, // "cn/double" CryptoNight variant 2 with double iterations (X-CASH).
|
CN_DOUBLE, // "cn/double" CryptoNight variant 2 with double iterations (X-CASH).
|
||||||
CN_GPU, // "cn/gpu" CryptoNight-GPU (Ryo).
|
|
||||||
CN_LITE_0, // "cn-lite/0" CryptoNight-Lite variant 0.
|
CN_LITE_0, // "cn-lite/0" CryptoNight-Lite variant 0.
|
||||||
CN_LITE_1, // "cn-lite/1" CryptoNight-Lite variant 1.
|
CN_LITE_1, // "cn-lite/1" CryptoNight-Lite variant 1.
|
||||||
CN_HEAVY_0, // "cn-heavy/0" CryptoNight-Heavy (4 MB).
|
CN_HEAVY_0, // "cn-heavy/0" CryptoNight-Heavy (4 MB).
|
||||||
|
@ -64,6 +63,7 @@ public:
|
||||||
CN_HEAVY_XHV, // "cn-heavy/xhv" CryptoNight-Heavy (modified, Haven Protocol only).
|
CN_HEAVY_XHV, // "cn-heavy/xhv" CryptoNight-Heavy (modified, Haven Protocol only).
|
||||||
CN_PICO_0, // "cn-pico" CryptoNight-Pico
|
CN_PICO_0, // "cn-pico" CryptoNight-Pico
|
||||||
CN_PICO_TLO, // "cn-pico/tlo" CryptoNight-Pico (TLO)
|
CN_PICO_TLO, // "cn-pico/tlo" CryptoNight-Pico (TLO)
|
||||||
|
CN_CCX, // "cn/ccx" Conceal (CCX)
|
||||||
RX_0, // "rx/0" RandomX (reference configuration).
|
RX_0, // "rx/0" RandomX (reference configuration).
|
||||||
RX_WOW, // "rx/wow" RandomWOW (Wownero).
|
RX_WOW, // "rx/wow" RandomWOW (Wownero).
|
||||||
RX_LOKI, // "rx/loki" RandomXL (Loki).
|
RX_LOKI, // "rx/loki" RandomXL (Loki).
|
||||||
|
@ -73,6 +73,7 @@ public:
|
||||||
AR2_CHUKWA, // "argon2/chukwa" Argon2id (Chukwa).
|
AR2_CHUKWA, // "argon2/chukwa" Argon2id (Chukwa).
|
||||||
AR2_WRKZ, // "argon2/wrkz" Argon2id (WRKZ)
|
AR2_WRKZ, // "argon2/wrkz" Argon2id (WRKZ)
|
||||||
ASTROBWT_DERO, // "astrobwt" AstroBWT (Dero)
|
ASTROBWT_DERO, // "astrobwt" AstroBWT (Dero)
|
||||||
|
KAWPOW_RVN, // "kawpow/rvn" KawPow (RVN)
|
||||||
MAX
|
MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -84,7 +85,8 @@ public:
|
||||||
CN_PICO,
|
CN_PICO,
|
||||||
RANDOM_X,
|
RANDOM_X,
|
||||||
ARGON2,
|
ARGON2,
|
||||||
ASTROBWT
|
ASTROBWT,
|
||||||
|
KAWPOW
|
||||||
};
|
};
|
||||||
|
|
||||||
inline Algorithm() = default;
|
inline Algorithm() = default;
|
||||||
|
|
|
@ -47,12 +47,16 @@ struct CoinName
|
||||||
|
|
||||||
|
|
||||||
static CoinName const coin_names[] = {
|
static CoinName const coin_names[] = {
|
||||||
{ "monero", Coin::MONERO },
|
{ "monero", Coin::MONERO },
|
||||||
{ "xmr", Coin::MONERO },
|
{ "xmr", Coin::MONERO },
|
||||||
{ "arqma", Coin::ARQMA },
|
{ "arqma", Coin::ARQMA },
|
||||||
{ "arq", Coin::ARQMA },
|
{ "arq", Coin::ARQMA },
|
||||||
{ "dero", Coin::DERO },
|
{ "dero", Coin::DERO },
|
||||||
{ "keva", Coin::KEVA }
|
{ "keva", Coin::KEVA },
|
||||||
|
{ "ravencoin", Coin::RAVEN },
|
||||||
|
{ "raven", Coin::RAVEN },
|
||||||
|
{ "rvn", Coin::RAVEN },
|
||||||
|
{ "conceal", Coin::CONCEAL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -75,6 +79,12 @@ xmrig::Algorithm::Id xmrig::Coin::algorithm(uint8_t blobVersion) const
|
||||||
case KEVA:
|
case KEVA:
|
||||||
return (blobVersion >= 11) ? Algorithm::RX_KEVA : Algorithm::CN_R;
|
return (blobVersion >= 11) ? Algorithm::RX_KEVA : Algorithm::CN_R;
|
||||||
|
|
||||||
|
case RAVEN:
|
||||||
|
return Algorithm::KAWPOW_RVN;
|
||||||
|
|
||||||
|
case CONCEAL:
|
||||||
|
return Algorithm::CN_CCX;
|
||||||
|
|
||||||
case INVALID:
|
case INVALID:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,9 @@ public:
|
||||||
MONERO,
|
MONERO,
|
||||||
ARQMA,
|
ARQMA,
|
||||||
DERO,
|
DERO,
|
||||||
KEVA
|
KEVA,
|
||||||
|
RAVEN,
|
||||||
|
CONCEAL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -55,7 +57,7 @@ public:
|
||||||
inline bool isValid() const { return m_id != INVALID; }
|
inline bool isValid() const { return m_id != INVALID; }
|
||||||
inline Id id() const { return m_id; }
|
inline Id id() const { return m_id; }
|
||||||
|
|
||||||
Algorithm::Id algorithm(uint8_t blobVersion) const;
|
Algorithm::Id algorithm(uint8_t blobVersion = 255) const;
|
||||||
const char *name() const;
|
const char *name() const;
|
||||||
rapidjson::Value toJSON() const;
|
rapidjson::Value toJSON() const;
|
||||||
|
|
||||||
|
|
|
@ -238,7 +238,7 @@ sha3_Finalize(void *priv)
|
||||||
return (ctx->sb);
|
return (ctx->sb);
|
||||||
}
|
}
|
||||||
|
|
||||||
sha3_return_t sha3_HashBuffer( unsigned bitSize, enum SHA3_FLAGS flags, const void *in, unsigned inBytes, void *out, unsigned outBytes ) {
|
extern "C" sha3_return_t sha3_HashBuffer( unsigned bitSize, enum SHA3_FLAGS flags, const void *in, unsigned inBytes, void *out, unsigned outBytes ) {
|
||||||
sha3_return_t err;
|
sha3_return_t err;
|
||||||
sha3_context c;
|
sha3_context c;
|
||||||
|
|
|
@ -55,17 +55,19 @@ void sha3_Init256(void *priv);
|
||||||
void sha3_Init384(void *priv);
|
void sha3_Init384(void *priv);
|
||||||
void sha3_Init512(void *priv);
|
void sha3_Init512(void *priv);
|
||||||
|
|
||||||
SHA3_FLAGS sha3_SetFlags(void *priv, SHA3_FLAGS);
|
enum SHA3_FLAGS sha3_SetFlags(void *priv, enum SHA3_FLAGS);
|
||||||
|
|
||||||
void sha3_Update(void *priv, void const *bufIn, size_t len);
|
void sha3_Update(void *priv, void const *bufIn, size_t len);
|
||||||
|
|
||||||
void const *sha3_Finalize(void *priv);
|
void const *sha3_Finalize(void *priv);
|
||||||
|
|
||||||
/* Single-call hashing */
|
/* Single-call hashing */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
sha3_return_t sha3_HashBuffer(
|
sha3_return_t sha3_HashBuffer(
|
||||||
unsigned bitSize, /* 256, 384, 512 */
|
unsigned bitSize, /* 256, 384, 512 */
|
||||||
SHA3_FLAGS flags, /* SHA3_FLAGS_NONE or SHA3_FLAGS_KECCAK */
|
enum SHA3_FLAGS flags, /* SHA3_FLAGS_NONE or SHA3_FLAGS_KECCAK */
|
||||||
const void *in, unsigned inBytes,
|
const void *in, unsigned inBytes,
|
||||||
void *out, unsigned outBytes ); /* up to bitSize/8; truncation OK */
|
void *out, unsigned outBytes ); /* up to bitSize/8; truncation OK */
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -142,8 +142,11 @@ private:
|
||||||
#define LOG_NOTICE(x, ...) xmrig::Log::print(xmrig::Log::NOTICE, x, ##__VA_ARGS__)
|
#define LOG_NOTICE(x, ...) xmrig::Log::print(xmrig::Log::NOTICE, x, ##__VA_ARGS__)
|
||||||
#define LOG_INFO(x, ...) xmrig::Log::print(xmrig::Log::INFO, x, ##__VA_ARGS__)
|
#define LOG_INFO(x, ...) xmrig::Log::print(xmrig::Log::INFO, x, ##__VA_ARGS__)
|
||||||
#define LOG_VERBOSE(x, ...) if (xmrig::Log::verbose() > 0) { xmrig::Log::print(xmrig::Log::INFO, x, ##__VA_ARGS__); }
|
#define LOG_VERBOSE(x, ...) if (xmrig::Log::verbose() > 0) { xmrig::Log::print(xmrig::Log::INFO, x, ##__VA_ARGS__); }
|
||||||
#define LOG_V(x, ...) if (xmrig::Log::verbose() > 0) { xmrig::Log::print(xmrig::Log::INFO, x, ##__VA_ARGS__); }
|
#define LOG_V1(x, ...) if (xmrig::Log::verbose() > 0) { xmrig::Log::print(xmrig::Log::INFO, x, ##__VA_ARGS__); }
|
||||||
#define LOG_VV(x, ...) if (xmrig::Log::verbose() > 1) { xmrig::Log::print(xmrig::Log::INFO, x, ##__VA_ARGS__); }
|
#define LOG_V2(x, ...) if (xmrig::Log::verbose() > 1) { xmrig::Log::print(xmrig::Log::INFO, x, ##__VA_ARGS__); }
|
||||||
|
#define LOG_V3(x, ...) if (xmrig::Log::verbose() > 2) { xmrig::Log::print(xmrig::Log::INFO, x, ##__VA_ARGS__); }
|
||||||
|
#define LOG_V4(x, ...) if (xmrig::Log::verbose() > 3) { xmrig::Log::print(xmrig::Log::INFO, x, ##__VA_ARGS__); }
|
||||||
|
#define LOG_V5(x, ...) if (xmrig::Log::verbose() > 4) { xmrig::Log::print(xmrig::Log::INFO, x, ##__VA_ARGS__); }
|
||||||
|
|
||||||
#ifdef APP_DEBUG
|
#ifdef APP_DEBUG
|
||||||
# define LOG_DEBUG(x, ...) xmrig::Log::print(xmrig::Log::DEBUG, x, ##__VA_ARGS__)
|
# define LOG_DEBUG(x, ...) xmrig::Log::print(xmrig::Log::DEBUG, x, ##__VA_ARGS__)
|
||||||
|
|
93
src/base/io/log/Tags.cpp
Normal file
93
src/base/io/log/Tags.cpp
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
|
#include "base/io/log/Log.h"
|
||||||
|
|
||||||
|
|
||||||
|
const char *xmrig::Tags::config()
|
||||||
|
{
|
||||||
|
static const char *tag = CYAN_BG_BOLD(WHITE_BOLD_S " config ");
|
||||||
|
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *xmrig::Tags::network()
|
||||||
|
{
|
||||||
|
static const char *tag = BLUE_BG_BOLD(WHITE_BOLD_S " net ");
|
||||||
|
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *xmrig::Tags::signal()
|
||||||
|
{
|
||||||
|
static const char *tag = YELLOW_BG_BOLD(WHITE_BOLD_S " signal ");
|
||||||
|
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_MINER_PROJECT
|
||||||
|
const char *xmrig::Tags::cpu()
|
||||||
|
{
|
||||||
|
static const char *tag = CYAN_BG_BOLD(WHITE_BOLD_S " cpu ");
|
||||||
|
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *xmrig::Tags::miner()
|
||||||
|
{
|
||||||
|
static const char *tag = MAGENTA_BG_BOLD(WHITE_BOLD_S " miner ");
|
||||||
|
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
const char *xmrig::Tags::randomx()
|
||||||
|
{
|
||||||
|
static const char *tag = BLUE_BG(WHITE_BOLD_S " randomx ") " ";
|
||||||
|
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_FEATURE_CUDA
|
||||||
|
const char *xmrig::Tags::nvidia()
|
||||||
|
{
|
||||||
|
static const char *tag = GREEN_BG_BOLD(WHITE_BOLD_S " nvidia ");
|
||||||
|
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XMRIG_FEATURE_OPENCL
|
||||||
|
const char *xmrig::Tags::opencl()
|
||||||
|
{
|
||||||
|
static const char *tag = MAGENTA_BG_BOLD(WHITE_BOLD_S " opencl ");
|
||||||
|
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
#endif
|
58
src/base/io/log/Tags.h
Normal file
58
src/base/io/log/Tags.h
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_TAGS_H
|
||||||
|
#define XMRIG_TAGS_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
class Tags
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static const char *config();
|
||||||
|
static const char *network();
|
||||||
|
static const char *signal();
|
||||||
|
|
||||||
|
# ifdef XMRIG_MINER_PROJECT
|
||||||
|
static const char *cpu();
|
||||||
|
static const char *miner();
|
||||||
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
|
static const char *randomx();
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_CUDA
|
||||||
|
static const char *nvidia();
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_OPENCL
|
||||||
|
static const char *opencl();
|
||||||
|
# endif
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace xmrig */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* XMRIG_TAGS_H */
|
|
@ -6,8 +6,8 @@
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2019 Spudz76 <https://github.com/Spudz76>
|
* Copyright 2019 Spudz76 <https://github.com/Spudz76>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -28,12 +28,13 @@
|
||||||
|
|
||||||
|
|
||||||
#include "base/io/log/backends/ConsoleLog.h"
|
#include "base/io/log/backends/ConsoleLog.h"
|
||||||
#include "base/tools/Handle.h"
|
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/kernel/config/Title.h"
|
||||||
|
#include "base/tools/Handle.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
|
||||||
xmrig::ConsoleLog::ConsoleLog()
|
xmrig::ConsoleLog::ConsoleLog(const Title &title)
|
||||||
{
|
{
|
||||||
if (!isSupported()) {
|
if (!isSupported()) {
|
||||||
Log::setColors(false);
|
Log::setColors(false);
|
||||||
|
@ -61,7 +62,9 @@ xmrig::ConsoleLog::ConsoleLog()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SetConsoleTitleA(APP_NAME " " APP_VERSION);
|
if (title.isEnabled()) {
|
||||||
|
SetConsoleTitleA(title.value());
|
||||||
|
}
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
* Copyright 2019 Spudz76 <https://github.com/Spudz76>
|
* Copyright 2019 Spudz76 <https://github.com/Spudz76>
|
||||||
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -38,12 +38,15 @@ using uv_tty_t = struct uv_tty_s;
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
class Title;
|
||||||
|
|
||||||
|
|
||||||
class ConsoleLog : public ILogBackend
|
class ConsoleLog : public ILogBackend
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
XMRIG_DISABLE_COPY_MOVE(ConsoleLog)
|
XMRIG_DISABLE_COPY_MOVE(ConsoleLog)
|
||||||
|
|
||||||
ConsoleLog();
|
ConsoleLog(const Title &title);
|
||||||
~ConsoleLog() override;
|
~ConsoleLog() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "base/io/log/backends/ConsoleLog.h"
|
#include "base/io/log/backends/ConsoleLog.h"
|
||||||
#include "base/io/log/backends/FileLog.h"
|
#include "base/io/log/backends/FileLog.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
#include "base/io/Watcher.h"
|
#include "base/io/Watcher.h"
|
||||||
#include "base/kernel/interfaces/IBaseListener.h"
|
#include "base/kernel/interfaces/IBaseListener.h"
|
||||||
#include "base/kernel/Platform.h"
|
#include "base/kernel/Platform.h"
|
||||||
|
@ -183,7 +184,7 @@ int xmrig::Base::init()
|
||||||
Log::setBackground(true);
|
Log::setBackground(true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log::add(new ConsoleLog());
|
Log::add(new ConsoleLog(config()->title()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config()->logFile()) {
|
if (config()->logFile()) {
|
||||||
|
@ -285,7 +286,7 @@ void xmrig::Base::addListener(IBaseListener *listener)
|
||||||
|
|
||||||
void xmrig::Base::onFileChanged(const String &fileName)
|
void xmrig::Base::onFileChanged(const String &fileName)
|
||||||
{
|
{
|
||||||
LOG_WARN("\"%s\" was changed, reloading configuration", fileName.data());
|
LOG_WARN("%s " YELLOW("\"%s\" was changed, reloading configuration"), Tags::config(), fileName.data());
|
||||||
|
|
||||||
JsonChain chain;
|
JsonChain chain;
|
||||||
chain.addFile(fileName);
|
chain.addFile(fileName);
|
||||||
|
@ -293,7 +294,7 @@ void xmrig::Base::onFileChanged(const String &fileName)
|
||||||
auto config = new Config();
|
auto config = new Config();
|
||||||
|
|
||||||
if (!config->read(chain, chain.fileName())) {
|
if (!config->read(chain, chain.fileName())) {
|
||||||
LOG_ERR("reloading failed");
|
LOG_ERR("%s " RED("reloading failed"), Tags::config());
|
||||||
|
|
||||||
delete config;
|
delete config;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "3rdparty/rapidjson/document.h"
|
#include "3rdparty/rapidjson/document.h"
|
||||||
#include "base/io/json/Json.h"
|
#include "base/io/json/Json.h"
|
||||||
#include "base/io/log/Log.h"
|
#include "base/io/log/Log.h"
|
||||||
|
#include "base/io/log/Tags.h"
|
||||||
#include "base/kernel/interfaces/IJsonReader.h"
|
#include "base/kernel/interfaces/IJsonReader.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
@ -62,6 +63,7 @@ const char *BaseConfig::kHttp = "http";
|
||||||
const char *BaseConfig::kLogFile = "log-file";
|
const char *BaseConfig::kLogFile = "log-file";
|
||||||
const char *BaseConfig::kPrintTime = "print-time";
|
const char *BaseConfig::kPrintTime = "print-time";
|
||||||
const char *BaseConfig::kSyslog = "syslog";
|
const char *BaseConfig::kSyslog = "syslog";
|
||||||
|
const char *BaseConfig::kTitle = "title";
|
||||||
const char *BaseConfig::kUserAgent = "user-agent";
|
const char *BaseConfig::kUserAgent = "user-agent";
|
||||||
const char *BaseConfig::kVerbose = "verbose";
|
const char *BaseConfig::kVerbose = "verbose";
|
||||||
const char *BaseConfig::kWatch = "watch";
|
const char *BaseConfig::kWatch = "watch";
|
||||||
|
@ -91,6 +93,7 @@ bool xmrig::BaseConfig::read(const IJsonReader &reader, const char *fileName)
|
||||||
m_logFile = reader.getString(kLogFile);
|
m_logFile = reader.getString(kLogFile);
|
||||||
m_userAgent = reader.getString(kUserAgent);
|
m_userAgent = reader.getString(kUserAgent);
|
||||||
m_printTime = std::min(reader.getUint(kPrintTime, m_printTime), 3600U);
|
m_printTime = std::min(reader.getUint(kPrintTime, m_printTime), 3600U);
|
||||||
|
m_title = reader.getValue(kTitle);
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_TLS
|
# ifdef XMRIG_FEATURE_TLS
|
||||||
m_tls = reader.getValue(kTls);
|
m_tls = reader.getValue(kTls);
|
||||||
|
@ -122,7 +125,7 @@ bool xmrig::BaseConfig::save()
|
||||||
getJSON(doc);
|
getJSON(doc);
|
||||||
|
|
||||||
if (Json::save(m_fileName, doc)) {
|
if (Json::save(m_fileName, doc)) {
|
||||||
LOG_NOTICE("configuration saved to: \"%s\"", m_fileName.data());
|
LOG_NOTICE("%s " WHITE_BOLD("configuration saved to: \"%s\""), Tags::config(), m_fileName.data());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#define XMRIG_BASECONFIG_H
|
#define XMRIG_BASECONFIG_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "base/kernel/config/Title.h"
|
||||||
#include "base/kernel/interfaces/IConfig.h"
|
#include "base/kernel/interfaces/IConfig.h"
|
||||||
#include "base/net/http/Http.h"
|
#include "base/net/http/Http.h"
|
||||||
#include "base/net/stratum/Pools.h"
|
#include "base/net/stratum/Pools.h"
|
||||||
|
@ -56,6 +57,7 @@ public:
|
||||||
static const char *kLogFile;
|
static const char *kLogFile;
|
||||||
static const char *kPrintTime;
|
static const char *kPrintTime;
|
||||||
static const char *kSyslog;
|
static const char *kSyslog;
|
||||||
|
static const char *kTitle;
|
||||||
static const char *kUserAgent;
|
static const char *kUserAgent;
|
||||||
static const char *kVerbose;
|
static const char *kVerbose;
|
||||||
static const char *kWatch;
|
static const char *kWatch;
|
||||||
|
@ -76,6 +78,7 @@ public:
|
||||||
inline const Pools &pools() const { return m_pools; }
|
inline const Pools &pools() const { return m_pools; }
|
||||||
inline const String &apiId() const { return m_apiId; }
|
inline const String &apiId() const { return m_apiId; }
|
||||||
inline const String &apiWorkerId() const { return m_apiWorkerId; }
|
inline const String &apiWorkerId() const { return m_apiWorkerId; }
|
||||||
|
inline const Title &title() const { return m_title; }
|
||||||
inline uint32_t printTime() const { return m_printTime; }
|
inline uint32_t printTime() const { return m_printTime; }
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_TLS
|
# ifdef XMRIG_FEATURE_TLS
|
||||||
|
@ -105,6 +108,7 @@ protected:
|
||||||
String m_fileName;
|
String m_fileName;
|
||||||
String m_logFile;
|
String m_logFile;
|
||||||
String m_userAgent;
|
String m_userAgent;
|
||||||
|
Title m_title;
|
||||||
uint32_t m_printTime = 60;
|
uint32_t m_printTime = 60;
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_TLS
|
# ifdef XMRIG_FEATURE_TLS
|
||||||
|
|
|
@ -204,6 +204,9 @@ void xmrig::BaseTransform::transform(rapidjson::Document &doc, int key, const ch
|
||||||
case IConfig::UserAgentKey: /* --user-agent */
|
case IConfig::UserAgentKey: /* --user-agent */
|
||||||
return set(doc, BaseConfig::kUserAgent, arg);
|
return set(doc, BaseConfig::kUserAgent, arg);
|
||||||
|
|
||||||
|
case IConfig::TitleKey: /* --title */
|
||||||
|
return set(doc, BaseConfig::kTitle, arg);
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_TLS
|
# ifdef XMRIG_FEATURE_TLS
|
||||||
case IConfig::TlsCertKey: /* --tls-cert */
|
case IConfig::TlsCertKey: /* --tls-cert */
|
||||||
return set(doc, BaseConfig::kTls, TlsConfig::kCert, arg);
|
return set(doc, BaseConfig::kTls, TlsConfig::kCert, arg);
|
||||||
|
@ -248,6 +251,7 @@ void xmrig::BaseTransform::transform(rapidjson::Document &doc, int key, const ch
|
||||||
|
|
||||||
case IConfig::ColorKey: /* --no-color */
|
case IConfig::ColorKey: /* --no-color */
|
||||||
case IConfig::HttpRestrictedKey: /* --http-no-restricted */
|
case IConfig::HttpRestrictedKey: /* --http-no-restricted */
|
||||||
|
case IConfig::NoTitleKey: /* --no-title */
|
||||||
return transformBoolean(doc, key, false);
|
return transformBoolean(doc, key, false);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -298,6 +302,9 @@ void xmrig::BaseTransform::transformBoolean(rapidjson::Document &doc, int key, b
|
||||||
case IConfig::VerboseKey: /* --verbose */
|
case IConfig::VerboseKey: /* --verbose */
|
||||||
return set(doc, BaseConfig::kVerbose, enable);
|
return set(doc, BaseConfig::kVerbose, enable);
|
||||||
|
|
||||||
|
case IConfig::NoTitleKey: /* --no-title */
|
||||||
|
return set(doc, BaseConfig::kTitle, enable);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
58
src/base/kernel/config/Title.cpp
Normal file
58
src/base/kernel/config/Title.cpp
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "base/kernel/config/Title.h"
|
||||||
|
#include "3rdparty/rapidjson/document.h"
|
||||||
|
#include "base/io/Env.h"
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::Title::Title(const rapidjson::Value &value)
|
||||||
|
{
|
||||||
|
if (value.IsBool()) {
|
||||||
|
m_enabled = value.GetBool();
|
||||||
|
}
|
||||||
|
else if (value.IsString()) {
|
||||||
|
m_value = value.GetString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rapidjson::Value xmrig::Title::toJSON() const
|
||||||
|
{
|
||||||
|
if (isEnabled() && !m_value.isNull()) {
|
||||||
|
return m_value.toJSON();
|
||||||
|
}
|
||||||
|
|
||||||
|
return rapidjson::Value(m_enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
xmrig::String xmrig::Title::value() const
|
||||||
|
{
|
||||||
|
if (!isEnabled()) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_value.isNull()) {
|
||||||
|
return APP_NAME " " APP_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Env::expand(m_value);
|
||||||
|
}
|
50
src/base/kernel/config/Title.h
Normal file
50
src/base/kernel/config/Title.h
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMRIG_TITLE_H
|
||||||
|
#define XMRIG_TITLE_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "3rdparty/rapidjson/fwd.h"
|
||||||
|
#include "base/tools/String.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
class Title
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Title() = default;
|
||||||
|
Title(const rapidjson::Value &value);
|
||||||
|
|
||||||
|
inline bool isEnabled() const { return m_enabled; }
|
||||||
|
|
||||||
|
rapidjson::Value toJSON() const;
|
||||||
|
String value() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_enabled = true;
|
||||||
|
String m_value;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xmrig
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* XMRIG_TITLE_H */
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue