Coverage Report

Created: 2024-10-29 12:10

/root/bitcoin/src/util/strencodings.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) 2009-2010 Satoshi Nakamoto
2
// Copyright (c) 2009-2022 The Bitcoin Core developers
3
// Distributed under the MIT software license, see the accompanying
4
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6
/**
7
 * Utilities for converting data from/to strings.
8
 */
9
#ifndef BITCOIN_UTIL_STRENCODINGS_H
10
#define BITCOIN_UTIL_STRENCODINGS_H
11
12
#include <crypto/hex_base.h> // IWYU pragma: export
13
#include <span.h>
14
#include <util/string.h>
15
16
#include <array>
17
#include <bit>
18
#include <charconv>
19
#include <cstddef>
20
#include <cstdint>
21
#include <limits>
22
#include <optional>
23
#include <string>      // IWYU pragma: export
24
#include <string_view> // IWYU pragma: export
25
#include <system_error>
26
#include <type_traits>
27
#include <vector>
28
29
/** Used by SanitizeString() */
30
enum SafeChars
31
{
32
    SAFE_CHARS_DEFAULT, //!< The full set of allowed chars
33
    SAFE_CHARS_UA_COMMENT, //!< BIP-0014 subset
34
    SAFE_CHARS_FILENAME, //!< Chars allowed in filenames
35
    SAFE_CHARS_URI, //!< Chars allowed in URIs (RFC 3986)
36
};
37
38
/**
39
 * Used by ParseByteUnits()
40
 * Lowercase base 1000
41
 * Uppercase base 1024
42
*/
43
enum class ByteUnit : uint64_t {
44
    NOOP = 1ULL,
45
    k = 1000ULL,
46
    K = 1024ULL,
47
    m = 1'000'000ULL,
48
    M = 1ULL << 20,
49
    g = 1'000'000'000ULL,
50
    G = 1ULL << 30,
51
    t = 1'000'000'000'000ULL,
52
    T = 1ULL << 40,
53
};
54
55
/**
56
* Remove unsafe chars. Safe chars chosen to allow simple messages/URLs/email
57
* addresses, but avoid anything even possibly remotely dangerous like & or >
58
* @param[in] str    The string to sanitize
59
* @param[in] rule   The set of safe chars to choose (default: least restrictive)
60
* @return           A new string without unsafe chars
61
*/
62
std::string SanitizeString(std::string_view str, int rule = SAFE_CHARS_DEFAULT);
63
/** Parse the hex string into bytes (uint8_t or std::byte). Ignores whitespace. Returns nullopt on invalid input. */
64
template <typename Byte = std::byte>
65
std::optional<std::vector<Byte>> TryParseHex(std::string_view str);
66
/** Like TryParseHex, but returns an empty vector on invalid input. */
67
template <typename Byte = uint8_t>
68
std::vector<Byte> ParseHex(std::string_view hex_str)
69
0
{
70
0
    return TryParseHex<Byte>(hex_str).value_or(std::vector<Byte>{});
71
0
}
Unexecuted instantiation: _Z8ParseHexIhESt6vectorIT_SaIS1_EESt17basic_string_viewIcSt11char_traitsIcEE
Unexecuted instantiation: _Z8ParseHexISt4byteESt6vectorIT_SaIS2_EESt17basic_string_viewIcSt11char_traitsIcEE
72
/* Returns true if each character in str is a hex character, and has an even
73
 * number of hex digits.*/
74
bool IsHex(std::string_view str);
75
std::optional<std::vector<unsigned char>> DecodeBase64(std::string_view str);
76
std::string EncodeBase64(Span<const unsigned char> input);
77
0
inline std::string EncodeBase64(Span<const std::byte> input) { return EncodeBase64(MakeUCharSpan(input)); }
78
0
inline std::string EncodeBase64(std::string_view str) { return EncodeBase64(MakeUCharSpan(str)); }
79
std::optional<std::vector<unsigned char>> DecodeBase32(std::string_view str);
80
81
/**
82
 * Base32 encode.
83
 * If `pad` is true, then the output will be padded with '=' so that its length
84
 * is a multiple of 8.
85
 */
86
std::string EncodeBase32(Span<const unsigned char> input, bool pad = true);
87
88
/**
89
 * Base32 encode.
90
 * If `pad` is true, then the output will be padded with '=' so that its length
91
 * is a multiple of 8.
92
 */
93
std::string EncodeBase32(std::string_view str, bool pad = true);
94
95
/**
96
 * Splits socket address string into host string and port value.
97
 * Validates port value.
98
 *
99
 * @param[in] in        The socket address string to split.
100
 * @param[out] portOut  Port-portion of the input, if found and parsable.
101
 * @param[out] hostOut  Host-portion of the input, if found.
102
 * @return              true if port-portion is absent or within its allowed range, otherwise false
103
 */
104
bool SplitHostPort(std::string_view in, uint16_t& portOut, std::string& hostOut);
105
106
// LocaleIndependentAtoi is provided for backwards compatibility reasons.
107
//
108
// New code should use ToIntegral or the ParseInt* functions
109
// which provide parse error feedback.
110
//
111
// The goal of LocaleIndependentAtoi is to replicate the defined behaviour of
112
// std::atoi as it behaves under the "C" locale, and remove some undefined
113
// behavior. If the parsed value is bigger than the integer type's maximum
114
// value, or smaller than the integer type's minimum value, std::atoi has
115
// undefined behavior, while this function returns the maximum or minimum
116
// values, respectively.
117
template <typename T>
118
T LocaleIndependentAtoi(std::string_view str)
119
0
{
120
0
    static_assert(std::is_integral<T>::value);
121
0
    T result;
122
    // Emulate atoi(...) handling of white space and leading +/-.
123
0
    std::string_view s = util::TrimStringView(str);
124
0
    if (!s.empty() && s[0] == '+') {
125
0
        if (s.length() >= 2 && s[1] == '-') {
126
0
            return 0;
127
0
        }
128
0
        s = s.substr(1);
129
0
    }
130
0
    auto [_, error_condition] = std::from_chars(s.data(), s.data() + s.size(), result);
131
0
    if (error_condition == std::errc::result_out_of_range) {
132
0
        if (s.length() >= 1 && s[0] == '-') {
133
            // Saturate underflow, per strtoll's behavior.
134
0
            return std::numeric_limits<T>::min();
135
0
        } else {
136
            // Saturate overflow, per strtoll's behavior.
137
0
            return std::numeric_limits<T>::max();
138
0
        }
139
0
    } else if (error_condition != std::errc{}) {
140
0
        return 0;
141
0
    }
142
0
    return result;
143
0
}
Unexecuted instantiation: _Z21LocaleIndependentAtoiIiET_St17basic_string_viewIcSt11char_traitsIcEE
Unexecuted instantiation: _Z21LocaleIndependentAtoiIlET_St17basic_string_viewIcSt11char_traitsIcEE
144
145
/**
146
 * Tests if the given character is a decimal digit.
147
 * @param[in] c     character to test
148
 * @return          true if the argument is a decimal digit; otherwise false.
149
 */
150
constexpr bool IsDigit(char c)
151
0
{
152
0
    return c >= '0' && c <= '9';
153
0
}
154
155
/**
156
 * Tests if the given character is a whitespace character. The whitespace characters
157
 * are: space, form-feed ('\f'), newline ('\n'), carriage return ('\r'), horizontal
158
 * tab ('\t'), and vertical tab ('\v').
159
 *
160
 * This function is locale independent. Under the C locale this function gives the
161
 * same result as std::isspace.
162
 *
163
 * @param[in] c     character to test
164
 * @return          true if the argument is a whitespace character; otherwise false
165
 */
166
0
constexpr inline bool IsSpace(char c) noexcept {
167
0
    return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v';
168
0
}
169
170
/**
171
 * Convert string to integral type T. Leading whitespace, a leading +, or any
172
 * trailing character fail the parsing. The required format expressed as regex
173
 * is `-?[0-9]+`. The minus sign is only permitted for signed integer types.
174
 *
175
 * @returns std::nullopt if the entire string could not be parsed, or if the
176
 *   parsed value is not in the range representable by the type T.
177
 */
178
template <typename T>
179
std::optional<T> ToIntegral(std::string_view str)
180
0
{
181
0
    static_assert(std::is_integral<T>::value);
182
0
    T result;
183
0
    const auto [first_nonmatching, error_condition] = std::from_chars(str.data(), str.data() + str.size(), result);
184
0
    if (first_nonmatching != str.data() + str.size() || error_condition != std::errc{}) {
185
0
        return std::nullopt;
186
0
    }
187
0
    return result;
188
0
}
Unexecuted instantiation: _Z10ToIntegralIlESt8optionalIT_ESt17basic_string_viewIcSt11char_traitsIcEE
Unexecuted instantiation: _Z10ToIntegralIiESt8optionalIT_ESt17basic_string_viewIcSt11char_traitsIcEE
Unexecuted instantiation: _Z10ToIntegralIhESt8optionalIT_ESt17basic_string_viewIcSt11char_traitsIcEE
Unexecuted instantiation: _Z10ToIntegralItESt8optionalIT_ESt17basic_string_viewIcSt11char_traitsIcEE
Unexecuted instantiation: _Z10ToIntegralIjESt8optionalIT_ESt17basic_string_viewIcSt11char_traitsIcEE
Unexecuted instantiation: _Z10ToIntegralImESt8optionalIT_ESt17basic_string_viewIcSt11char_traitsIcEE
189
190
/**
191
 * Convert string to signed 32-bit integer with strict parse error feedback.
192
 * @returns true if the entire string could be parsed as valid integer,
193
 *   false if not the entire string could be parsed or when overflow or underflow occurred.
194
 */
