Skip to content

Commit f69a25b

Browse files
committed
~15% improvement to throughput in scan_hint::x86_64 test
1 parent 8e56752 commit f69a25b

File tree

3 files changed

+110
-26
lines changed

3 files changed

+110
-26
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ option(LIBHAT_MODULE_TARGET "Create target for the module interface" OFF)
2727
option(LIBHAT_USE_STD_MODULE "Compile the module target using the std module" OFF)
2828
option(LIBHAT_EXAMPLES "Include example targets" ${PROJECT_IS_TOP_LEVEL})
2929

30-
option(LIBHAT_HINT_X86_64 "Enables support for the x86_64 scan hint, requires a small (less than 1KB) data table" ON)
30+
option(LIBHAT_HINT_X86_64 "Enables support for the x86_64 scan hint, requires a small (2KB) data table" ON)
3131

3232
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
3333
# Just assume that the compiler accepts the required x86/x64 options if it'll accept -mmmx

src/Scanner.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,16 @@ namespace hat::detail {
1717
if (x86_64 && !pair0 && scanner.vectorSize && this->alignment == hat::scan_alignment::X1) {
1818
static constexpr auto getScore = [](const std::byte a, const std::byte b) {
1919
constexpr auto& pairs = hat::detail::x86_64::pairs_x1;
20-
const auto it = std::ranges::find(pairs, std::pair{a, b});
21-
return static_cast<size_t>(it - pairs.begin());
20+
const std::pair pair{a, b};
21+
const auto it = std::ranges::lower_bound(pairs, pair);
22+
const auto index = static_cast<uint16_t>(it - pairs.begin());
23+
if (it != pairs.end() && *it == pair) {
24+
return hat::detail::x86_64::scores_x1[index];
25+
}
26+
return index;
2227
};
2328

24-
std::optional<std::pair<size_t, size_t>> bestPair{};
29+
std::optional<std::pair<size_t, uint16_t>> bestPair{};
2530
for (auto it = this->signature.begin(); it != std::prev(this->signature.end()); it++) {
2631
const auto i = static_cast<size_t>(it - this->signature.begin());
2732
auto& a = *it;

src/arch/x86/Frequency.hpp

Lines changed: 101 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,107 @@ namespace hat::detail::x86_64 {
66
return std::pair{std::byte{a}, std::byte{b}};
77
}
88

9-
// Top 100 byte pair occurrences on 1 byte alignment
10-
// Accounts for ~39.7% of all pairs
9+
// Top 512 byte pair occurrences on 1 byte alignment, sorted. Sourced from multiple executables compiled for
10+
// Windows using MSVC, ranging from versions 19.16 to 19.42. This list accounts for ~60.4% of all byte pairs.
1111
static constexpr inline std::array pairs_x1{
12-
p(0x00, 0x00), p(0x48, 0x8B), p(0xCC, 0xCC), p(0x48, 0x8D), p(0x48, 0x89),
13-
p(0x00, 0x48), p(0x48, 0x83), p(0x44, 0x24), p(0x01, 0x00), p(0x49, 0x8B),
14-
p(0x48, 0x85), p(0x4C, 0x24), p(0xFF, 0xFF), p(0x0F, 0x11), p(0x4C, 0x8B),
15-
p(0x08, 0x48), p(0x24, 0x20), p(0x5C, 0x24), p(0x01, 0x48), p(0xFF, 0x48),
16-
p(0x4C, 0x89), p(0x4C, 0x8D), p(0xCC, 0x48), p(0xFF, 0x15), p(0x10, 0x48),
17-
p(0x24, 0x30), p(0x03, 0x48), p(0x89, 0x44), p(0x00, 0xE8), p(0x90, 0x48),
18-
p(0x8D, 0x05), p(0x83, 0xC4), p(0xC3, 0xCC), p(0x20, 0x48), p(0x0F, 0x57),
19-
p(0x30, 0x48), p(0x02, 0x00), p(0xF3, 0x0F), p(0x00, 0x0F), p(0x54, 0x24),
20-
p(0x85, 0xC9), p(0xC0, 0x0F), p(0x48, 0xC7), p(0x48, 0x81), p(0x85, 0xC0),
21-
p(0x74, 0x24), p(0x02, 0x48), p(0x89, 0x5C), p(0x0F, 0x10), p(0x83, 0xEC),
22-
p(0xC9, 0x74), p(0x8D, 0x4D), p(0x24, 0x40), p(0x57, 0xC0), p(0x24, 0x28),
23-
p(0x8D, 0x4C), p(0x24, 0x38), p(0x00, 0x4C), p(0x8B, 0xCB), p(0x38, 0x48),
24-
p(0x48, 0x3B), p(0xF8, 0x48), p(0x8D, 0x0D), p(0xC0, 0x48), p(0x04, 0x48),
25-
p(0x0F, 0x84), p(0x03, 0x00), p(0x00, 0x49), p(0xC3, 0x48), p(0x8B, 0xCF),
26-
p(0xC0, 0x74), p(0x89, 0x45), p(0x57, 0x48), p(0x40, 0x48), p(0x48, 0x33),
27-
p(0x24, 0x48), p(0x24, 0x50), p(0x0F, 0xB6), p(0x8D, 0x15), p(0x18, 0x48),
28-
p(0x28, 0x48), p(0x0F, 0x7F), p(0x7C, 0x24), p(0x8D, 0x54), p(0x8B, 0x40),
29-
p(0x8B, 0xC8), p(0x8B, 0x01), p(0x8D, 0x8D), p(0xC1, 0x48), p(0x8B, 0x5C),
30-
p(0xFE, 0x48), p(0x89, 0x74), p(0xC7, 0x44), p(0x66, 0x0F), p(0x83, 0xF8),
31-
p(0xCB, 0xE8), p(0x24, 0x60), p(0xCC, 0xE8), p(0xC4, 0x20), p(0x8B, 0x4D),
12+
p(0x00, 0x00), p(0x00, 0x01), p(0x00, 0x0F), p(0x00, 0x10), p(0x00, 0x33), p(0x00, 0x41), p(0x00, 0x44), p(0x00, 0x45),
13+
p(0x00, 0x48), p(0x00, 0x49), p(0x00, 0x4C), p(0x00, 0x4D), p(0x00, 0x66), p(0x00, 0x72), p(0x00, 0x74), p(0x00, 0x75),
14+
p(0x00, 0x80), p(0x00, 0x89), p(0x00, 0x8B), p(0x00, 0x90), p(0x00, 0xC6), p(0x00, 0xC7), p(0x00, 0xE8), p(0x00, 0xE9),
15+
p(0x00, 0xEB), p(0x00, 0xF3), p(0x00, 0xFF), p(0x01, 0x00), p(0x01, 0x0F), p(0x01, 0x48), p(0x01, 0x4C), p(0x01, 0x74),
16+
p(0x01, 0x75), p(0x01, 0xBA), p(0x02, 0x00), p(0x02, 0x48), p(0x03, 0x00), p(0x03, 0x48), p(0x03, 0x4C), p(0x04, 0x00),
17+
p(0x04, 0x48), p(0x05, 0x00), p(0x05, 0x48), p(0x05, 0xE8), p(0x06, 0x00), p(0x06, 0x48), p(0x07, 0x00), p(0x07, 0x48),
18+
p(0x07, 0xFF), p(0x08, 0x00), p(0x08, 0x01), p(0x08, 0x0F), p(0x08, 0x48), p(0x08, 0x49), p(0x08, 0x4C), p(0x08, 0x83),
19+
p(0x08, 0xE8), p(0x08, 0xFF), p(0x09, 0x00), p(0x09, 0x48), p(0x0A, 0x00), p(0x0B, 0x48), p(0x0C, 0x00), p(0x0C, 0x48),
20+
p(0x0C, 0x83), p(0x0F, 0x00), p(0x0F, 0x10), p(0x0F, 0x11), p(0x0F, 0x1F), p(0x0F, 0x28), p(0x0F, 0x29), p(0x0F, 0x48),
21+
p(0x0F, 0x57), p(0x0F, 0x58), p(0x0F, 0x59), p(0x0F, 0x6F), p(0x0F, 0x76), p(0x0F, 0x7F), p(0x0F, 0x84), p(0x0F, 0x85),
22+
p(0x0F, 0x87), p(0x0F, 0x95), p(0x0F, 0xAF), p(0x0F, 0xB6), p(0x0F, 0xB7), p(0x0F, 0xC1), p(0x10, 0x00), p(0x10, 0x01),
23+
p(0x10, 0x05), p(0x10, 0x0F), p(0x10, 0x44), p(0x10, 0x48), p(0x10, 0x49), p(0x10, 0x4C), p(0x10, 0x72), p(0x10, 0xE8),
24+
p(0x11, 0x00), p(0x11, 0x44), p(0x11, 0x45), p(0x11, 0x48), p(0x13, 0x48), p(0x18, 0x0F), p(0x18, 0x48), p(0x18, 0x49),
25+
p(0x19, 0x48), p(0x1C, 0x48), p(0x1F, 0x76), p(0x20, 0x00), p(0x20, 0x01), p(0x20, 0x0F), p(0x20, 0x41), p(0x20, 0x48),
26+
p(0x20, 0x49), p(0x20, 0x4C), p(0x20, 0x5B), p(0x20, 0x5F), p(0x20, 0xE8), p(0x20, 0xFF), p(0x24, 0x08), p(0x24, 0x10),
27+
p(0x24, 0x18), p(0x24, 0x20), p(0x24, 0x28), p(0x24, 0x30), p(0x24, 0x38), p(0x24, 0x40), p(0x24, 0x48), p(0x24, 0x50),
28+
p(0x24, 0x58), p(0x24, 0x60), p(0x24, 0x68), p(0x24, 0x70), p(0x24, 0x78), p(0x24, 0x80), p(0x27, 0x48), p(0x28, 0x00),
29+
p(0x28, 0x48), p(0x28, 0x49), p(0x28, 0x4C), p(0x28, 0xE8), p(0x2B, 0x48), p(0x2B, 0xC1), p(0x2B, 0xC8), p(0x30, 0x0F),
30+
p(0x30, 0x48), p(0x30, 0x49), p(0x30, 0x4C), p(0x30, 0xE8), p(0x33, 0xC0), p(0x33, 0xC4), p(0x33, 0xC9), p(0x33, 0xCC),
31+
p(0x33, 0xD2), p(0x33, 0xF6), p(0x38, 0x00), p(0x38, 0x48), p(0x3B, 0xCA), p(0x40, 0x00), p(0x40, 0x08), p(0x40, 0x0F),
32+
p(0x40, 0x10), p(0x40, 0x20), p(0x40, 0x48), p(0x40, 0x53), p(0x40, 0x88), p(0x40, 0xE8), p(0x41, 0x08), p(0x41, 0x0F),
33+
p(0x41, 0x10), p(0x41, 0x54), p(0x41, 0x55), p(0x41, 0x56), p(0x41, 0x57), p(0x41, 0x5C), p(0x41, 0x5D), p(0x41, 0x5E),
34+
p(0x41, 0x5F), p(0x41, 0x8B), p(0x41, 0xB8), p(0x41, 0xF8), p(0x42, 0x08), p(0x43, 0x08), p(0x43, 0x0C), p(0x43, 0x10),
35+
p(0x43, 0x18), p(0x44, 0x0F), p(0x44, 0x24), p(0x44, 0x88), p(0x44, 0x89), p(0x44, 0x8B), p(0x44, 0x8D), p(0x45, 0x0F),
36+
p(0x45, 0x33), p(0x46, 0x08), p(0x47, 0x08), p(0x47, 0x10), p(0x48, 0x03), p(0x48, 0x0F), p(0x48, 0x2B), p(0x48, 0x33),
37+
p(0x48, 0x3B), p(0x48, 0x48), p(0x48, 0x81), p(0x48, 0x83), p(0x48, 0x85), p(0x48, 0x89), p(0x48, 0x8B), p(0x48, 0x8D),
38+
p(0x48, 0xB8), p(0x48, 0xC1), p(0x48, 0xC7), p(0x48, 0xFF), p(0x49, 0x0F), p(0x49, 0x2B), p(0x49, 0x3B), p(0x49, 0x83),
39+
p(0x49, 0x89), p(0x49, 0x8B), p(0x49, 0x8D), p(0x49, 0xF8), p(0x4B, 0x08), p(0x4C, 0x24), p(0x4C, 0x3B), p(0x4C, 0x89),
40+
p(0x4C, 0x8B), p(0x4C, 0x8D), p(0x4D, 0x85), p(0x4D, 0x89), p(0x4D, 0x8B), p(0x50, 0x08), p(0x50, 0x48), p(0x53, 0x48),
41+
p(0x54, 0x24), p(0x54, 0x41), p(0x55, 0x41), p(0x55, 0x48), p(0x55, 0x56), p(0x56, 0x41), p(0x56, 0x48), p(0x56, 0x57),
42+
p(0x57, 0x41), p(0x57, 0x48), p(0x57, 0xC0), p(0x57, 0xC9), p(0x58, 0x00), p(0x58, 0x48), p(0x5B, 0xC3), p(0x5C, 0x24),
43+
p(0x5C, 0x5F), p(0x5D, 0x41), p(0x5D, 0xC3), p(0x5E, 0x41), p(0x5E, 0x5D), p(0x5E, 0x5F), p(0x5F, 0x41), p(0x5F, 0x5E),
44+
p(0x5F, 0xC3), p(0x60, 0x48), p(0x64, 0x24), p(0x66, 0x0F), p(0x66, 0x89), p(0x68, 0x48), p(0x6C, 0x24), p(0x70, 0x48),
45+
p(0x72, 0x1C), p(0x74, 0x05), p(0x74, 0x24), p(0x75, 0x10), p(0x76, 0x07), p(0x78, 0x48), p(0x7C, 0x24), p(0x7F, 0x44),
46+
p(0x7F, 0x45), p(0x80, 0x00), p(0x80, 0x48), p(0x81, 0xC4), p(0x81, 0xEC), p(0x81, 0xFA), p(0x83, 0xC0), p(0x83, 0xC1),
47+
p(0x83, 0xC2), p(0x83, 0xC4), p(0x83, 0xEC), p(0x83, 0xF8), p(0x83, 0xFA), p(0x83, 0xFF), p(0x84, 0x00), p(0x84, 0x24),
48+
p(0x84, 0xC0), p(0x85, 0xC0), p(0x85, 0xC9), p(0x85, 0xD2), p(0x85, 0xDB), p(0x85, 0xF6), p(0x85, 0xFF), p(0x88, 0x00),
49+
p(0x89, 0x01), p(0x89, 0x02), p(0x89, 0x03), p(0x89, 0x05), p(0x89, 0x41), p(0x89, 0x42), p(0x89, 0x43), p(0x89, 0x44),
50+
p(0x89, 0x45), p(0x89, 0x46), p(0x89, 0x47), p(0x89, 0x4C), p(0x89, 0x4D), p(0x89, 0x54), p(0x89, 0x5C), p(0x89, 0x5D),
51+
p(0x89, 0x6B), p(0x89, 0x6C), p(0x89, 0x73), p(0x89, 0x74), p(0x89, 0x75), p(0x89, 0x7C), p(0x89, 0x7D), p(0x89, 0x84),
52+
p(0x89, 0x85), p(0x8B, 0x00), p(0x8B, 0x01), p(0x8B, 0x03), p(0x8B, 0x04), p(0x8B, 0x05), p(0x8B, 0x06), p(0x8B, 0x07),
53+
p(0x8B, 0x08), p(0x8B, 0x0D), p(0x8B, 0x40), p(0x8B, 0x41), p(0x8B, 0x42), p(0x8B, 0x43), p(0x8B, 0x44), p(0x8B, 0x45),
54+
p(0x8B, 0x46), p(0x8B, 0x47), p(0x8B, 0x48), p(0x8B, 0x49), p(0x8B, 0x4B), p(0x8B, 0x4C), p(0x8B, 0x4D), p(0x8B, 0x4E),
55+
p(0x8B, 0x4F), p(0x8B, 0x54), p(0x8B, 0x55), p(0x8B, 0x5B), p(0x8B, 0x5C), p(0x8B, 0x5D), p(0x8B, 0x73), p(0x8B, 0x74),
56+
p(0x8B, 0x7C), p(0x8B, 0x80), p(0x8B, 0x85), p(0x8B, 0x8C), p(0x8B, 0x8D), p(0x8B, 0x9C), p(0x8B, 0xC0), p(0x8B, 0xC1),
57+
p(0x8B, 0xC2), p(0x8B, 0xC3), p(0x8B, 0xC6), p(0x8B, 0xC7), p(0x8B, 0xC8), p(0x8B, 0xCB), p(0x8B, 0xCD), p(0x8B, 0xCE),
58+
p(0x8B, 0xCF), p(0x8B, 0xD0), p(0x8B, 0xD3), p(0x8B, 0xD6), p(0x8B, 0xD7), p(0x8B, 0xD8), p(0x8B, 0xD9), p(0x8B, 0xDA),
59+
p(0x8B, 0xE3), p(0x8B, 0xEA), p(0x8B, 0xF0), p(0x8B, 0xF1), p(0x8B, 0xF2), p(0x8B, 0xF8), p(0x8B, 0xF9), p(0x8B, 0xFA),
60+
p(0x8C, 0x24), p(0x8D, 0x05), p(0x8D, 0x0D), p(0x8D, 0x15), p(0x8D, 0x41), p(0x8D, 0x44), p(0x8D, 0x45), p(0x8D, 0x4B),
61+
p(0x8D, 0x4C), p(0x8D, 0x4D), p(0x8D, 0x4F), p(0x8D, 0x54), p(0x8D, 0x55), p(0x8D, 0x85), p(0x8D, 0x8A), p(0x8D, 0x8D),
62+
p(0x8D, 0x95), p(0x8D, 0x9C), p(0x90, 0x00), p(0x90, 0x48), p(0x90, 0x4C), p(0x95, 0xC2), p(0x98, 0x00), p(0x9C, 0x24),
63+
p(0xA0, 0x00), p(0xA8, 0x00), p(0xAA, 0xAA), p(0xB0, 0x00), p(0xB0, 0x01), p(0xB8, 0x00), p(0xC0, 0x00), p(0xC0, 0x0F),
64+
p(0xC0, 0x48), p(0xC0, 0x74), p(0xC0, 0x75), p(0xC0, 0xF3), p(0xC0, 0xF8), p(0xC1, 0x43), p(0xC1, 0x48), p(0xC1, 0xE8),
65+
p(0xC1, 0xF8), p(0xC2, 0x27), p(0xC2, 0x48), p(0xC3, 0x48), p(0xC3, 0xCC), p(0xC3, 0xE8), p(0xC4, 0x20), p(0xC4, 0x28),
66+
p(0xC4, 0x30), p(0xC4, 0x48), p(0xC6, 0x44), p(0xC6, 0x45), p(0xC6, 0x48), p(0xC6, 0xF0), p(0xC7, 0x43), p(0xC7, 0x44),
67+
p(0xC7, 0x45), p(0xC7, 0x48), p(0xC7, 0x85), p(0xC7, 0xF0), p(0xC8, 0x00), p(0xC8, 0x48), p(0xC8, 0xE8), p(0xC9, 0x0F),
68+
p(0xC9, 0x48), p(0xC9, 0x74), p(0xC9, 0xF3), p(0xCB, 0x48), p(0xCB, 0xE8), p(0xCB, 0xFF), p(0xCC, 0x40), p(0xCC, 0x48),
69+
p(0xCC, 0xCC), p(0xCC, 0xE8), p(0xCE, 0x48), p(0xCE, 0xE8), p(0xCF, 0x48), p(0xCF, 0xE8), p(0xD0, 0x00), p(0xD0, 0x48),
70+
p(0xD2, 0x48), p(0xD3, 0x48), p(0xD6, 0x48), p(0xD7, 0x48), p(0xD8, 0x00), p(0xD8, 0x48), p(0xD9, 0x48), p(0xDA, 0x48),
71+
p(0xDB, 0x74), p(0xE0, 0x00), p(0xE0, 0x48), p(0xE8, 0x00), p(0xE8, 0x48), p(0xEB, 0x03), p(0xEC, 0x20), p(0xF0, 0x00),
72+
p(0xF0, 0x0F), p(0xF0, 0x48), p(0xF0, 0xFF), p(0xF2, 0x0F), p(0xF2, 0x48), p(0xF3, 0x0F), p(0xF8, 0x01), p(0xF8, 0x1F),
73+
p(0xF8, 0x48), p(0xF9, 0x48), p(0xFA, 0x00), p(0xFA, 0x0F), p(0xFA, 0x10), p(0xFA, 0x48), p(0xFB, 0x48), p(0xFC, 0x48),
74+
p(0xFD, 0x48), p(0xFD, 0x90), p(0xFD, 0xFF), p(0xFE, 0x48), p(0xFE, 0x90), p(0xFE, 0xFF), p(0xFF, 0x0F), p(0xFF, 0x15),
75+
p(0xFF, 0x48), p(0xFF, 0x4C), p(0xFF, 0x50), p(0xFF, 0x74), p(0xFF, 0x90), p(0xFF, 0xC2), p(0xFF, 0xCC), p(0xFF, 0xFF),
3276
};
77+
78+
static constexpr inline std::array scores_x1 = std::to_array<uint16_t>({
79+
0x000, 0x0C0, 0x028, 0x084, 0x1C5, 0x083, 0x11B, 0x1E3, 0x005, 0x042, 0x02F, 0x18B, 0x146, 0x08B, 0x0F6, 0x137,
80+
0x15B, 0x1DC, 0x10B, 0x0BD, 0x0D6, 0x129, 0x01D, 0x0C1, 0x111, 0x182, 0x065, 0x008, 0x11E, 0x016, 0x1CB, 0x17E,
81+
0x051, 0x1F9, 0x021, 0x034, 0x03E, 0x014, 0x1DB, 0x07C, 0x05B, 0x0C4, 0x0B7, 0x159, 0x0FA, 0x0A2, 0x102, 0x06D,
82+
0x0E9, 0x0DE, 0x1A1, 0x197, 0x012, 0x132, 0x141, 0x0E1, 0x1C0, 0x0A3, 0x1C6, 0x19C, 0x1AD, 0x18F, 0x1C3, 0x1D3,
83+
0x0CA, 0x087, 0x024, 0x00D, 0x0D1, 0x08E, 0x126, 0x134, 0x033, 0x1D0, 0x1A7, 0x181, 0x106, 0x056, 0x038, 0x0DD,
84+
0x1DD, 0x19F, 0x13D, 0x046, 0x10F, 0x05A, 0x053, 0x1DE, 0x1D1, 0x135, 0x1E4, 0x015, 0x144, 0x123, 0x101, 0x1E6,
85+
0x1EF, 0x0D4, 0x0B8, 0x160, 0x1CE, 0x15D, 0x044, 0x1FD, 0x1FF, 0x0CE, 0x0FD, 0x125, 0x194, 0x18A, 0x1CF, 0x01F,
86+
0x13F, 0x0C8, 0x18D, 0x127, 0x0F3, 0x1B3, 0x0BB, 0x0A4, 0x0A5, 0x011, 0x039, 0x01B, 0x045, 0x031, 0x052, 0x04B,
87+
0x079, 0x067, 0x0B2, 0x080, 0x0EF, 0x192, 0x08C, 0x1BA, 0x04F, 0x1EE, 0x1BF, 0x173, 0x1D4, 0x0B1, 0x1B9, 0x1F0,
88+
0x027, 0x1A0, 0x17C, 0x16B, 0x06C, 0x0D9, 0x171, 0x0D7, 0x131, 0x1A3, 0x1D5, 0x049, 0x190, 0x17F, 0x064, 0x1B0,
89+
0x195, 0x1A5, 0x047, 0x12B, 0x19E, 0x1F3, 0x0DC, 0x05D, 0x172, 0x175, 0x1E0, 0x0C5, 0x115, 0x170, 0x1D7, 0x0BE,
90+
0x10E, 0x0AA, 0x0C6, 0x183, 0x12E, 0x0B3, 0x1A2, 0x138, 0x1C9, 0x0E5, 0x007, 0x1BC, 0x0DB, 0x0F4, 0x1A6, 0x1D2,
91+
0x081, 0x19A, 0x136, 0x1AF, 0x14C, 0x076, 0x060, 0x050, 0x030, 0x07E, 0x020, 0x006, 0x00B, 0x003, 0x001, 0x004,
92+
0x1E7, 0x075, 0x02B, 0x072, 0x1EC, 0x13A, 0x0D8, 0x15A, 0x091, 0x009, 0x0E4, 0x0EB, 0x1F7, 0x00F, 0x199, 0x010,
93+
0x00C, 0x018, 0x14E, 0x1BD, 0x073, 0x1BE, 0x068, 0x152, 0x026, 0x177, 0x1A4, 0x1BB, 0x153, 0x113, 0x1FA, 0x0E8,
94+
0x0F0, 0x054, 0x04C, 0x179, 0x1FE, 0x0AE, 0x0E3, 0x013, 0x1AC, 0x1F5, 0x0C2, 0x178, 0x140, 0x1D8, 0x114, 0x0E0,
95+
0x07B, 0x09C, 0x1EB, 0x04D, 0x154, 0x0D5, 0x082, 0x0BF, 0x0F2, 0x16E, 0x02E, 0x158, 0x0FF, 0x12F, 0x05E, 0x16C,
96+
0x163, 0x07F, 0x1C1, 0x11A, 0x0B9, 0x09A, 0x08D, 0x128, 0x08A, 0x02C, 0x03B, 0x023, 0x0BC, 0x1EA, 0x1B5, 0x098,
97+
0x097, 0x02A, 0x032, 0x16A, 0x092, 0x1D6, 0x13C, 0x104, 0x1B6, 0x1B1, 0x17B, 0x1C8, 0x10D, 0x148, 0x0B4, 0x01A,
98+
0x03F, 0x1ED, 0x0EC, 0x0A9, 0x168, 0x119, 0x035, 0x180, 0x1AA, 0x105, 0x1FC, 0x061, 0x0ED, 0x0AD, 0x0FC, 0x11C,
99+
0x0E7, 0x071, 0x04E, 0x077, 0x116, 0x07A, 0x143, 0x0FB, 0x11F, 0x1DA, 0x03C, 0x0A1, 0x12A, 0x120, 0x0D0, 0x0AC,
100+
0x15E, 0x145, 0x112, 0x09F, 0x155, 0x089, 0x06E, 0x1E2, 0x19D, 0x164, 0x0F9, 0x13B, 0x063, 0x196, 0x1B8, 0x0E6,
101+
0x1CC, 0x198, 0x1F6, 0x166, 0x122, 0x107, 0x13E, 0x095, 0x10C, 0x06F, 0x088, 0x05F, 0x057, 0x025, 0x1CA, 0x06A,
102+
0x040, 0x0B5, 0x0F5, 0x0F8, 0x109, 0x0A6, 0x0CF, 0x147, 0x185, 0x1E8, 0x110, 0x12C, 0x169, 0x103, 0x0D3, 0x167,
103+
0x0DA, 0x01E, 0x043, 0x066, 0x189, 0x093, 0x099, 0x130, 0x048, 0x037, 0x191, 0x059, 0x07D, 0x19B, 0x16F, 0x062,
104+
0x139, 0x1E5, 0x0C7, 0x01C, 0x1B2, 0x1E9, 0x142, 0x09D, 0x0E2, 0x162, 0x1CD, 0x0F7, 0x1B7, 0x12D, 0x0F1, 0x036,
105+
0x03A, 0x04A, 0x0EA, 0x184, 0x0CB, 0x0FE, 0x03D, 0x1A9, 0x187, 0x0A0, 0x070, 0x055, 0x02D, 0x1FB, 0x078, 0x1F4,
106+
0x188, 0x0B0, 0x118, 0x150, 0x10A, 0x1AE, 0x1AB, 0x069, 0x0AF, 0x0A7, 0x1C2, 0x121, 0x17A, 0x09B, 0x0CD, 0x16D,
107+
0x1F1, 0x041, 0x1DF, 0x094, 0x074, 0x1F8, 0x0CC, 0x019, 0x002, 0x05C, 0x1A8, 0x0C9, 0x100, 0x086, 0x14F, 0x090,
108+
0x1F2, 0x149, 0x165, 0x117, 0x1E1, 0x0A8, 0x133, 0x18E, 0x0B6, 0x15C, 0x157, 0x1C7, 0x15F, 0x193, 0x0AB, 0x17D,
109+
0x058, 0x0EE, 0x124, 0x0C3, 0x186, 0x022, 0x06B, 0x09E, 0x029, 0x14D, 0x096, 0x161, 0x1D9, 0x156, 0x176, 0x108,
110+
0x0BA, 0x1B4, 0x1C4, 0x08F, 0x14B, 0x0DF, 0x11D, 0x00E, 0x017, 0x151, 0x174, 0x14A, 0x085, 0x0D2, 0x18C, 0x00A,
111+
});
33112
}

0 commit comments

Comments
 (0)