195
[[nodiscard]] bool ParseInt32(std::string_view str, int32_t *out);
196
197
/**
198
 * Convert string to signed 64-bit integer with strict parse error feedback.
199
 * @returns true if the entire string could be parsed as valid integer,
200
 *   false if not the entire string could be parsed or when overflow or underflow occurred.
201
 */
202
[[nodiscard]] bool ParseInt64(std::string_view str, int64_t *out);
203
204
/**
205
 * Convert decimal string to unsigned 8-bit integer with strict parse error feedback.
206
 * @returns true if the entire string could be parsed as valid integer,
207
 *   false if not the entire string could be parsed or when overflow or underflow occurred.
208
 */
209
[[nodiscard]] bool ParseUInt8(std::string_view str, uint8_t *out);
210
211
/**
212
 * Convert decimal string to unsigned 16-bit integer with strict parse error feedback.
213
 * @returns true if the entire string could be parsed as valid integer,
214
 *   false if the entire string could not be parsed or if overflow or underflow occurred.
215
 */
216
[[nodiscard]] bool ParseUInt16(std::string_view str, uint16_t* out);
217
218
/**
219
 * Convert decimal string to unsigned 32-bit integer with strict parse error feedback.
220
 * @returns true if the entire string could be parsed as valid integer,
221
 *   false if not the entire string could be parsed or when overflow or underflow occurred.
222
 */
223
[[nodiscard]] bool ParseUInt32(std::string_view str, uint32_t *out);
224
225
/**
226
 * Convert decimal string to unsigned 64-bit integer with strict parse error feedback.
227
 * @returns true if the entire string could be parsed as valid integer,
228
 *   false if not the entire string could be parsed or when overflow or underflow occurred.
229
 */
230
[[nodiscard]] bool ParseUInt64(std::string_view str, uint64_t *out);
231
232
/**
233
 * Format a paragraph of text to a fixed width, adding spaces for
234
 * indentation to any added line.
235
 */
236
std::string FormatParagraph(std::string_view in, size_t width = 79, size_t indent = 0);
237
238
/**
239
 * Timing-attack-resistant comparison.
240
 * Takes time proportional to length
241
 * of first argument.
242
 */
243
template <typename T>
244
bool TimingResistantEqual(const T& a, const T& b)
245
0
{
246
0
    if (b.size() == 0) return a.size() == 0;
247
0
    size_t accumulator = a.size() ^ b.size();
248
0
    for (size_t i = 0; i < a.size(); i++)
249
0
        accumulator |= size_t(a[i] ^ b[i%b.size()]);
250
0
    return accumulator == 0;
251
0
}
252
253
/** Parse number as fixed point according to JSON number syntax.
254
 * @returns true on success, false on error.
255
 * @note The result must be in the range (-10^18,10^18), otherwise an overflow error will trigger.
256
 */
257
[[nodiscard]] bool ParseFixedPoint(std::string_view, int decimals, int64_t *amount_out);
258
259
namespace {
260
/** Helper class for the default infn argument to ConvertBits (just returns the input). */
261
struct IntIdentity
262
{
263
0
    [[maybe_unused]] int operator()(int x) const { return x; }
Unexecuted instantiation: addition_overflow.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: addrman.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: asmap.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: asmap_direct.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: autofile.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: banman.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: base_encode_decode.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: bech32.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: bip324.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: bitdeque.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: bitset.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: block.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: block_header.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: block_index.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: blockfilter.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: bloom_filter.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: buffered_file.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: chain.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: checkqueue.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: cluster_linearize.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: coins_view.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: coinscache_sim.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: connman.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: crypto.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: crypto_aes256.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: crypto_aes256cbc.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: crypto_chacha20.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: crypto_chacha20poly1305.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: crypto_common.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: crypto_diff_fuzz_chacha20.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: crypto_hkdf_hmac_sha256_l32.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: crypto_poly1305.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: cuckoocache.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: decode_tx.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: descriptor_parse.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: deserialize.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: eval_script.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: feefrac.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: fee_rate.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: feeratediagram.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: fees.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: flatfile.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: float.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: golomb_rice.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: headerssync.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: hex.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: http_request.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: i2p.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: integer.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: key.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: key_io.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: kitchen_sink.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: load_external_block_file.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: locale.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: merkleblock.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: message.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: miniscript.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: minisketch.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: mini_miner.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: muhash.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: multiplication_overflow.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: net.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: net_permissions.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: netaddress.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: netbase_dns_lookup.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: node_eviction.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: p2p_handshake.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: p2p_headers_presync.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: p2p_transport_serialization.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: package_eval.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: parse_hd_keypath.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: parse_numbers.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: parse_script.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: parse_univalue.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: partially_downloaded_block.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: policy_estimator.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: policy_estimator_io.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: poolresource.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: pow.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: primitives_transaction.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: process_message.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: process_messages.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: protocol.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: psbt.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: random.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: rbf.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: rolling_bloom_filter.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: rpc.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: script.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: script_assets_test_minimizer.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: script_descriptor_cache.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: script_flags.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: script_format.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: script_interpreter.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: script_ops.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: script_sigcache.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: script_sign.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: scriptnum_ops.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: secp256k1_ec_seckey_import_export_der.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: secp256k1_ecdsa_signature_parse_der_lax.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: signature_checker.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: signet.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: socks5.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: span.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: string.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: strprintf.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: system.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: timeoffsets.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: torcontrol.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: transaction.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: txdownloadman.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: tx_in.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: tx_out.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: tx_pool.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: txorphan.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: txrequest.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: utxo_snapshot.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: utxo_total_supply.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: validation_load_mempool.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: vecdeque.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: versionbits.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: coincontrol.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: coinselection.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: crypter.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: notifications.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: parse_iso8601.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: scriptpubkeyman.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: spend.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: wallet_bdb_parser.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: descriptor.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: mempool.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: fuzz.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: util.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: addresstype.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: base58.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: chainparams.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: coins.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: bloom.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: messages.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: signmessage.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: compressor.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: core_read.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: core_write.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: deploymentinfo.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: netbase.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: outputtype.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: policy.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: request.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: sign.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: signingprovider.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: solver.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: bip32.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: bytevectorhash.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: hasher.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: moneystr.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: strencodings.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: dump.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: receive.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: wallet.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: walletdb.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: walletutil.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: sqlite.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: db.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: external_signer_scriptpubkeyman.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: interfaces.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: load.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: feebumper.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: addresses.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: backup.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: encrypt.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: transactions.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: mining.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: setup_common.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: transaction_utils.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: txmempool.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: validation.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: addrdb.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: blockencodings.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: tx_verify.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: dbwrapper.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: httpserver.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: init.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: checks.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: coinstats.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: context.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: mapport.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: net_processing.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: netgroup.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: blockmanager_args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: blockstorage.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: caches.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: chainstate.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: chainstatemanager_args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: coins_view_args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: eviction.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: kernel_notifications.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: mempool_args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: mempool_persist.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: mempool_persist_args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: miner.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: peerman_args.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: txdownloadman_impl.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: txreconciliation.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: packages.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: settings.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: rest.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: blockchain.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: node.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: output_script.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: rawtransaction.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: server.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: server_util.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: txoutproof.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: sigcache.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: txdb.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: txorphanage.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: validationinterface.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: httprpc.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: base.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: blockfilterindex.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: coinstatsindex.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: txindex.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: disconnected_transactions.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: coin.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: truc_policy.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: netif.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: pcp.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: external_signer.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: net_types.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: rawtransaction_util.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: arith_uint256.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: merkle.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: tx_check.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: hash.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: pubkey.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: interpreter.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: uint256.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
Unexecuted instantiation: siphash.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi
264
};
265
266
} // namespace
267
268
/** Convert from one power-of-2 number base to another. */
269
template<int frombits, int tobits, bool pad, typename O, typename It, typename I = IntIdentity>
270
0
bool ConvertBits(O outfn, It it, It end, I infn = {}) {
271
0
    size_t acc = 0;
272
0
    size_t bits = 0;
273
0
    constexpr size_t maxv = (1 << tobits) - 1;
274
0
    constexpr size_t max_acc = (1 << (frombits + tobits - 1)) - 1;
275
0
    while (it != end) {
276
0
        int v = infn(*it);
277
0
        if (v < 0) return false;
278
0
        acc = ((acc << frombits) | v) & max_acc;
279
0
        bits += frombits;
280
0
        while (bits >= tobits) {
281
0
            bits -= tobits;
282
0
            outfn((acc >> bits) & maxv);
283
0
        }
284
0
        ++it;
285
0
    }
286
0
    if (pad) {
287
0
        if (bits) outfn((acc << (tobits - bits)) & maxv);
288
0
    } else if (bits >= frombits || ((acc << (tobits - bits)) & maxv)) {
289
0
        return false;
290
0
    }
291
0
    return true;
292
0
}
Unexecuted instantiation: bech32.cpp:_Z11ConvertBitsILi8ELi5ELb1EZ18bech32_fuzz_targetSt4spanIKhLm18446744073709551615EEE3$_0N9__gnu_cxx17__normal_iteratorIPS1_S2_EEN12_GLOBAL__N_111IntIdentityEEbT2_T3_SB_T4_
Unexecuted instantiation: key_io.cpp:_Z11ConvertBitsILi8ELi5ELb1EZNK12_GLOBAL__N_118DestinationEncoderclB5cxx11ERK19WitnessV0ScriptHashEUlhE_PKhNS0_11IntIdentityEEbT2_T3_SA_T4_
Unexecuted instantiation: key_io.cpp:_Z11ConvertBitsILi8ELi5ELb1EZNK12_GLOBAL__N_118DestinationEncoderclB5cxx11ERK16WitnessV0KeyHashEUlhE_PKhNS0_11IntIdentityEEbT2_T3_SA_T4_
Unexecuted instantiation: key_io.cpp:_Z11ConvertBitsILi8ELi5ELb1EZNK12_GLOBAL__N_118DestinationEncoderclB5cxx11ERK16WitnessV1TaprootEUlhE_PKhNS0_11IntIdentityEEbT2_T3_SA_T4_
Unexecuted instantiation: key_io.cpp:_Z11ConvertBitsILi8ELi5ELb1EZNK12_GLOBAL__N_118DestinationEncoderclB5cxx11ERK14WitnessUnknownEUlhE_N9__gnu_cxx17__normal_iteratorIPKhSt6vectorIhSaIhEEEENS0_11IntIdentityEEbT2_T3_SG_T4_
Unexecuted instantiation: key_io.cpp:_Z11ConvertBitsILi5ELi8ELb0EZN12_GLOBAL__N_117DecodeDestinationERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK12CChainParamsRS6_PSt6vectorIiSaIiEEE3$_0N9__gnu_cxx17__normal_iteratorIPKhSD_IhSaIhEEEENS0_11IntIdentityEEbT2_T3_SR_T4_
Unexecuted instantiation: strencodings.cpp:_Z11ConvertBitsILi8ELi6ELb1EZ12EncodeBase64B5cxx114SpanIKhEE3$_0PS1_N12_GLOBAL__N_111IntIdentityEEbT2_T3_S8_T4_
Unexecuted instantiation: strencodings.cpp:_Z11ConvertBitsILi6ELi8ELb0EZ12DecodeBase64St17basic_string_viewIcSt11char_traitsIcEEE3$_0PKcZ12DecodeBase64S3_E3$_1EbT2_T3_S9_T4_
Unexecuted instantiation: strencodings.cpp:_Z11ConvertBitsILi8ELi5ELb1EZ12EncodeBase32B5cxx114SpanIKhEbE3$_0PS1_N12_GLOBAL__N_111IntIdentityEEbT2_T3_S8_T4_
Unexecuted instantiation: strencodings.cpp:_Z11ConvertBitsILi5ELi8ELb0EZ12DecodeBase32St17basic_string_viewIcSt11char_traitsIcEEE3$_0PKcZ12DecodeBase32S3_E3$_1EbT2_T3_S9_T4_
293
294
/**
295
 * Converts the given character to its lowercase equivalent.
296
 * This function is locale independent. It only converts uppercase
297
 * characters in the standard 7-bit ASCII range.
298
 * This is a feature, not a limitation.
299
 *
300
 * @param[in] c     the character to convert to lowercase.
301
 * @return          the lowercase equivalent of c; or the argument
302
 *                  if no conversion is possible.
303
 */
304
constexpr char ToLower(char c)
305
0
{
306
0
    return (c >= 'A' && c <= 'Z' ? (c - 'A') + 'a' : c);
307
0
}
308
309
/**
310
 * Returns the lowercase equivalent of the given string.
311
 * This function is locale independent. It only converts uppercase
312
 * characters in the standard 7-bit ASCII range.
313
 * This is a feature, not a limitation.
314
 *
315
 * @param[in] str   the string to convert to lowercase.
316
 * @returns         lowercased equivalent of str
317
 */
318
std::string ToLower(std::string_view str);
319
320
/**
321
 * Converts the given character to its uppercase equivalent.
322
 * This function is locale independent. It only converts lowercase
323
 * characters in the standard 7-bit ASCII range.
324
 * This is a feature, not a limitation.
325
 *
326
 * @param[in] c     the character to convert to uppercase.
327
 * @return          the uppercase equivalent of c; or the argument
328
 *                  if no conversion is possible.
329
 */
330
constexpr char ToUpper(char c)
331
0
{
332
0
    return (c >= 'a' && c <= 'z' ? (c - 'a') + 'A' : c);
333
0
}
334
335
/**
336
 * Returns the uppercase equivalent of the given string.
337
 * This function is locale independent. It only converts lowercase
338
 * characters in the standard 7-bit ASCII range.
339
 * This is a feature, not a limitation.
340
 *
341
 * @param[in] str   the string to convert to uppercase.
342
 * @returns         UPPERCASED EQUIVALENT OF str
343
 */
344
std::string ToUpper(std::string_view str);
345
346
/**
347
 * Capitalizes the first character of the given string.
348
 * This function is locale independent. It only converts lowercase
349
 * characters in the standard 7-bit ASCII range.
350
 * This is a feature, not a limitation.
351
 *
352
 * @param[in] str   the string to capitalize.
353
 * @returns         string with the first letter capitalized.
354
 */
355
std::string Capitalize(std::string str);
356
357
/**
358
 * Parse a string with suffix unit [k|K|m|M|g|G|t|T].
359
 * Must be a whole integer, fractions not allowed (0.5t), no whitespace or +-
360
 * Lowercase units are 1000 base. Uppercase units are 1024 base.
361
 * Examples: 2m,27M,19g,41T
362
 *
363
 * @param[in] str                  the string to convert into bytes
364
 * @param[in] default_multiplier   if no unit is found in str use this unit
365
 * @returns                        optional uint64_t bytes from str or nullopt
366
 *                                 if ToIntegral is false, str is empty, trailing whitespace or overflow
367
 */
368
std::optional<uint64_t> ParseByteUnits(std::string_view str, ByteUnit default_multiplier);
369
370
namespace util {
371
/** consteval version of HexDigit() without the lookup table. */
372
consteval uint8_t ConstevalHexDigit(const char c)
373
{
374
    if (c >= '0' && c <= '9') return c - '0';
375
    if (c >= 'a' && c <= 'f') return c - 'a' + 0xa;
376
377
    throw "Only lowercase hex digits are allowed, for consistency";
378
}
379
380
/**
381
 * ""_hex is a compile-time user-defined literal returning a
382
 * `std::array<std::byte>`, equivalent to ParseHex(). Variants provided:
383
 *
384
 * - ""_hex_v: Returns `std::vector<std::byte>`, useful for heap allocation or
385
 *   variable-length serialization.
386
 *
387
 * - ""_hex_u8: Returns `std::array<uint8_t>`, for cases where `std::byte` is
388
 *   incompatible.
389
 *
390
 * - ""_hex_v_u8: Returns `std::vector<uint8_t>`, combining heap allocation with
391
 *   `uint8_t`.
392
 *
393
 * @warning It could be necessary to use vector instead of array variants when
394
 *   serializing, or vice versa, because vectors are assumed to be variable-
395
 *   length and serialized with a size prefix, while arrays are considered fixed
396
 *   length and serialized with no prefix.
397
 *
398
 * @warning It may be preferable to use vector variants to save stack space when
399
 *   declaring local variables if hex strings are large. Alternatively variables
400
 *   could be declared constexpr to avoid using stack space.
401
 *
402
 * @warning Avoid `uint8_t` variants when not necessary, as the codebase
403
 *   migrates to use `std::byte` instead of `unsigned char` and `uint8_t`.
404
 *
405
 * @note One reason ""_hex uses `std::array` instead of `std::vector` like
406
 *   ParseHex() does is because heap-based containers cannot cross the compile-
407
 *   time/runtime barrier.
408
 */
409
inline namespace hex_literals {
410
namespace detail {
411
412
template <size_t N>
413
struct Hex {
414
    std::array<std::byte, N / 2> bytes{};
415
    consteval Hex(const char (&hex_str)[N])
416
        // 2 hex digits required per byte + implicit null terminator
417
        requires(N % 2 == 1)
418
    {
419
        if (hex_str[N - 1]) throw "null terminator required";
420
        for (std::size_t i = 0; i < bytes.size(); ++i) {
421
            bytes[i] = static_cast<std::byte>(
422
                (ConstevalHexDigit(hex_str[2 * i]) << 4) |
423
                 ConstevalHexDigit(hex_str[2 * i + 1]));
424
        }
425
    }
426
};
427
428
} // namespace detail
429
430
template <util::detail::Hex str>
431
0
constexpr auto operator""_hex() { return str.bytes; }
Unexecuted instantiation: _ZN4util12hex_literalsli4_hexITnNS0_6detail3HexEXtlNS3_ILm131EEEtlSt5arrayISt4byteLm65EEtlA65_S6_LS6_4ELS6_103ELS6_138ELS6_253ELS6_176ELS6_254ELS6_85ELS6_72ELS6_39ELS6_25ELS6_103ELS6_241ELS6_166ELS6_113ELS6_48ELS6_183ELS6_16ELS6_92ELS6_214ELS6_168ELS6_40ELS6_224ELS6_57ELS6_9ELS6_166ELS6_121ELS6_98ELS6_224ELS6_234ELS6_31ELS6_97ELS6_222ELS6_182ELS6_73ELS6_246ELS6_188ELS6_63ELS6_76ELS6_239ELS6_56ELS6_196ELS6_243ELS6_85ELS6_4ELS6_229ELS6_30ELS6_193ELS6_18ELS6_222ELS6_92ELS6_56ELS6_77ELS6_247ELS6_186ELS6_11ELS6_141ELS6_87ELS6_138ELS6_76ELS6_112ELS6_43ELS6_107ELS6_241ELS6_29ELS6_95EEEEEEEDav
Unexecuted instantiation: _ZN4util12hex_literalsli4_hexITnNS0_6detail3HexEXtlNS3_ILm67EEEEEEEDav
Unexecuted instantiation: _ZN4util12hex_literalsli4_hexITnNS0_6detail3HexEXtlNS3_ILm6109EEEtlSt5arrayISt4byteLm3054EEtlA3054_S6_LS6_1ELS6_0ELS6_0ELS6_0ELS6_144ELS6_240ELS6_169ELS6_241ELS6_16ELS6_112ELS6_47ELS6_128ELS6_130ELS6_25ELS6_235ELS6_234ELS6_17ELS6_115ELS6_5ELS6_96ELS6_66ELS6_167ELS6_20ELS6_186ELS6_213ELS6_27ELS6_145ELS6_108ELS6_182ELS6_128ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_82ELS6_117ELS6_40ELS6_149ELS6_88ELS6_245ELS6_28ELS6_153ELS6_102ELS6_105ELS6_148ELS6_4ELS6_174ELS6_34ELS6_148ELS6_115ELS6_12ELS6_60ELS6_159ELS6_155ELS6_218ELS6_83ELS6_82ELS6_60ELS6_229ELS6_14ELS6_155ELS6_149ELS6_229ELS6_88ELS6_218ELS6_47ELS6_219ELS6_38ELS6_27ELS6_77ELS6_76ELS6_134ELS6_4ELS6_27ELS6_26ELS6_177ELS6_191ELS6_147ELS6_9ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_255ELS6_255ELS6_255ELS6_255ELS6_7ELS6_4ELS6_76ELS6_134ELS6_4ELS6_27ELS6_1ELS6_70ELS6_255ELS6_255ELS6_255ELS6_255ELS6_1ELS6_0ELS6_242ELS6_5ELS6_42ELS6_1ELS6_0ELS6_0ELS6_0ELS6_67ELS6_65ELS6_4ELS6_225ELS6_143ELS6_122ELS6_251ELS6_228ELS6_114ELS6_21ELS6_128ELS6_232ELS6_30ELS6_132ELS6_20ELS6_252ELS6_140ELS6_36ELS6_215ELS6_207ELS6_172ELS6_242ELS6_84ELS6_187ELS6_92ELS6_123ELS6_148ELS6_148ELS6_80ELS6_195ELS6_233ELS6_151ELS6_194ELS6_220ELS6_18ELS6_66ELS6_72ELS6_122ELS6_129ELS6_105ELS6_80ELS6_123ELS6_99ELS6_30ELS6_179ELS6_119ELS6_31ELS6_43ELS6_66ELS6_84ELS6_131ELS6_251ELS6_19ELS6_16ELS6_44ELS6_78ELS6_181ELS6_216ELS6_88ELS6_238ELS6_242ELS6_96ELS6_254ELS6_112ELS6_251ELS6_250ELS6_224ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_150ELS6_96ELS6_140ELS6_203ELS6_175ELS6_161ELS6_106ELS6_186ELS6_218ELS6_144ELS6_39ELS6_128ELS6_218ELS6_77ELS6_195ELS6_93ELS6_175ELS6_215ELS6_175ELS6_5ELS6_250ELS6_13ELS6_160ELS6_140ELS6_248ELS6_51ELS6_87ELS6_95ELS6_140ELS6_249ELS6_232ELS6_54ELS6_0ELS6_0ELS6_0ELS6_0ELS6_74ELS6_73ELS6_48ELS6_70ELS6_2ELS6_33ELS6_0ELS6_218ELS6_178ELS6_72ELS6_137ELS6_33ELS6_60ELS6_175ELS6_67ELS6_174ELS6_106ELS6_220ELS6_65ELS6_207ELS6_28ELS6_147ELS6_150ELS6_192ELS6_130ELS6_64ELS6_193ELS6_153ELS6_245ELS6_34ELS6_90ELS6_207ELS6_69ELS6_65ELS6_99ELS6_48ELS6_253ELS6_125ELS6_189ELS6_2ELS6_33ELS6_0ELS6_254ELS6_55ELS6_144ELS6_14ELS6_6ELS6_68ELS6_191ELS6_87ELS6_68ELS6_147ELS6_160ELS6_127ELS6_197ELS6_237ELS6_186ELS6_6ELS6_219ELS6_192ELS6_124ELS6_49ELS6_27ELS6_148ELS6_117ELS6_32ELS6_194ELS6_213ELS6_20ELS6_188ELS6_87ELS6_37ELS6_220ELS6_180ELS6_1ELS6_255ELS6_255ELS6_255ELS6_255ELS6_1ELS6_0ELS6_242ELS6_5ELS6_42ELS6_1ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_241ELS6_93ELS6_25ELS6_33ELS6_245ELS6_46ELS6_64ELS6_7ELS6_177ELS6_70ELS6_223ELS6_166ELS6_15ELS6_54ELS6_158ELS6_210ELS6_252ELS6_57ELS6_60ELS6_226ELS6_136ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_251ELS6_118ELS6_108ELS6_18ELS6_136ELS6_69ELS6_140ELS6_43ELS6_175ELS6_207ELS6_236ELS6_129ELS6_228ELS6_139ELS6_36ELS6_217ELS6_142ELS6_199ELS6_6ELS6_222ELS6_107ELS6_138ELS6_247ELS6_196ELS6_227ELS6_194ELS6_148ELS6_25ELS6_191ELS6_172ELS6_181ELS6_109ELS6_0ELS6_0ELS6_0ELS6_0ELS6_140ELS6_73ELS6_48ELS6_70ELS6_2ELS6_33ELS6_0ELS6_242ELS6_104ELS6_186ELS6_22ELS6_92ELS6_224ELS6_173ELS6_46ELS6_109ELS6_147ELS6_240ELS6_137ELS6_207ELS6_205ELS6_55ELS6_133ELS6_222ELS6_92ELS6_150ELS6_59ELS6_181ELS6_234ELS6_107ELS6_140ELS6_27ELS6_35ELS6_241ELS6_206ELS6_62ELS6_81ELS6_123ELS6_159ELS6_2ELS6_33ELS6_0ELS6_218ELS6_124ELS6_15ELS6_33ELS6_173ELS6_198ELS6_196ELS6_1ELS6_136ELS6_127ELS6_43ELS6_253ELS6_25ELS6_34ELS6_241ELS6_29ELS6_118ELS6_21ELS6_156ELS6_188ELS6_89ELS6_127ELS6_189ELS6_117ELS6_106ELS6_35ELS6_220ELS6_187ELS6_0ELS6_244ELS6_215ELS6_41ELS6_1ELS6_65ELS6_4ELS6_43ELS6_78ELS6_134ELS6_37ELS6_169ELS6_97ELS6_39ELS6_130ELS6_105ELS6_21ELS6_165ELS6_177ELS6_9ELS6_133ELS6_38ELS6_54ELS6_173ELS6_13ELS6_167ELS6_83ELS6_201ELS6_225ELS6_213ELS6_96ELS6_106ELS6_80ELS6_72ELS6_12ELS6_208ELS6_196ELS6_15ELS6_31ELS6_139ELS6_141ELS6_137ELS6_130ELS6_53ELS6_229ELS6_113ELS6_254ELS6_147ELS6_87ELS6_217ELS6_236ELS6_132ELS6_43ELS6_196ELS6_187ELS6_161ELS6_130ELS6_125ELS6_170ELS6_244ELS6_222ELS6_6ELS6_215ELS6_24ELS6_68ELS6_208ELS6_5ELS6_119ELS6_7ELS6_150ELS6_106ELS6_255ELS6_255ELS6_255ELS6_255ELS6_2ELS6_128ELS6_150ELS6_152ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_105ELS6_99ELS6_144ELS6_117ELS6_49ELS6_219ELS6_114ELS6_208ELS6_237ELS6_26ELS6_12ELS6_251ELS6_71ELS6_28ELS6_203ELS6_99ELS6_146ELS6_52ELS6_70ELS6_243ELS6_136ELS6_172ELS6_128ELS6_214ELS6_227ELS6_76ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_240ELS6_104ELS6_139ELS6_161ELS6_192ELS6_209ELS6_206ELS6_24ELS6_44ELS6_122ELS6_246ELS6_116ELS6_30ELS6_2ELS6_101ELS6_140ELS6_125ELS6_77ELS6_252ELS6_211ELS6_136ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_2ELS6_196ELS6_2ELS6_151ELS6_247ELS6_48ELS6_221ELS6_123ELS6_90ELS6_153ELS6_86ELS6_126ELS6_184ELS6_210ELS6_123ELS6_120ELS6_117ELS6_143ELS6_96ELS6_117ELS6_7ELS6_197ELS6_34ELS6_146ELS6_208ELS6_45ELS6_64ELS6_49ELS6_137ELS6_91ELS6_82ELS6_242ELS6_255ELS6_1ELS6_0ELS6_0ELS6_0ELS6_139ELS6_72ELS6_48ELS6_69ELS6_2ELS6_33ELS6_0ELS6_247ELS6_237ELS6_253ELS6_75ELS6_10ELS6_172ELS6_64ELS6_78ELS6_91ELS6_171ELS6_79ELS6_211ELS6_136ELS6_158ELS6_12ELS6_108ELS6_65ELS6_170ELS6_141ELS6_14ELS6_111ELS6_161ELS6_34ELS6_49ELS6_111ELS6_104ELS6_237ELS6_221ELS6_10ELS6_101ELS6_1ELS6_57ELS6_2ELS6_32ELS6_91ELS6_9ELS6_204ELS6_139ELS6_45ELS6_86ELS6_225ELS6_205ELS6_31ELS6_127ELS6_47ELS6_175ELS6_214ELS6_10ELS6_18ELS6_158ELS6_217ELS6_69ELS6_4ELS6_196ELS6_172ELS6_123ELS6_220ELS6_103ELS6_181ELS6_111ELS6_230ELS6_117ELS6_18ELS6_101ELS6_139ELS6_62ELS6_1ELS6_65ELS6_4ELS6_115ELS6_32ELS6_18ELS6_203ELS6_150ELS6_42ELS6_250ELS6_144ELS6_211ELS6_27ELS6_37ELS6_216ELS6_251ELS6_14ELS6_50ELS6_201ELS6_78ELS6_81ELS6_58ELS6_183ELS6_161ELS6_120ELS6_5ELS6_193ELS6_76ELS6_164ELS6_195ELS6_66ELS6_62ELS6_24ELS6_180ELS6_251ELS6_93ELS6_14ELS6_103ELS6_104ELS6_65ELS6_115ELS6_60ELS6_184ELS6_58ELS6_186ELS6_249ELS6_117ELS6_132ELS6_92ELS6_159ELS6_111ELS6_42ELS6_128ELS6_151ELS6_183ELS6_208ELS6_79ELS6_73ELS6_8ELS6_177ELS6_131ELS6_104ELS6_214ELS6_252ELS6_45ELS6_104ELS6_236ELS6_255ELS6_255ELS6_255ELS6_255ELS6_202ELS6_80ELS6_101ELS6_255ELS6_150ELS6_23ELS6_203ELS6_203ELS6_164ELS6_94ELS6_178ELS6_55ELS6_38ELS6_223ELS6_100ELS6_152ELS6_169ELS6_185ELS6_202ELS6_254ELS6_212ELS6_245ELS6_76ELS6_186ELS6_185ELS6_210ELS6_39ELS6_176ELS6_3ELS6_93ELS6_222ELS6_251ELS6_0ELS6_0ELS6_0ELS6_0ELS6_138ELS6_71ELS6_48ELS6_68ELS6_2ELS6_32ELS6_104ELS6_1ELS6_3ELS6_98ELS6_161ELS6_60ELS6_127ELS6_153ELS6_25ELS6_250ELS6_131ELS6_43ELS6_45ELS6_238ELS6_78ELS6_120ELS6_143ELS6_97ELS6_246ELS6_245ELS6_211ELS6_68ELS6_167ELS6_194ELS6_160ELS6_218ELS6_106ELS6_231ELS6_64ELS6_96ELS6_86ELS6_88ELS6_2ELS6_32ELS6_6ELS6_209ELS6_175ELS6_82ELS6_91ELS6_154ELS6_20ELS6_163ELS6_92ELS6_0ELS6_59ELS6_120ELS6_183ELS6_43ELS6_213ELS6_151ELS6_56ELS6_205ELS6_103ELS6_111ELS6_132ELS6_93ELS6_31ELS6_243ELS6_252ELS6_37ELS6_4ELS6_158ELS6_1ELS6_0ELS6_54ELS6_20ELS6_1ELS6_65ELS6_4ELS6_115ELS6_32ELS6_18ELS6_203ELS6_150ELS6_42ELS6_250ELS6_144ELS6_211ELS6_27ELS6_37ELS6_216ELS6_251ELS6_14ELS6_50ELS6_201ELS6_78ELS6_81ELS6_58ELS6_183ELS6_161ELS6_120ELS6_5ELS6_193ELS6_76ELS6_164ELS6_195ELS6_66ELS6_62ELS6_24ELS6_180ELS6_251ELS6_93ELS6_14ELS6_103ELS6_104ELS6_65ELS6_115ELS6_60ELS6_184ELS6_58ELS6_186ELS6_249ELS6_117ELS6_132ELS6_92ELS6_159ELS6_111ELS6_42ELS6_128ELS6_151ELS6_183ELS6_208ELS6_79ELS6_73ELS6_8ELS6_177ELS6_131ELS6_104ELS6_214ELS6_252ELS6_45ELS6_104ELS6_236ELS6_255ELS6_255ELS6_255ELS6_255ELS6_1ELS6_0ELS6_30ELS6_196ELS6_17ELS6_2ELS6_0ELS6_0ELS6_0ELS6_67ELS6_65ELS6_4ELS6_105ELS6_171ELS6_65ELS6_129ELS6_236ELS6_235ELS6_40ELS6_152ELS6_91ELS6_155ELS6_78ELS6_137ELS6_92ELS6_19ELS6_250ELS6_94ELS6_104ELS6_216ELS6_87ELS6_97ELS6_183ELS6_238ELS6_227ELS6_17ELS6_219ELS6_90ELS6_221ELS6_239ELS6_118ELS6_250ELS6_134ELS6_33ELS6_134ELS6_81ELS6_52ELS6_162ELS6_33ELS6_189ELS6_1ELS6_242ELS6_142ELS6_201ELS6_153ELS6_158ELS6_227ELS6_224ELS6_33ELS6_230ELS6_7ELS6_102ELS6_233ELS6_209ELS6_243ELS6_69ELS6_140ELS6_17ELS6_95ELS6_178ELS6_134ELS6_80ELS6_96ELS6_95ELS6_17ELS6_201ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_205ELS6_175ELS6_47ELS6_117ELS6_142ELS6_145ELS6_197ELS6_20ELS6_101ELS6_94ELS6_45ELS6_197ELS6_6ELS6_51ELS6_209ELS6_228ELS6_200ELS6_73ELS6_137ELS6_248ELS6_170ELS6_144ELS6_160ELS6_219ELS6_200ELS6_131ELS6_240ELS6_210ELS6_62ELS6_213ELS6_194ELS6_250ELS6_1ELS6_0ELS6_0ELS6_0ELS6_139ELS6_72ELS6_48ELS6_69ELS6_2ELS6_32ELS6_122ELS6_181ELS6_27ELS6_230ELS6_241ELS6_42ELS6_25ELS6_98ELS6_186ELS6_10ELS6_170ELS6_242ELS6_74ELS6_32ELS6_224ELS6_182ELS6_155ELS6_39ELS6_169ELS6_79ELS6_172ELS6_90ELS6_223ELS6_69ELS6_170ELS6_125ELS6_45ELS6_24ELS6_255ELS6_217ELS6_35ELS6_97ELS6_2ELS6_33ELS6_0ELS6_134ELS6_174ELS6_114ELS6_139ELS6_55ELS6_14ELS6_83ELS6_41ELS6_238ELS6_173ELS6_154ELS6_204ELS6_216ELS6_128ELS6_208ELS6_203ELS6_7ELS6_10ELS6_234ELS6_12ELS6_150ELS6_37ELS6_95ELS6_174ELS6_108ELS6_79ELS6_29ELS6_220ELS6_206ELS6_31ELS6_213ELS6_110ELS6_1ELS6_65ELS6_4ELS6_70ELS6_46ELS6_118ELS6_253ELS6_64ELS6_103ELS6_179ELS6_160ELS6_170ELS6_66ELS6_7ELS6_0ELS6_130ELS6_220ELS6_176ELS6_191ELS6_47ELS6_56ELS6_139ELS6_100ELS6_149ELS6_207ELS6_51ELS6_215ELS6_137ELS6_144ELS6_79ELS6_7ELS6_208ELS6_245ELS6_92ELS6_64ELS6_251ELS6_212ELS6_184ELS6_41ELS6_99ELS6_198ELS6_155ELS6_61ELS6_195ELS6_24ELS6_149ELS6_208ELS6_199ELS6_114ELS6_200ELS6_18ELS6_177ELS6_213ELS6_251ELS6_202ELS6_222ELS6_21ELS6_49ELS6_46ELS6_241ELS6_192ELS6_232ELS6_235ELS6_187ELS6_18ELS6_220ELS6_212ELS6_255ELS6_255ELS6_255ELS6_255ELS6_2ELS6_64ELS6_75ELS6_76ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_43ELS6_107ELS6_167ELS6_201ELS6_215ELS6_150ELS6_183ELS6_94ELS6_239ELS6_121ELS6_66ELS6_252ELS6_146ELS6_136ELS6_237ELS6_211ELS6_124ELS6_50ELS6_245ELS6_195ELS6_136ELS6_172ELS6_0ELS6_45ELS6_49ELS6_1ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_27ELS6_239ELS6_186ELS6_12ELS6_220ELS6_26ELS6_213ELS6_101ELS6_41ELS6_55ELS6_24ELS6_100ELS6_217ELS6_246ELS6_203ELS6_4ELS6_47ELS6_170ELS6_6ELS6_181ELS6_136ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_180ELS6_164ELS6_118ELS6_3ELS6_231ELS6_27ELS6_97ELS6_188ELS6_51ELS6_38ELS6_239ELS6_217ELS6_1ELS6_17ELS6_191ELS6_2ELS6_210ELS6_245ELS6_73ELS6_176ELS6_103ELS6_244ELS6_196ELS6_168ELS6_250ELS6_24ELS6_59ELS6_87ELS6_160ELS6_248ELS6_0ELS6_203ELS6_1ELS6_0ELS6_0ELS6_0ELS6_138ELS6_71ELS6_48ELS6_68ELS6_2ELS6_32ELS6_23ELS6_124ELS6_55ELS6_249ELS6_165ELS6_5ELS6_195ELS6_241ELS6_161ELS6_240ELS6_206ELS6_45ELS6_167ELS6_119ELS6_195ELS6_57ELS6_189ELS6_131ELS6_57ELS6_255ELS6_160ELS6_44ELS6_124ELS6_180ELS6_31ELS6_10ELS6_88ELS6_4ELS6_244ELS6_115ELS6_201ELS6_35ELS6_2ELS6_32ELS6_88ELS6_91ELS6_37ELS6_162ELS6_238ELS6_128ELS6_235ELS6_89ELS6_41ELS6_46ELS6_82ELS6_185ELS6_135ELS6_218ELS6_217ELS6_42ELS6_203ELS6_12ELS6_100ELS6_236ELS6_237ELS6_146ELS6_237ELS6_158ELS6_225ELS6_5ELS6_173ELS6_21ELS6_60ELS6_219ELS6_18ELS6_208ELS6_1ELS6_65ELS6_4ELS6_67ELS6_189ELS6_68ELS6_246ELS6_131ELS6_70ELS6_126ELS6_84ELS6_157ELS6_174ELS6_125ELS6_32ELS6_209ELS6_215ELS6_156ELS6_189ELS6_182ELS6_223ELS6_152ELS6_92ELS6_110ELS6_156ELS6_2ELS6_156ELS6_141ELS6_12ELS6_108ELS6_180ELS6_108ELS6_193ELS6_164ELS6_211ELS6_207ELS6_121ELS6_35ELS6_197ELS6_2ELS6_27ELS6_39ELS6_247ELS6_160ELS6_181ELS6_98ELS6_173ELS6_161ELS6_19ELS6_188ELS6_133ELS6_213ELS6_253ELS6_165ELS6_161ELS6_180ELS6_30ELS6_135ELS6_254ELS6_110ELS6_136ELS6_2ELS6_129ELS6_124ELS6_246ELS6_153ELS6_150ELS6_255ELS6_255ELS6_255ELS6_255ELS6_2ELS6_128ELS6_101ELS6_20ELS6_6ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_85ELS6_5ELS6_97ELS6_72ELS6_89ELS6_100ELS6_58ELS6_183ELS6_181ELS6_71ELS6_205ELS6_127ELS6_31ELS6_94ELS6_126ELS6_42ELS6_18ELS6_50ELS6_45ELS6_55ELS6_136ELS6_172ELS6_0ELS6_170ELS6_2ELS6_113ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_234ELS6_71ELS6_32ELS6_167ELS6_165ELS6_47ELS6_193ELS6_102ELS6_197ELS6_95ELS6_242ELS6_41ELS6_142ELS6_7ELS6_186ELS6_247ELS6_10ELS6_230ELS6_126ELS6_27ELS6_136ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_5ELS6_134ELS6_198ELS6_44ELS6_214ELS6_2ELS6_210ELS6_25ELS6_187ELS6_96ELS6_237ELS6_177ELS6_74ELS6_62ELS6_32ELS6_77ELS6_224ELS6_112ELS6_81ELS6_118ELS6_249ELS6_2ELS6_47ELS6_228ELS6_154ELS6_83ELS6_128ELS6_84ELS6_251ELS6_20ELS6_171ELS6_180ELS6_158ELS6_1ELS6_0ELS6_0ELS6_0ELS6_140ELS6_73ELS6_48ELS6_70ELS6_2ELS6_33ELS6_0ELS6_242ELS6_188ELS6_42ELS6_186ELS6_37ELS6_52ELS6_190ELS6_203ELS6_223ELS6_6ELS6_46ELS6_185ELS6_147ELS6_133ELS6_58ELS6_66ELS6_187ELS6_188ELS6_40ELS6_32ELS6_131ELS6_208ELS6_218ELS6_249ELS6_180ELS6_181ELS6_133ELS6_189ELS6_64ELS6_26ELS6_168ELS6_201ELS6_2ELS6_33ELS6_0ELS6_177ELS6_215ELS6_253ELS6_126ELS6_224ELS6_185ELS6_86ELS6_0ELS6_219ELS6_133ELS6_53ELS6_187ELS6_243ELS6_49ELS6_177ELS6_158ELS6_237ELS6_141ELS6_150ELS6_31ELS6_122ELS6_142ELS6_84ELS6_21ELS6_156ELS6_83ELS6_103ELS6_93ELS6_95ELS6_105ELS6_223ELS6_140ELS6_1ELS6_65ELS6_4ELS6_70ELS6_46ELS6_118ELS6_253ELS6_64ELS6_103ELS6_179ELS6_160ELS6_170ELS6_66ELS6_7ELS6_0ELS6_130ELS6_220ELS6_176ELS6_191ELS6_47ELS6_56ELS6_139ELS6_100ELS6_149ELS6_207ELS6_51ELS6_215ELS6_137ELS6_144ELS6_79ELS6_7ELS6_208ELS6_245ELS6_92ELS6_64ELS6_251ELS6_212ELS6_184ELS6_41ELS6_99ELS6_198ELS6_155ELS6_61ELS6_195ELS6_24ELS6_149ELS6_208ELS6_199ELS6_114ELS6_200ELS6_18ELS6_177ELS6_213ELS6_251ELS6_202ELS6_222ELS6_21ELS6_49ELS6_46ELS6_241ELS6_192ELS6_232ELS6_235ELS6_187ELS6_18ELS6_220ELS6_212ELS6_255ELS6_255ELS6_255ELS6_255ELS6_3ELS6_173ELS6_14ELS6_88ELS6_204ELS6_218ELS6_195ELS6_223ELS6_157ELS6_194ELS6_138ELS6_33ELS6_139ELS6_207ELS6_111ELS6_25ELS6_151ELS6_176ELS6_169ELS6_51ELS6_6ELS6_250ELS6_170ELS6_75ELS6_58ELS6_40ELS6_174ELS6_131ELS6_68ELS6_123ELS6_33ELS6_121ELS6_1ELS6_0ELS6_0ELS6_0ELS6_139ELS6_72ELS6_48ELS6_69ELS6_2ELS6_33ELS6_0ELS6_190ELS6_18ELS6_178ELS6_147ELS6_113ELS6_121ELS6_218ELS6_136ELS6_89ELS6_158ELS6_39ELS6_187ELS6_49ELS6_195ELS6_82ELS6_80ELS6_151ELS6_160ELS6_124ELS6_219ELS6_82ELS6_66ELS6_45ELS6_22ELS6_91ELS6_60ELS6_162ELS6_242ELS6_2ELS6_15ELS6_252ELS6_247ELS6_2ELS6_32ELS6_9ELS6_113ELS6_181ELS6_31ELS6_133ELS6_58ELS6_83ELS6_214ELS6_68ELS6_235ELS6_174ELS6_158ELS6_200ELS6_243ELS6_81ELS6_46ELS6_68ELS6_43ELS6_27ELS6_203ELS6_108ELS6_49ELS6_90ELS6_91ELS6_73ELS6_29ELS6_17ELS6_157ELS6_16ELS6_98ELS6_76ELS6_131ELS6_1ELS6_65ELS6_4ELS6_70ELS6_46ELS6_118ELS6_253ELS6_64ELS6_103ELS6_179ELS6_160ELS6_170ELS6_66ELS6_7ELS6_0ELS6_130ELS6_220ELS6_176ELS6_191ELS6_47ELS6_56ELS6_139ELS6_100ELS6_149ELS6_207ELS6_51ELS6_215ELS6_137ELS6_144ELS6_79ELS6_7ELS6_208ELS6_245ELS6_92ELS6_64ELS6_251ELS6_212ELS6_184ELS6_41ELS6_99ELS6_198ELS6_155ELS6_61ELS6_195ELS6_24ELS6_149ELS6_208ELS6_199ELS6_114ELS6_200ELS6_18ELS6_177ELS6_213ELS6_251ELS6_202ELS6_222ELS6_21ELS6_49ELS6_46ELS6_241ELS6_192ELS6_232ELS6_235ELS6_187ELS6_18ELS6_220ELS6_212ELS6_255ELS6_255ELS6_255ELS6_255ELS6_42ELS6_207ELS6_202ELS6_182ELS6_41ELS6_187ELS6_200ELS6_104ELS6_87ELS6_146ELS6_96ELS6_55ELS6_98ELS6_201ELS6_33ELS6_88ELS6_0ELS6_48ELS6_186ELS6_20ELS6_74ELS6_245ELS6_83ELS6_210ELS6_113ELS6_113ELS6_106ELS6_149ELS6_8ELS6_158ELS6_16ELS6_123ELS6_1ELS6_0ELS6_0ELS6_0ELS6_139ELS6_72ELS6_48ELS6_69ELS6_2ELS6_33ELS6_0ELS6_250ELS6_87ELS6_154ELS6_132ELS6_10ELS6_194ELS6_88ELS6_135ELS6_19ELS6_101ELS6_221ELS6_72ELS6_205ELS6_117ELS6_82ELS6_249ELS6_108ELS6_142ELS6_234ELS6_105ELS6_189ELS6_0ELS6_216ELS6_79ELS6_5ELS6_178ELS6_131ELS6_160ELS6_218ELS6_179ELS6_17ELS6_225ELS6_2ELS6_32ELS6_126ELS6_60ELS6_14ELS6_233ELS6_35ELS6_72ELS6_20ELS6_207ELS6_187ELS6_27ELS6_101ELS6_155ELS6_131ELS6_103ELS6_22ELS6_24ELS6_244ELS6_90ELS6_188ELS6_19ELS6_38ELS6_185ELS6_237ELS6_204ELS6_119ELS6_213ELS6_82ELS6_164ELS6_242ELS6_168ELS6_5ELS6_192ELS6_1ELS6_65ELS6_4ELS6_70ELS6_46ELS6_118ELS6_253ELS6_64ELS6_103ELS6_179ELS6_160ELS6_170ELS6_66ELS6_7ELS6_0ELS6_130ELS6_220ELS6_176ELS6_191ELS6_47ELS6_56ELS6_139ELS6_100ELS6_149ELS6_207ELS6_51ELS6_215ELS6_137ELS6_144ELS6_79ELS6_7ELS6_208ELS6_245ELS6_92ELS6_64ELS6_251ELS6_212ELS6_184ELS6_41ELS6_99ELS6_198ELS6_155ELS6_61ELS6_195ELS6_24ELS6_149ELS6_208ELS6_199ELS6_114ELS6_200ELS6_18ELS6_177ELS6_213ELS6_251ELS6_202ELS6_222ELS6_21ELS6_49ELS6_46ELS6_241ELS6_192ELS6_232ELS6_235ELS6_187ELS6_18ELS6_220ELS6_212ELS6_255ELS6_255ELS6_255ELS6_255ELS6_220ELS6_220ELS6_96ELS6_35ELS6_187ELS6_201ELS6_148ELS6_74ELS6_101ELS6_141ELS6_220ELS6_88ELS6_142ELS6_97ELS6_234ELS6_203ELS6_115ELS6_125ELS6_223ELS6_10ELS6_60ELS6_210ELS6_79ELS6_17ELS6_59ELS6_90ELS6_134ELS6_52ELS6_197ELS6_23ELS6_252ELS6_210ELS6_0ELS6_0ELS6_0ELS6_0ELS6_139ELS6_72ELS6_48ELS6_69ELS6_2ELS6_33ELS6_0ELS6_141ELS6_109ELS6_247ELS6_49ELS6_223ELS6_93ELS6_50ELS6_38ELS6_121ELS6_84ELS6_189ELS6_125ELS6_45ELS6_218ELS6_35ELS6_2ELS6_183ELS6_76ELS6_108ELS6_42ELS6_106ELS6_165ELS6_192ELS6_202ELS6_100ELS6_236ELS6_186ELS6_188ELS6_26ELS6_240ELS6_60ELS6_117ELS6_2ELS6_32ELS6_16ELS6_229ELS6_92ELS6_87ELS6_29ELS6_101ELS6_218ELS6_119ELS6_1ELS6_174ELS6_45ELS6_161ELS6_149ELS6_108ELS6_68ELS6_45ELS6_248ELS6_27ELS6_191ELS6_7ELS6_108ELS6_219ELS6_172ELS6_37ELS6_19ELS6_63ELS6_153ELS6_217ELS6_138ELS6_158ELS6_211ELS6_76ELS6_1ELS6_65ELS6_4ELS6_70ELS6_46ELS6_118ELS6_253ELS6_64ELS6_103ELS6_179ELS6_160ELS6_170ELS6_66ELS6_7ELS6_0ELS6_130ELS6_220ELS6_176ELS6_191ELS6_47ELS6_56ELS6_139ELS6_100ELS6_149ELS6_207ELS6_51ELS6_215ELS6_137ELS6_144ELS6_79ELS6_7ELS6_208ELS6_245ELS6_92ELS6_64ELS6_251ELS6_212ELS6_184ELS6_41ELS6_99ELS6_198ELS6_155ELS6_61ELS6_195ELS6_24ELS6_149ELS6_208ELS6_199ELS6_114ELS6_200ELS6_18ELS6_177ELS6_213ELS6_251ELS6_202ELS6_222ELS6_21ELS6_49ELS6_46ELS6_241ELS6_192ELS6_232ELS6_235ELS6_187ELS6_18ELS6_220ELS6_212ELS6_255ELS6_255ELS6_255ELS6_255ELS6_225ELS6_85ELS6_87ELS6_205ELS6_92ELS6_226ELS6_88ELS6_244ELS6_121ELS6_223ELS6_214ELS6_220ELS6_101ELS6_20ELS6_237ELS6_246ELS6_215ELS6_237ELS6_91ELS6_33ELS6_252ELS6_250ELS6_74ELS6_3ELS6_143ELS6_214ELS6_159ELS6_6ELS6_184ELS6_58ELS6_199ELS6_110ELS6_1ELS6_0ELS6_0ELS6_0ELS6_139ELS6_72ELS6_48ELS6_69ELS6_2ELS6_32ELS6_35ELS6_179ELS6_224ELS6_171ELS6_7ELS6_30ELS6_177ELS6_29ELS6_226ELS6_235ELS6_28ELS6_195ELS6_166ELS6_114ELS6_97ELS6_184ELS6_102ELS6_248ELS6_107ELS6_246ELS6_134ELS6_125ELS6_69ELS6_88ELS6_22ELS6_95ELS6_124ELS6_140ELS6_138ELS6_202ELS6_45ELS6_134ELS6_2ELS6_33ELS6_0ELS6_220ELS6_110ELS6_31ELS6_83ELS6_169ELS6_29ELS6_227ELS6_239ELS6_232ELS6_246ELS6_53ELS6_18ELS6_133ELS6_8ELS6_17ELS6_242ELS6_98ELS6_132ELS6_182ELS6_47ELS6_133ELS6_12ELS6_112ELS6_202ELS6_115ELS6_237ELS6_93ELS6_232ELS6_119ELS6_31ELS6_180ELS6_81ELS6_1ELS6_65ELS6_4ELS6_70ELS6_46ELS6_118ELS6_253ELS6_64ELS6_103ELS6_179ELS6_160ELS6_170ELS6_66ELS6_7ELS6_0ELS6_130ELS6_220ELS6_176ELS6_191ELS6_47ELS6_56ELS6_139ELS6_100ELS6_149ELS6_207ELS6_51ELS6_215ELS6_137ELS6_144ELS6_79ELS6_7ELS6_208ELS6_245ELS6_92ELS6_64ELS6_251ELS6_212ELS6_184ELS6_41ELS6_99ELS6_198ELS6_155ELS6_61ELS6_195ELS6_24ELS6_149ELS6_208ELS6_199ELS6_114ELS6_200ELS6_18ELS6_177ELS6_213ELS6_251ELS6_202ELS6_222ELS6_21ELS6_49ELS6_46ELS6_241ELS6_192ELS6_232ELS6_235ELS6_187ELS6_18ELS6_220ELS6_212ELS6_255ELS6_255ELS6_255ELS6_255ELS6_1ELS6_64ELS6_75ELS6_76ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_43ELS6_107ELS6_167ELS6_201ELS6_215ELS6_150ELS6_183ELS6_94ELS6_239ELS6_121ELS6_66ELS6_252ELS6_146ELS6_136ELS6_237ELS6_211ELS6_124ELS6_50ELS6_245ELS6_195ELS6_136ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_102ELS6_215ELS6_87ELS6_113ELS6_99ELS6_201ELS6_50ELS6_180ELS6_249ELS6_105ELS6_12ELS6_166ELS6_168ELS6_11ELS6_110ELS6_78ELS6_176ELS6_1ELS6_240ELS6_162ELS6_250ELS6_144ELS6_35ELS6_223ELS6_85ELS6_149ELS6_96ELS6_42ELS6_174ELS6_150ELS6_237ELS6_141ELS6_0ELS6_0ELS6_0ELS6_0ELS6_138ELS6_71ELS6_48ELS6_68ELS6_2ELS6_32ELS6_38ELS6_43ELS6_66ELS6_84ELS6_99ELS6_2ELS6_223ELS6_182ELS6_84ELS6_162ELS6_41ELS6_206ELS6_252ELS6_134ELS6_67ELS6_43ELS6_137ELS6_98ELS6_143ELS6_242ELS6_89ELS6_220ELS6_135ELS6_237ELS6_209ELS6_21ELS6_69ELS6_53ELS6_177ELS6_106ELS6_103ELS6_225ELS6_2ELS6_32ELS6_123ELS6_70ELS6_52ELS6_192ELS6_32ELS6_169ELS6_124ELS6_62ELS6_123ELS6_189ELS6_13ELS6_77ELS6_25ELS6_218ELS6_106ELS6_162ELS6_38ELS6_154ELS6_217ELS6_221ELS6_237ELS6_64ELS6_38ELS6_232ELS6_150ELS6_178ELS6_19ELS6_215ELS6_60ELS6_164ELS6_182ELS6_63ELS6_1ELS6_65ELS6_4ELS6_151ELS6_155ELS6_130ELS6_208ELS6_34ELS6_38ELS6_179ELS6_164ELS6_89ELS6_117ELS6_35ELS6_132ELS6_87ELS6_84ELS6_212ELS6_79ELS6_19ELS6_99ELS6_158ELS6_59ELS6_242ELS6_223ELS6_94ELS6_130ELS6_198ELS6_170ELS6_178ELS6_189ELS6_199ELS6_150ELS6_135ELS6_54ELS6_139ELS6_1ELS6_177ELS6_171ELS6_139ELS6_25ELS6_135ELS6_90ELS6_227ELS6_201ELS6_13ELS6_102ELS6_26ELS6_61ELS6_10ELS6_51ELS6_22ELS6_29ELS6_171ELS6_41ELS6_147ELS6_78ELS6_222ELS6_179ELS6_106ELS6_160ELS6_25ELS6_118ELS6_190ELS6_59ELS6_175ELS6_138ELS6_255ELS6_255ELS6_255ELS6_255ELS6_2ELS6_64ELS6_75ELS6_76ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_72ELS6_84ELS6_230ELS6_149ELS6_160ELS6_42ELS6_240ELS6_174ELS6_172ELS6_184ELS6_35ELS6_204ELS6_188ELS6_39ELS6_33ELS6_52ELS6_86ELS6_30ELS6_10ELS6_22ELS6_136ELS6_172ELS6_64ELS6_66ELS6_15ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_171ELS6_238ELS6_147ELS6_55ELS6_109ELS6_107ELS6_55ELS6_181ELS6_194ELS6_148ELS6_6ELS6_85ELS6_166ELS6_252ELS6_175ELS6_28ELS6_142ELS6_116ELS6_35ELS6_121ELS6_136ELS6_172ELS6_0ELS6_0ELS6_0ELS6_0ELS6_1ELS6_0ELS6_0ELS6_0ELS6_1ELS6_78ELS6_63ELS6_142ELS6_242ELS6_233ELS6_19ELS6_73ELS6_169ELS6_5ELS6_156ELS6_180ELS6_240ELS6_30ELS6_84ELS6_171ELS6_37ELS6_151ELS6_193ELS6_56ELS6_113ELS6_97ELS6_211ELS6_218ELS6_137ELS6_145ELS6_159ELS6_126ELS6_166ELS6_172ELS6_219ELS6_179ELS6_113ELS6_1ELS6_0ELS6_0ELS6_0ELS6_140ELS6_73ELS6_48ELS6_70ELS6_2ELS6_33ELS6_0ELS6_129ELS6_243ELS6_24ELS6_52ELS6_113ELS6_165ELS6_202ELS6_34ELS6_48ELS6_124ELS6_8ELS6_0ELS6_34ELS6_111ELS6_62ELS6_249ELS6_195ELS6_83ELS6_6ELS6_158ELS6_7ELS6_115ELS6_172ELS6_118ELS6_187ELS6_88ELS6_6ELS6_84ELS6_213ELS6_106ELS6_165ELS6_35ELS6_2ELS6_33ELS6_0ELS6_212ELS6_197ELS6_100ELS6_101ELS6_189ELS6_192ELS6_105ELS6_6ELS6_8ELS6_70ELS6_244ELS6_251ELS6_242ELS6_246ELS6_178ELS6_5ELS6_32ELS6_178ELS6_168ELS6_11ELS6_8ELS6_177ELS6_104ELS6_179ELS6_30ELS6_102ELS6_221ELS6_185ELS6_198ELS6_148ELS6_226ELS6_64ELS6_1ELS6_65ELS6_4ELS6_151ELS6_108ELS6_121ELS6_132ELS6_142ELS6_24ELS6_37ELS6_22ELS6_18ELS6_248ELS6_148ELS6_8ELS6_117ELS6_178ELS6_176ELS6_141ELS6_6ELS6_230ELS6_220ELS6_115ELS6_185ELS6_132ELS6_14ELS6_136ELS6_96ELS6_192ELS6_102ELS6_183ELS6_232ELS6_116ELS6_50ELS6_196ELS6_119ELS6_233ELS6_165ELS6_154ELS6_69ELS6_62ELS6_113ELS6_230ELS6_215ELS6_109ELS6_95ELS6_227ELS6_64ELS6_88ELS6_184ELS6_0ELS6_160ELS6_152ELS6_252ELS6_23ELS6_64ELS6_206ELS6_48ELS6_18ELS6_232ELS6_252ELS6_138ELS6_0ELS6_201ELS6_106ELS6_249ELS6_102ELS6_255ELS6_255ELS6_255ELS6_255ELS6_2ELS6_192ELS6_225ELS6_228ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_65ELS6_52ELS6_231ELS6_90ELS6_111ELS6_203ELS6_96ELS6_66ELS6_3ELS6_74ELS6_171ELS6_94ELS6_24ELS6_87ELS6_12ELS6_241ELS6_248ELS6_68ELS6_245ELS6_71ELS6_136ELS6_172ELS6_64ELS6_75ELS6_76ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_25ELS6_118ELS6_169ELS6_20ELS6_43ELS6_107ELS6_167ELS6_201ELS6_215ELS6_150ELS6_183ELS6_94ELS6_239ELS6_121ELS6_66ELS6_252ELS6_146ELS6_136ELS6_237ELS6_211ELS6_124ELS6_50ELS6_245ELS6_195ELS6_136ELS6_172EEEEEEEDav
Unexecuted instantiation: _ZN4util12hex_literalsli4_hexITnNS0_6detail3HexEXtlNS3_ILm337EEEtlSt5arrayISt4byteLm168EEtlA168_S6_LS6_96ELS6_1ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_0ELS6_255ELS6_255ELS6_255ELS6_127ELS6_0ELS6_0ELS6_0ELS6_0ELS6_255ELS6_255ELS6_255ELS6_127ELS6_254ELS6_255ELS6_255ELS6_127ELS6_1ELS6_255ELS6_255ELS6_255ELS6_127ELS6_0ELS6_0ELS6_0ELS6_0ELS6_255ELS6_255ELS6_255ELS6_127ELS6_0ELS6_255ELS6_255ELS6_255ELS6_127ELS6_0ELS6_47ELS6_85ELS6_82ELS6_71ELS6_69ELS6_78ELS6_84ELS6_58ELS6_32ELS6_65ELS6_108ELS6_101ELS6_114ELS6_116ELS6_32ELS6_107ELS6_101ELS6_121ELS6_32ELS6_99ELS6_111ELS6_109ELS6_112ELS6_114ELS6_111ELS6_109ELS6_105ELS6_115ELS6_101ELS6_100ELS6_44ELS6_32ELS6_117ELS6_112ELS6_103ELS6_114ELS6_97ELS6_100ELS6_101ELS6_32ELS6_114ELS6_101ELS6_113ELS6_117ELS6_105ELS6_114ELS6_101ELS6_100ELS6_0ELS6_70ELS6_48ELS6_68ELS6_2ELS6_32ELS6_101ELS6_63ELS6_235ELS6_214ELS6_65ELS6_15ELS6_71ELS6_15ELS6_107ELS6_174ELS6_17ELS6_202ELS6_209ELS6_156ELS6_72ELS6_65ELS6_59ELS6_236ELS6_177ELS6_172ELS6_44ELS6_23ELS6_249ELS6_8ELS6_253ELS6_15ELS6_213ELS6_59ELS6_220ELS6_58ELS6_189ELS6_82ELS6_2ELS6_32ELS6_109ELS6_14ELS6_156ELS6_150ELS6_254ELS6_136ELS6_212ELS6_160ELS6_240ELS6_30ELS6_217ELS6_222ELS6_218ELS6_226ELS6_182ELS6_249ELS6_224ELS6_13ELS6_169ELS6_76ELS6_173ELS6_15ELS6_236ELS6_170ELS6_230ELS6_110ELS6_207ELS6_104ELS6_155ELS6_247ELS6_27ELS6_80EEEEEEEDav
432
433
template <util::detail::Hex str>
434
0
constexpr auto operator""_hex_u8() { return std::bit_cast<std::array<uint8_t, str.bytes.size()>>(str.bytes); }
435
436
template <util::detail::Hex str>
437
constexpr auto operator""_hex_v() { return std::vector<std::byte>{str.bytes.begin(), str.bytes.end()}; }
438
439
template <util::detail::Hex str>
440
0
inline auto operator""_hex_v_u8() { return std::vector<uint8_t>{UCharCast(str.bytes.data()), UCharCast(str.bytes.data() + str.bytes.size())}; }
441
442
} // inline namespace hex_literals
443
} // namespace util
444
445
#endif // BITCOIN_UTIL_STRENCODINGS_H