Remove Ethash and Pearl backends; keep Equihash 192,7 only

Drop the non-Equihash algorithms and their integration points:
- delete src/ethash.rs + src/ethash/ and src/pearl.rs + src/pearl/
- remove the ethash/pearl/pearl-cuda features and pearl-only deps
  (blake3, primitive-types, rand, bincode, base64) from Cargo.toml
- drop the --algo flag and the pearl/ethash dispatch branches in main.rs
- remove the pearl-cuda NVRTC linking from build.rs
- drop the stale /pearl-dump/ .gitignore entry

Builds check cleanly with default features and --no-default-features.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
jackpotincorporated
2026-06-05 23:31:32 -04:00
parent e2fab622b5
commit 4dd54cb839
30 changed files with 7 additions and 107105 deletions
-562
View File
@@ -1,562 +0,0 @@
//! CUDA Ethash backend (feature `ethash`, default-off) — drives miniZ's extracted
//! Ethash/etchash solver by replaying a captured launch trace, the same idea as
//! `src/cuda.rs` for Equihash 192,7 but adapted to Ethash's DAG+search shape.
//!
//! ## What was reverse-engineered (see `src/ethash/README.md`, `pearl-dump/`)
//!
//! miniZ resolves the driver API via `dlopen("libcuda.so.1")` + `dlsym`, so the
//! launch trace was captured with `pearl-dump/dlhook.so` (redirects that dlopen to
//! `cuhook.so`) + `pearl-dump/cuhook.so` (logs allocs, `cuModuleGetGlobal`
//! constants, HtoD, and — packing the `kernelParams` array by the demangled
//! signatures — every kernel's args). The recovered ABI:
//!
//! * **DAG build** — `digitf<…>(u32 start, hash64* dag, u64 dag_items,
//! hash64* cache, u32 cache_items, …)` launched 539× with grid 512 / block
//! 256, `start` stepping by 512*256 to cover the DAG. Only `start` varies.
//! * **Search** — `equihash<…>(u64 start_nonce, Search_results* out)` (miniZ's
//! name; it's Dagger-Hashimoto). The DAG pointer, header and target are NOT
//! args — they live in `__constant__` symbols: `d_dag` (DAG base), `d_header`
//! (32 B), `d_target` (8 B boundary), plus `d_dag_size`/`i_dag_size`/`d_maxmem`.
//! * The **light cache** miniZ uploads (≈67 MB) is captured verbatim to a
//! sidecar so the DAG can be rebuilt and CPU verification uses the same cache.
//!
//! ## How a solve works here
//!
//! `new()` allocates our own DAG/cache/results buffers, uploads the captured
//! cache, writes the constants (rebasing `d_dag` to our DAG), and replays the 539
//! `digitf` launches to build the DAG. `search()` writes `d_header`/`d_target`,
//! launches the `equihash` kernel over a nonce batch, and reads back the
//! `Search_results`. Every GPU nonce is re-checked on the CPU (`verify`) before it
//! could ever be submitted, so a wrong replay can only yield nothing, never a bad
//! share. `selftest()` proves the path end-to-end without a pool.
use std::collections::HashMap;
use std::ffi::{c_int, c_uint, c_void, CStr, CString};
use std::ptr;
use anyhow::{anyhow, Context, Result};
/// CPU light verifier (real Ethash; gates shares before submit).
pub mod verify;
/// Ethash stratum dialect + mining loop.
pub mod stratum;
/// miniZ's Ethash solver, 8 arches (sm_50/60/61/70/75/80/86/120). Same fatbin
/// also covers etchash/ubqhash/reth.
static FATBIN: &[u8] = include_bytes!("ethash/ethash.fatbin");
/// The captured launch trace (alloc table, constant writes, digitf + equihash
/// launches). The ≈67 MB light-cache sidecar it references (`file=…`) is read at
/// runtime from the path recorded in the trace.
static RECORDING: &str = include_str!("ethash/recording.log");
// ---- CUDA Driver API FFI (subset; mirrors src/cuda.rs) ----
type CUresult = c_int;
type CUdevice = c_int;
type CUcontext = *mut c_void;
type CUmodule = *mut c_void;
type CUfunction = *mut c_void;
type CUdeviceptr = u64;
const CUDA_SUCCESS: CUresult = 0;
const CU_LAUNCH_PARAM_END: usize = 0x00;
const CU_LAUNCH_PARAM_BUFFER_POINTER: usize = 0x01;
const CU_LAUNCH_PARAM_BUFFER_SIZE: usize = 0x02;
extern "C" {
fn cuInit(flags: c_uint) -> CUresult;
fn cuDeviceGet(device: *mut CUdevice, ordinal: c_int) -> CUresult;
fn cuCtxCreate_v2(pctx: *mut CUcontext, flags: c_uint, dev: CUdevice) -> CUresult;
fn cuCtxDestroy_v2(ctx: CUcontext) -> CUresult;
fn cuCtxSetCurrent(ctx: CUcontext) -> CUresult;
fn cuModuleLoadData(module: *mut CUmodule, image: *const c_void) -> CUresult;
fn cuModuleUnload(module: CUmodule) -> CUresult;
fn cuModuleGetFunction(f: *mut CUfunction, m: CUmodule, name: *const i8) -> CUresult;
fn cuModuleGetGlobal_v2(dptr: *mut CUdeviceptr, bytes: *mut usize, m: CUmodule, name: *const i8) -> CUresult;
fn cuMemAlloc_v2(dptr: *mut CUdeviceptr, bytesize: usize) -> CUresult;
fn cuMemFree_v2(dptr: CUdeviceptr) -> CUresult;
fn cuMemsetD8_v2(dptr: CUdeviceptr, uc: u8, n: usize) -> CUresult;
fn cuMemcpyHtoD_v2(dst: CUdeviceptr, src: *const c_void, n: usize) -> CUresult;
fn cuMemcpyDtoH_v2(dst: *mut c_void, src: CUdeviceptr, n: usize) -> CUresult;
fn cuLaunchKernel(
f: CUfunction, gx: c_uint, gy: c_uint, gz: c_uint,
bx: c_uint, by: c_uint, bz: c_uint, shared: c_uint, stream: *mut c_void,
params: *mut *mut c_void, extra: *mut *mut c_void,
) -> CUresult;
fn cuCtxSynchronize() -> CUresult;
fn cuGetErrorName(error: CUresult, s: *mut *const i8) -> CUresult;
}
fn check(code: CUresult, what: &str) -> Result<()> {
if code == CUDA_SUCCESS {
return Ok(());
}
let name = unsafe {
let mut p: *const i8 = ptr::null();
if cuGetErrorName(code, &mut p) == CUDA_SUCCESS && !p.is_null() {
CStr::from_ptr(p).to_string_lossy().into_owned()
} else {
format!("CUDA error {code}")
}
};
Err(anyhow!("{what} failed: {name}"))
}
// ---- recording parser ----
fn hex_to_bytes(h: &str) -> Vec<u8> {
(0..h.len() / 2)
.map(|i| u8::from_str_radix(&h[2 * i..2 * i + 2], 16).unwrap_or(0))
.collect()
}
fn triplet(s: &str) -> (u32, u32, u32) {
let v: Vec<u32> = s.split(',').filter_map(|x| x.parse().ok()).collect();
(v.first().copied().unwrap_or(1), v.get(1).copied().unwrap_or(1), v.get(2).copied().unwrap_or(1))
}
struct Launch {
name: String,
grid: (u32, u32, u32),
block: (u32, u32, u32),
shared: u32,
arg: Vec<u8>,
}
/// Everything the replay needs, distilled from the trace.
struct Recording {
allocs: Vec<(u64, u64)>, // (base, size)
consts: Vec<(String, Vec<u8>)>, // constant-symbol writes (sym -> bytes)
cache_base: u64,
cache_size: u64,
cache_file: String,
digitf: Vec<Launch>, // the 539 DAG-build launches
search: Launch, // the first equihash launch (main pool)
dag_base: u64, // d_dag value (captured DAG base)
results_base: u64, // equihash arg[8..16] (captured results ptr)
}
fn field_u64(arg: &[u8], off: usize) -> u64 {
u64::from_le_bytes(arg[off..off + 8].try_into().unwrap())
}
fn parse_recording(text: &str) -> Result<Recording> {
let mut allocs = Vec::new();
let mut consts: Vec<(String, Vec<u8>)> = Vec::new();
let (mut cache_base, mut cache_size, mut cache_file) = (0u64, 0u64, String::new());
let mut digitf = Vec::new();
let mut search: Option<Launch> = None;
let mut dag_base = 0u64;
for line in text.lines() {
if let Some(rest) = line.strip_prefix("[alloc] ") {
// "<size> bytes @ 0x<base>"
let p: Vec<&str> = rest.split_whitespace().collect();
if let (Ok(size), Some(hex)) = (p[0].parse::<u64>(), p.get(3).and_then(|s| s.strip_prefix("0x"))) {
if let Ok(base) = u64::from_str_radix(hex, 16) {
allocs.push((base, size));
}
}
} else if let Some(rest) = line.strip_prefix("[htod] ") {
// "dst=0x.. size=N [(async)] [sym=X] [file=P] first=HEX"
let mut dst = 0u64;
let mut size = 0u64;
let mut sym = None;
let mut file = None;
let mut first = "";
for tok in rest.split_whitespace() {
if let Some(v) = tok.strip_prefix("dst=0x") { dst = u64::from_str_radix(v, 16).unwrap_or(0); }
else if let Some(v) = tok.strip_prefix("size=") { size = v.parse().unwrap_or(0); }
else if let Some(v) = tok.strip_prefix("sym=") { sym = Some(v.to_string()); }
else if let Some(v) = tok.strip_prefix("file=") { file = Some(v.to_string()); }
else if let Some(v) = tok.strip_prefix("first=") { first = v; }
}
if let Some(f) = file {
cache_base = dst;
cache_size = size;
cache_file = f;
}
if let Some(s) = sym {
// `first=` carries up to 32 bytes — full value for every constant here.
let bytes = hex_to_bytes(first);
let n = (size as usize).min(bytes.len());
let val = bytes[..n].to_vec();
if s == "d_dag" && val.len() >= 8 {
dag_base = u64::from_le_bytes(val[..8].try_into().unwrap());
}
// keep the last write per symbol (header/target get rewritten)
if let Some(e) = consts.iter_mut().find(|(k, _)| *k == s) { e.1 = val; }
else { consts.push((s, val)); }
}
} else if let Some(rest) = line.strip_prefix("[REC] ") {
let mut name = "";
let (mut g, mut b, mut sh, mut arg) = ("", "", 0u32, "");
for (i, tok) in rest.split_whitespace().enumerate() {
if i == 0 { name = tok; }
else if let Some(v) = tok.strip_prefix("g=") { g = v; }
else if let Some(v) = tok.strip_prefix("b=") { b = v; }
else if let Some(v) = tok.strip_prefix("sh=") { sh = v.parse().unwrap_or(0); }
else if let Some(v) = tok.strip_prefix("arg=") { arg = v; }
}
let l = Launch {
name: name.to_string(),
grid: triplet(g),
block: triplet(b),
shared: sh,
arg: hex_to_bytes(arg),
};
if name.starts_with("_Z6digitf") {
digitf.push(l);
} else if name.starts_with("_Z8equihash") && search.is_none() {
search = Some(l); // first equihash after the DAG = main-pool search kernel
}
}
}
let search = search.ok_or_else(|| anyhow!("no equihash (search) launch in recording"))?;
if digitf.is_empty() {
return Err(anyhow!("no digitf (DAG-build) launches in recording"));
}
if cache_file.is_empty() {
return Err(anyhow!("recording has no light-cache sidecar (file=…) line"));
}
if dag_base == 0 {
return Err(anyhow!("recording has no d_dag constant write"));
}
let results_base = if search.arg.len() >= 16 { field_u64(&search.arg, 8) } else { 0 };
Ok(Recording { allocs, consts, cache_base, cache_size, cache_file, digitf, search, dag_base, results_base })
}
// ---- Search_results readback ----
//
// Layout recovered empirically (see `selftest`): the kernel keeps up to
// MAX_RESULTS match slots — `mix[i]` (32 B) at offset `i*32`, and the matched
// nonce as a u64 at `NONCE_BASE + i*8`. The mix array fills 0x00..0x100, so there
// are 8 slots. We zero the buffer before each launch, so an unused slot reads as
// nonce 0 / zero mix and is skipped; the CPU verifier is the real gate regardless.
const RESULTS_BYTES: usize = 1 << 20;
const MAX_RESULTS: usize = 8;
const NONCE_BASE: usize = 0x100;
#[derive(Clone, Debug, Default)]
pub struct Found {
pub nonce: u64,
pub mix: [u8; 32],
}
/// Convert a 256-bit big-endian boundary to miniZ's `d_target`: the top 64 bits
/// as a little-endian u64 (the kernel compares `be_top64(result) <= d_target`).
fn target8(target: &[u8; 32]) -> [u8; 8] {
u64::from_be_bytes(target[0..8].try_into().unwrap()).to_le_bytes()
}
pub struct SearchResult {
pub found: Vec<Found>,
}
pub struct EthashSolver {
ctx: CUcontext,
module: CUmodule,
bufs: Vec<CUdeviceptr>,
my_dag: CUdeviceptr,
my_cache: CUdeviceptr,
my_results: CUdeviceptr,
/// captured device ptr -> our device ptr (DAG / cache / results)
remap: HashMap<u64, u64>,
digitf: Vec<(CUfunction, (u32, u32, u32), (u32, u32, u32), u32, Vec<u8>)>,
search_fn: CUfunction,
search_block: (u32, u32, u32),
search_arg: Vec<u8>,
/// raw cache bytes (kept for CPU cross-check via verify::Light::from_raw)
cache_bytes: Vec<u8>,
full_size: usize,
}
unsafe impl Send for EthashSolver {}
impl EthashSolver {
/// Load the fatbin, build the DAG by replaying the captured trace. Uses the
/// bundled recording; the light-cache sidecar is read from the path the
/// recording names (override the recording text via `recording_override`).
pub fn new(device_index: usize) -> Result<Self> {
Self::with_recording(device_index, RECORDING)
}
pub fn with_recording(device_index: usize, recording: &str) -> Result<Self> {
let rec = parse_recording(recording)?;
let cache_bytes = std::fs::read(&rec.cache_file)
.with_context(|| format!("read ethash light-cache sidecar '{}'", rec.cache_file))?;
if cache_bytes.len() as u64 != rec.cache_size {
return Err(anyhow!("cache sidecar size {} != recorded {}", cache_bytes.len(), rec.cache_size));
}
// DAG buffer size = the alloc whose base == d_dag (padded). The dataset
// size the kernels actually index by is `d_dag_size` *128-byte* rows, so
// the hashimoto full_size (bytes) = d_dag_size * 128 (≠ the padded alloc).
let dag_size = rec.allocs.iter().find(|&&(b, _)| b == rec.dag_base).map(|&(_, s)| s)
.ok_or_else(|| anyhow!("d_dag base not found in alloc table"))?;
let dag_rows_128 = rec.consts.iter().find(|(k, _)| k == "d_dag_size")
.and_then(|(_, v)| v.get(..4)).map(|b| u32::from_le_bytes(b.try_into().unwrap()) as usize)
.ok_or_else(|| anyhow!("recording has no d_dag_size constant"))?;
let full_size = dag_rows_128 * 128;
unsafe {
check(cuInit(0), "cuInit")?;
let mut dev: CUdevice = 0;
check(cuDeviceGet(&mut dev, device_index as c_int), "cuDeviceGet")?;
let mut ctx: CUcontext = ptr::null_mut();
check(cuCtxCreate_v2(&mut ctx, 0, dev), "cuCtxCreate")?;
check(cuCtxSetCurrent(ctx), "cuCtxSetCurrent")?;
let mut module: CUmodule = ptr::null_mut();
check(cuModuleLoadData(&mut module, FATBIN.as_ptr() as *const c_void), "cuModuleLoadData (ethash)")?;
let mut bufs = Vec::new();
let alloc = |sz: usize, bufs: &mut Vec<CUdeviceptr>| -> Result<CUdeviceptr> {
let mut p: CUdeviceptr = 0;
check(cuMemAlloc_v2(&mut p, sz), "cuMemAlloc")?;
check(cuMemsetD8_v2(p, 0, sz), "cuMemsetD8")?;
bufs.push(p);
Ok(p)
};
let my_dag = alloc(dag_size as usize, &mut bufs)?;
let my_cache = alloc(cache_bytes.len(), &mut bufs)?;
let my_results = alloc(RESULTS_BYTES, &mut bufs)?;
// Upload the captured light cache.
check(cuMemcpyHtoD_v2(my_cache, cache_bytes.as_ptr() as *const c_void, cache_bytes.len()), "cuMemcpyHtoD(cache)")?;
let mut remap = HashMap::new();
remap.insert(rec.dag_base, my_dag);
remap.insert(rec.cache_base, my_cache);
if rec.results_base != 0 { remap.insert(rec.results_base, my_results); }
// Write the constants (rebasing d_dag to our DAG buffer).
for (sym, bytes) in &rec.consts {
if sym == "d_header" || sym == "d_target" {
continue; // set per-search
}
let mut v = bytes.clone();
if sym == "d_dag" && v.len() >= 8 {
v[..8].copy_from_slice(&my_dag.to_le_bytes());
}
set_global(module, sym, &v)?;
}
// Resolve + rebase the digitf launches, then replay them to build the DAG.
let mut digitf = Vec::with_capacity(rec.digitf.len());
for l in &rec.digitf {
let f = get_function(module, &l.name)?;
let arg = rebase(&l.arg, &remap);
digitf.push((f, l.grid, l.block, l.shared, arg));
}
let search_fn = get_function(module, &rec.search.name)?;
let search_arg = rebase(&rec.search.arg, &remap);
let solver = Self {
ctx, module, bufs, my_dag, my_cache, my_results, remap,
digitf, search_fn, search_block: rec.search.block, search_arg,
cache_bytes, full_size,
};
solver.build_dag()?;
Ok(solver)
}
}
/// Replay the 539 digitf launches to build the DAG (once per epoch).
fn build_dag(&self) -> Result<()> {
unsafe {
check(cuCtxSetCurrent(self.ctx), "cuCtxSetCurrent")?;
for (f, grid, block, shared, arg) in &self.digitf {
launch(*f, *grid, *block, *shared, arg)?;
}
check(cuCtxSynchronize(), "cuCtxSynchronize(dag)")?;
}
let _ = (self.my_dag, self.my_cache, &self.remap);
Ok(())
}
/// Run one nonce-batch search. `target8` is the 8-byte boundary miniZ compares
/// (`d_target`). `grid_x` threads-blocks (each block is `search_block` threads)
/// = `grid_x * block` nonces tested starting at `start_nonce`.
fn search_raw(&self, header: &[u8; 32], target8: &[u8; 8], start_nonce: u64, grid_x: u32) -> Result<Vec<u8>> {
unsafe {
check(cuCtxSetCurrent(self.ctx), "cuCtxSetCurrent")?;
set_global(self.module, "d_header", header)?;
set_global(self.module, "d_target", target8)?;
// zero a generous prefix so leftover data can't masquerade as results.
check(cuMemsetD8_v2(self.my_results, 0, 64 * 1024), "cuMemsetD8(results)")?;
let mut arg = self.search_arg.clone();
arg[0..8].copy_from_slice(&start_nonce.to_le_bytes()); // start_nonce
// arg[8..16] already rebased to my_results in new()
launch(self.search_fn, (grid_x, 1, 1), self.search_block, 0, &arg)?;
check(cuCtxSynchronize(), "cuCtxSynchronize(search)")?;
let mut out = vec![0u8; 64 * 1024];
check(cuMemcpyDtoH_v2(out.as_mut_ptr() as *mut c_void, self.my_results, out.len()), "cuMemcpyDtoH(results)")?;
Ok(out)
}
}
/// Decode a `Search_results` buffer: mix[i] @ i*32, nonce[i] (u64) @ 0x100+i*8.
fn decode(buf: &[u8]) -> Vec<Found> {
let mut found = Vec::new();
for i in 0..MAX_RESULTS {
let no = NONCE_BASE + i * 8;
if no + 8 > buf.len() { break; }
let nonce = u64::from_le_bytes(buf[no..no + 8].try_into().unwrap());
if nonce == 0 { continue; } // empty slot
let mut mix = [0u8; 32];
mix.copy_from_slice(&buf[i * 32..i * 32 + 32]);
found.push(Found { nonce, mix });
}
found
}
/// Public search: full 256-bit `target`, returns decoded matches.
pub fn search(&self, header: &[u8; 32], target: &[u8; 32], start_nonce: u64) -> Result<SearchResult> {
let buf = self.search_raw(header, &target8(target), start_nonce, 399360)?;
Ok(SearchResult { found: Self::decode(&buf) })
}
/// A CPU `Light` over the exact cache the GPU used — for cross-checking.
pub fn cpu_light(&self) -> verify::Light {
verify::Light::from_raw(&self.cache_bytes, self.full_size)
}
}
impl Drop for EthashSolver {
fn drop(&mut self) {
unsafe {
cuCtxSetCurrent(self.ctx);
for &b in &self.bufs {
cuMemFree_v2(b);
}
cuModuleUnload(self.module);
cuCtxDestroy_v2(self.ctx);
}
}
}
/// Rebase any 8-byte field that exactly equals a captured base pointer.
fn rebase(arg: &[u8], remap: &HashMap<u64, u64>) -> Vec<u8> {
let mut a = arg.to_vec();
let mut off = 0;
while off + 8 <= a.len() {
let v = u64::from_le_bytes(a[off..off + 8].try_into().unwrap());
if let Some(&nv) = remap.get(&v) {
a[off..off + 8].copy_from_slice(&nv.to_le_bytes());
}
off += 8;
}
a
}
fn get_function(m: CUmodule, name: &str) -> Result<CUfunction> {
let cname = CString::new(name).map_err(|_| anyhow!("kernel name NUL"))?;
let mut f: CUfunction = ptr::null_mut();
unsafe { check(cuModuleGetFunction(&mut f, m, cname.as_ptr()), "cuModuleGetFunction")? };
Ok(f)
}
/// Write `bytes` into a `__constant__` symbol resolved by name.
fn set_global(m: CUmodule, symbol: &str, bytes: &[u8]) -> Result<()> {
let cname = CString::new(symbol)?;
unsafe {
let mut dptr: CUdeviceptr = 0;
let mut sz: usize = 0;
check(cuModuleGetGlobal_v2(&mut dptr, &mut sz, m, cname.as_ptr()), "cuModuleGetGlobal")?;
check(cuMemcpyHtoD_v2(dptr, bytes.as_ptr() as *const c_void, bytes.len()), "cuMemcpyHtoD(const)")?;
}
Ok(())
}
/// Launch via the `extra`/BUFFER_POINTER path — identical to src/cuda.rs::launch.
unsafe fn launch(f: CUfunction, grid: (u32, u32, u32), block: (u32, u32, u32), shared: u32, arg: &[u8]) -> Result<()> {
let mut argsz = arg.len();
let mut extra: [*mut c_void; 5] = [
CU_LAUNCH_PARAM_BUFFER_POINTER as *mut c_void,
arg.as_ptr() as *mut c_void,
CU_LAUNCH_PARAM_BUFFER_SIZE as *mut c_void,
&mut argsz as *mut usize as *mut c_void,
CU_LAUNCH_PARAM_END as *mut c_void,
];
check(
cuLaunchKernel(f, grid.0, grid.1, grid.2, block.0, block.1, block.2, shared, ptr::null_mut(), ptr::null_mut(), extra.as_mut_ptr()),
"cuLaunchKernel",
)
}
/// End-to-end GPU self-test (no pool needed): build the DAG by replaying the
/// captured trace, choose a hard target on the CPU so one nonce in a batch is the
/// winner, run the GPU search, decode the `Search_results`, and confirm the GPU
/// returns that exact nonce with a mix that passes the full CPU verifier. Because
/// the CPU `Light` uses the same captured cache the GPU DAG was built from, a PASS
/// proves the GPU is computing real, correct Dagger-Hashimoto. Returns a report.
pub fn selftest(device: usize) -> Result<String> {
let mut r = String::new();
let solver = EthashSolver::with_recording(device, RECORDING)?;
let light = solver.cpu_light();
r.push_str(&format!(
"DAG built (replayed {} digitf launches): full_size={} bytes ({} 64B rows)\n",
solver.digitf.len(), solver.full_size, solver.full_size / 64
));
let header: [u8; 32] = *b"jackpotminer-ethash-selftest!!!\0";
// Evaluate a batch on the CPU; the lowest result becomes a hard target so the
// GPU should return exactly that nonce.
let n_probe = 512u64;
let base = 0x2000_0000u64;
let mut best = (u64::MAX, base, [0u8; 32], [0u8; 32]); // (be_top64, nonce, mix, res)
for i in 0..n_probe {
let (mix, res) = light.hashimoto(&header, base + i);
let top = u64::from_be_bytes(res[0..8].try_into().unwrap());
if top < best.0 { best = (top, base + i, mix, res); }
}
let (best_top, best_nonce, best_mix, best_res) = best;
let grid = (n_probe as u32).div_ceil(solver.search_block.0);
let buf = solver.search_raw(&header, &best_top.to_le_bytes(), base, grid)?;
let found = EthashSolver::decode(&buf);
r.push_str(&format!(
"GPU search ({} nonces, target=top64 {:#018x}): {} match(es); CPU winner={:#x}\n",
grid as u64 * solver.search_block.0 as u64, best_top, found.len(), best_nonce
));
// The GPU must return the CPU winner with the matching mix, and it must pass
// the full 256-bit CPU verifier (the real submit gate). `best_res` is the
// winner's own result, so `result <= target` holds for it.
let mut pass = false;
for f in &found {
let mix_ok = f.mix == best_mix;
let verified = verify::verify(&light, &header, f.nonce, &best_res, Some(&f.mix));
r.push_str(&format!(" nonce={:#x} mix_match={mix_ok} cpu_verify={verified}\n", f.nonce));
if f.nonce == best_nonce && mix_ok && verified { pass = true; }
}
r.push_str(if pass {
"\n[result] PASS \u{2713} — GPU built the DAG, found the nonce, and it CPU-verifies\n"
} else {
"\n[result] FAIL \u{2717}\n"
});
if !pass {
return Err(anyhow!("ethash GPU search self-test did not verify:\n{r}"));
}
Ok(r)
}
#[cfg(test)]
mod tests {
use super::*;
/// Requires a CUDA GPU + the captured cache sidecar; run explicitly:
/// `cargo test --features ethash ethash::tests::gpu_selftest -- --ignored --nocapture`
#[test]
#[ignore]
fn gpu_selftest() {
match selftest(0) {
Ok(report) => println!("{report}"),
Err(e) => panic!("ethash selftest failed: {e:?}"),
}
}
}
-121
View File
@@ -1,121 +0,0 @@
# `src/ethash/` — miniZ's Ethash solver (CUDA backend, in progress)
Adds the **Ethash family** (ethash · etchash · ubqhash · reth — same 15-kernel
solver) to the miner, alongside the Equihash 192,7 backend in `src/cuda.rs`.
Built from miniZ v2.5e3's extracted kernels
(`~/code/miniz-dump/solver_all/ethash/`).
> **Status: GPU search WORKING (validated end-to-end on an RTX 5080).**
> The DAG build + hashimoto search now run on the GPU by replaying a captured
> miniZ etchash trace (`recording.log`): `../ethash.rs` builds the DAG (539
> `digitf` launches), injects `d_header`/`d_target`, runs the `equihash` search
> kernel, and decodes `Search_results`. `ethash::selftest` proves it without a
> pool — it picks a hard target on the CPU, runs the GPU search, and confirms the
> GPU returns that nonce with a mix that passes the full CPU verifier (same
> captured cache). The CPU verifier (`verify.rs`) is pinned by a full **hashimoto
> KAT** vs go-ethereum, and the **stratum loop** (`stratum.rs`) wires search →
> verify → submit. `--algo ethash|etchash` is live in `main.rs`.
>
> Run the GPU self-test:
> ```sh
> CUDA_VISIBLE_DEVICES=0 cargo test --features ethash \
> ethash::tests::gpu_selftest -- --ignored --nocapture
> ```
> It needs the ≈67 MB light-cache sidecar the recording references
> (`pearl-dump/ethash.rec.htod00.bin`) — regenerate it with a fresh capture (see
> *How the trace was captured*). The bundled `recording.log` is pinned to one
> etchash epoch; re-capture to mine a newer epoch (see *Caveats*).
## Contents
| path | role |
|---|---|
| `ethash.fatbin` | **embeddable** — 8-arch solver (sm_50/60/61/70/75/80/86/120) |
| `cubins/ethash.sm_*.cubin` | reference — per-arch cubins |
| `sass/ethash.sm_{75,80,86,120}.sass` | reference — SASS (sm_50/60/61/70 are cubin-only on CUDA 13.3) |
| `functions.demangled.txt` | reference — kernel index |
| `../ethash.rs` | the backend (feature `ethash`, default-off) — recording parser, DAG-build + search replay, `Search_results` decode, `selftest`. |
| `recording.log` | **captured miniZ etchash launch trace** (allocs, constants, 539 `digitf` + the `equihash` launch with packed args). Drives the replay. |
| `verify.rs` | **CPU light verifier** — inline Keccak (KAT-tested) + mkcache + hashimoto_light + boundary check. `Light::from_raw` builds from the captured cache. Gates shares before submit. |
| `stratum.rs` | **Ethash stratum** (EthereumStratum/1.0.0) + difficulty→target + the mining loop (search → verify → submit). |
## How Ethash differs from Equihash (why it's a new subsystem)
Equihash 192,7 replays a **fixed kernel pass per header** — stateless, all inputs
in the kernel arg buffers. Ethash is **DAG + search**:
- `digitf<…>` — builds the **DAG** for the current epoch (multi-GB, regenerated
every ~30k blocks). Runs once per epoch, not per nonce.
- `equihash<…>` — the per-nonce **hashimoto search** kernel (the name is miniZ's;
it's Dagger-Hashimoto, not Equihash). Signature is `(unsigned long start_nonce,
Search_results*)` — so **the header and target are NOT kernel args**; miniZ
pushes them into `__constant__` memory via `cuModuleGetGlobal` + `cuMemcpyHtoD`.
How the replay handles this:
1. **Two cadences**`digitf` is replayed once at `new()` to build the DAG;
`equihash` runs per nonce batch in `search()`.
2. **Constant-memory injection** — the trace captures every `cuModuleGetGlobal`
symbol and the writes to them. The replay writes `d_dag` (rebased to our DAG
buffer), `d_dag_size`/`i_dag_size`/`d_maxmem`/`d_multi` verbatim, and per-search
`d_header` (32 B) + `d_target` (8 B = boundary top-64 bits, little-endian).
3. **`Search_results` readback** — recovered layout: `mix[i]` (32 B) at offset
`i*32`, matched nonce (u64) at `0x100 + i*8`, 8 slots. We zero the buffer before
each launch, decode non-empty slots, and CPU-verify each.
## Recovered ABI (from `recording.log`)
| kernel | grid / block | args (packed from kernelParams) |
|---|---|---|
| `digitf<1099511627778,256,2>` | 512 / 256, ×539 | `(u32 start, hash64* dag, u64 dag_rows128, hash64* cache, u32 cache_rows, …)` — only `start` varies (steps by 512·256) |
| `equihash<5806517278900176776,…>` | 399360 / 64 | `(u64 start_nonce, Search_results* out)` |
`full_size` (hashimoto, 64-B rows) = `d_dag_size` × 128; cache rows = `d_dag` light
buffer / 64. The DAG buffer base lives in the `d_dag` constant (rebased on replay).
## How the trace was captured
miniZ resolves the driver API by `dlopen("libcuda.so.1")` + `dlsym`, so a plain
`LD_PRELOAD` of a `cuLaunchKernel` shim is bypassed. Two preloads defeat this:
`pearl-dump/dlhook.so` redirects the libcuda `dlopen` to `pearl-dump/cuhook.so`
(linked against libcuda), so miniZ's `dlsym(handle, "cuXxx")` finds our wrappers
first and falls through to real libcuda for the rest. `cuhook.so` logs allocs,
`cuModuleGetGlobal` symbols, HtoD (tagging constant writes by symbol, dumping the
≈67 MB light cache to a sidecar), and — packing the `kernelParams` array by the
demangled signatures — every kernel's args.
```sh
cd pearl-dump && gcc -shared -fPIC -O2 -o cuhook.so cuhook.c -ldl -lcuda
gcc -shared -fPIC -O2 -o dlhook.so dlhook.c -ldl
H=$PWD; ZCL_TRACE=$H/ethash.rec CUHOOK_SO=$H/cuhook.so \
LD_PRELOAD="$H/dlhook.so:$H/cuhook.so" CUDA_VISIBLE_DEVICES=0 \
miniZ --par etchash --url 0x<addr>.w@etc.2miners.com:1010 --pass x --nocolour
cp ethash.rec ../src/ethash/recording.log # the sidecar stays in pearl-dump/
```
The whole loop is end-to-end: GPU `search()``verify::verify` (rejects anything
that doesn't meet the full 256-bit target) → `submit`.
## Caveats
- **Epoch-pinned.** `recording.log` (and its cache sidecar) capture one etchash
epoch's DAG-build sequence; the replay mines that epoch. Re-capture to follow a
new epoch — the `digitf` loop isn't yet generalized to arbitrary `dag_size`.
- **Cache sidecar not committed** (67 MB). The recording names its path; regenerate
by re-capturing on the host.
- Same fatbin covers **etchash/ubqhash/reth**; embed those the same way for distinct
`--algo` targets.
## Kernels & arches
- Families: `digitf` (DAG build) · `equihash` (search). Many `equihash<…>`
instantiations = per-epoch/difficulty constant sets.
- Arches in the fatbin: sm_50/60/61/70/75/80/86/120 (SASS for 75/80/86/120).
- Same solver covers **etchash/ubqhash/reth** (per `RE_INDEX.md`); embed those
fatbins the same way if you want them as distinct `--algo` targets.
Regenerate the fatbin:
```sh
D=~/code/miniz-dump/solver_all/ethash/arches
fatbinary --create src/ethash/ethash.fatbin -64 \
$(for a in 50 60 61 70 75 80 86 120; do echo --image3 kind=elf,sm=$a,file=$D/ethash.sm_$a.cubin; done)
```
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-15
View File
@@ -1,15 +0,0 @@
void digitf<1099511627778ul, 256u, 2u>(unsigned int, hash64_t*, unsigned long, hash64_t*, unsigned int, hash64_t*, unsigned int, int)
void equihash<11171057592165259242ul, 19060100871ul, 0ul, 1581690978610ul, 350u, 64u, 0u>(unsigned long, Search_results*)
void equihash<1156119478540188650ul, 19060100871ul, 0ul, 1238158546226ul, 45875550u, 64u, 0u>(unsigned long, Search_results*)
void equihash<13423733299476243336ul, 19060100871ul, 0ul, 1514112406532ul, 52429150u, 64u, 0u>(unsigned long, Search_results*)
void equihash<14590196273788145336ul, 19060100871ul, 0ul, 1544176108596ul, 52429150u, 64u, 0u>(unsigned long, Search_results*)
void equihash<18078733364950818538ul, 19059052295ul, 0ul, 1582831837746ul, 350u, 32u, 0u>(unsigned long, Search_results*)
void equihash<4323707188578864008ul, 19060100871ul, 0ul, 4880294298930ul, 300u, 64u, 0u>(unsigned long, Search_results*)
void equihash<5806499686714125400ul, 19060100871ul, 0ul, 4880223711522ul, 300u, 64u, 0u>(unsigned long, Search_results*)
void equihash<5806517278900176776ul, 19060100871ul, 0ul, 4880223711538ul, 300u, 64u, 0u>(unsigned long, Search_results*)
void equihash<5947736340452537176ul, 912413298439ul, 0ul, 4884518704162ul, 300u, 64u, 13u>(unsigned long, Search_results*)
void equihash<5948598445146122120ul, 912413298439ul, 0ul, 4884585812274ul, 300u, 64u, 13u>(unsigned long, Search_results*)
void equihash<5966612843662731144ul, 912413298439ul, 0ul, 4884585828658ul, 300u, 64u, 13u>(unsigned long, Search_results*)
void equihash<7689212128876921322ul, 19060100871ul, 0ul, 1581689959218ul, 350u, 64u, 0u>(unsigned long, Search_results*)
void equihash<7694296270645768986ul, 19060100871ul, 0ul, 1581689946402ul, 350u, 64u, 0u>(unsigned long, Search_results*)
void equihash<7706962644602759706ul, 19060100871ul, 0ul, 1581689942562ul, 350u, 64u, 0u>(unsigned long, Search_results*)
-754
View File
@@ -1,754 +0,0 @@
[alloc] 16397631488 bytes @ 0x7f29e0000000
[global] name=d_header dptr=0x10010800200 size=0
[global] name=d_target dptr=0x10010800300 size=0
[global] name=d_multi dptr=0x10010800180 size=0
[htod] dst=0x10010800180 size=4 sym=d_multi first=01000000
[alloc] 70647232 bytes @ 0x10010e00000
[alloc] 4521459584 bytes @ 0x7f2a60000000
[htod] dst=0x10010e00000 size=70647232 file=/home/access/code/jackpotminer/pearl-dump/ethash.rec.htod00.bin first=18b49e5f151d047ba17b702b89408be83021c5aba64e4d5a496cf623fa5e57f1
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000000000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000020000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000040000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000060000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000080000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000100000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000120000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000140000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000160000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000180000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000200000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000220000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000240000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000260000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000280000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000300000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000320000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000340000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000360000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000380000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000400000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000420000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000440000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000460000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000480000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000500000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000520000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000540000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000560000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000580000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000600000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000620000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000640000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000660000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000680000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000700000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000720000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000740000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000760000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000780000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000800000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000820000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000840000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000860000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000880000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000900000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000920000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000940000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000960000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000980000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a00000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a20000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a40000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a60000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a80000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000aa0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ac0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ae0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b00000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b20000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b40000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b60000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b80000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ba0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000bc0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000be0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c00000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c20000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c40000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c60000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c80000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ca0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000cc0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ce0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d00000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d20000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d40000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d60000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d80000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000da0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000dc0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000de0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e00000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e20000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e40000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e60000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e80000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ea0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ec0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ee0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f00000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f20000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f40000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f60000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f80000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fa0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fc0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fe0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000000100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000020100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000040100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000060100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000080100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000100100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000120100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000140100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000160100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000180100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000200100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000220100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000240100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000260100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000280100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000300100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000320100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000340100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000360100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000380100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000400100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000420100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000440100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000460100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000480100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000500100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000520100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000540100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000560100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000580100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000600100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000620100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000640100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000660100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000680100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000700100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000720100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000740100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000760100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000780100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000800100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000820100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000840100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000860100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000880100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000900100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000920100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000940100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000960100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000980100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a00100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a20100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a40100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a60100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a80100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000aa0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ac0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ae0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b00100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b20100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b40100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b60100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b80100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ba0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000bc0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000be0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c00100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c20100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c40100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c60100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c80100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ca0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000cc0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ce0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d00100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d20100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d40100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d60100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d80100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000da0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000dc0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000de0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e00100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e20100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e40100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e60100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e80100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ea0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ec0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ee0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f00100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f20100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f40100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f60100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f80100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fa0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fc0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fe0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000000200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000020200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000040200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000060200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000080200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000100200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000120200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000140200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000160200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000180200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000200200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000220200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000240200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000260200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000280200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000300200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000320200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000340200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000360200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000380200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000400200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000420200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000440200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000460200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000480200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000500200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000520200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000540200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000560200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000580200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000600200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000620200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000640200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000660200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000680200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000700200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000720200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000740200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000760200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000780200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000800200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000820200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000840200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000860200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000880200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000900200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000920200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000940200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000960200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000980200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a00200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a20200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a40200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a60200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a80200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000aa0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ac0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ae0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b00200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b20200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b40200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b60200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b80200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ba0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000bc0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000be0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c00200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c20200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c40200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c60200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c80200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ca0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000cc0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ce0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d00200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d20200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d40200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d60200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d80200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000da0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000dc0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000de0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e00200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e20200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e40200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e60200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e80200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ea0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ec0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ee0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f00200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f20200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f40200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f60200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f80200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fa0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fc0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fe0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000000300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000020300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000040300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000060300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000080300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000100300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000120300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000140300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000160300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000180300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000200300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000220300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000240300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000260300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000280300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000300300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000320300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000340300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000360300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000380300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000400300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000420300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000440300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000460300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000480300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000500300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000520300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000540300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000560300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000580300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000600300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000620300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000640300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000660300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000680300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000700300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000720300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000740300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000760300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000780300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000800300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000820300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000840300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000860300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000880300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000900300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000920300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000940300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000960300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000980300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a00300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a20300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a40300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a60300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a80300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000aa0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ac0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ae0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b00300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b20300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b40300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b60300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b80300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ba0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000bc0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000be0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c00300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c20300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c40300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c60300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c80300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ca0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000cc0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ce0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d00300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d20300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d40300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d60300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d80300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000da0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000dc0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000de0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e00300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e20300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e40300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e60300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e80300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ea0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ec0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ee0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f00300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f20300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f40300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f60300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f80300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fa0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fc0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fe0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000000400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000020400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000040400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000060400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000080400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000a0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000c0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000e0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000100400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000120400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000140400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000160400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000180400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001a0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001c0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001e0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000200400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000220400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000240400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000260400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000280400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002a0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002c0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002e0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000300400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000320400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000340400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[global] name=d_dag dptr=0x10010800190 size=8
[htod] dst=0x10010800190 size=8 sym=d_dag first=000000602a7f0000
[global] name=i_dag_size dptr=0x1001080018c size=4
[htod] dst=0x1001080018c size=4 sym=i_dag_size first=79000000
[global] name=d_dag_size dptr=0x10010800184 size=4
[htod] dst=0x10010800184 size=4 sym=d_dag_size first=ffff1a02
[global] name=h_dag dptr=0x10010800198 size=8
[htod] dst=0x10010800198 size=8 sym=h_dag first=0000000000000000
[global] name=d_maxmem dptr=0x10010800188 size=4
[htod] dst=0x10010800188 size=4 sym=d_maxmem first=ffff1a02
[htod] dst=0x10010800200 size=32 (async) sym=d_header first=4b5cc07df9bf092b5135ee3efceb305a2c25e0063fb32b8a75f6efff0821eb7c
[htod] dst=0x10010800300 size=8 (async) sym=d_target first=ffffff7f00000000
[htod] dst=0x10010800200 size=32 (async) sym=d_header first=4b5cc07df9bf092b5135ee3efceb305a2c25e0063fb32b8a75f6efff0821eb7c
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=008cc9c26f2dbd6b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=0056c6ea05a66b920000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00142d9e7b335b700000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=009e27c127d730460000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00960eb5b26557b80000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=009bb9bcacbfc5db0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=0015134cfc8d3b540000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=007d21b1f805c4e20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=003cba0fe139cb910000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00bc718ed81613580000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00d3000bdc6c35040000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=006f17c0e2f4ce880000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00ee7c031958f3920000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00ccdc37cb70b8ca0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00ca1e835e228b8e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=002d2be27b5b18700000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=0065dc6267156ce80000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=249990,1,1 b=64,1,1 sh=0 sz=16 arg=00e095c9bac7b07b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=244494,1,1 b=64,1,1 sh=0 sz=16 arg=00732cb471af18760000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=244494,1,1 b=64,1,1 sh=0 sz=16 arg=00c49ff363f041270000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=244683,1,1 b=64,1,1 sh=0 sz=16 arg=00fede16b6ba8e7a0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=244861,1,1 b=64,1,1 sh=0 sz=16 arg=002973a67bb86f800000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245034,1,1 b=64,1,1 sh=0 sz=16 arg=00bf3e9351c303050000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245192,1,1 b=64,1,1 sh=0 sz=16 arg=0090c1f930b3e4b10000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245344,1,1 b=64,1,1 sh=0 sz=16 arg=00215d41dd5bf0890000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245483,1,1 b=64,1,1 sh=0 sz=16 arg=000aad74dec71cd10000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245618,1,1 b=64,1,1 sh=0 sz=16 arg=00217a2346a0b2eb0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245742,1,1 b=64,1,1 sh=0 sz=16 arg=00edcc828a0333130000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245861,1,1 b=64,1,1 sh=0 sz=16 arg=00258e68af8777b30000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245970,1,1 b=64,1,1 sh=0 sz=16 arg=008996f2556b02a20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246077,1,1 b=64,1,1 sh=0 sz=16 arg=007241152bdb08dc0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246177,1,1 b=64,1,1 sh=0 sz=16 arg=0034d10f483596e20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246274,1,1 b=64,1,1 sh=0 sz=16 arg=00bbadf9f3637c500000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246364,1,1 b=64,1,1 sh=0 sz=16 arg=00eb57b99f863bf50000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246451,1,1 b=64,1,1 sh=0 sz=16 arg=004d488b8a38132d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246535,1,1 b=64,1,1 sh=0 sz=16 arg=00899bf65d79ad5e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246612,1,1 b=64,1,1 sh=0 sz=16 arg=001a01f941ae45830000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246688,1,1 b=64,1,1 sh=0 sz=16 arg=00d1262980d010c80000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246762,1,1 b=64,1,1 sh=0 sz=16 arg=00b2c1782cf05baa0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246827,1,1 b=64,1,1 sh=0 sz=16 arg=00e080d052d817d30000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246894,1,1 b=64,1,1 sh=0 sz=16 arg=00a7880a5572450f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00f46dc45573ff200000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=000eced8ac71f6a80000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=006b006a3dca862a0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0016c681dc71d5370000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00264bf7b871fbae0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c2442c15cf5f950000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c63754f842a2e40000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=005bbbfdbbd0f1310000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c00ddcef04872a0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0060c6dfca3827c20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c8fcabe144d6ae0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c5453d0bdf149a0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00a0b3a2855ac5120000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00b78428d76fc7760000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0064c7c834fa175f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=008f5066c39584f00000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=003d578a917e7f2d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c1bfb2e4f50a840000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=008beb88cfaf33590000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00256689260bcd550000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00e507d74ce5cd480000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00664ab883bf34b50000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00f031f5c606f4070000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=008b49431d26b2af0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00e70ae9e47b117c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0042cf28607b6cef0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=005c3ecdf0cc25fc0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00a6e4a20df600e10000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00f811e4bf4dc19a0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=008c2269290faa790000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00ad326fbf3428e20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00335655d58e6b5a0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=000fb316c624018f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00ce1dd9728e505d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00030a637e9688790000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00a4ea4ee00b47790000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=002d8eae9210a9b20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0009910566a307bf0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=008dfd6ad446e47c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=003f657e1e529dff0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00b1accabb2db8a20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00f621c7979138ed0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00a077eedae868fe0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0050812c3a7efb890000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=005b4ccc19a464680000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00dc32d53ef44a9f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0083c31d1fa65f020000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00af6422dcaf9a9b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00f4627d3265f6bf0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00fde1488b5bc9910000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=004139e5656127680000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00b2d50a69e43ec90000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00856af14fc506a60000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0035a46dd7e5095c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00475c9d16cc8ad90000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=004d5dfb1e49a4720000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=001ce3c1fc054e370000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00ac0033bc6d554f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=006ef6b62150f4ce0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=007ac17b00b4394b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=000ccdcbf7ca94f50000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=002c9175fcb8570b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00adb08ac8de90780000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00705c9db586c60d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=004501e0c4863ffb0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0074deacc9a177980000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0052bef2eb43a0070000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=007c947a4f04c0030000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00250debc9fc5a8e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=000d748f46d351e30000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=005aa5e77f67acfb0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0041ec215861db760000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00f843d318be96b70000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=007555b22c94827f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0011a2d854874b780000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00855f45d6385fc20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0000b34d1cad75160000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=009e564c1d629e260000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0057f5dbe4ec6c0c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=009128ddc500a6ad0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=005f320b0dcdd1c60000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=001ca5d7a7ebe64c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c2c0d60c50bdd60000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00d1ff80924845aa0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0040498dfc2059610000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=008fb5732442d6810000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0093be98baba813f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00110a08c416f2a00000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=0031b966fa795b0d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=009aaf337e5a1c9f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00aac7bf185a7f890000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=0014274dcca432350000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00170bc53ef1dcca0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=005069bbe0791c3b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00acb5ad4878b1480000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00e7864d886008ce0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00c68d5efbed3b310000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=000c9f03a7e6554b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=007f56f22557b40f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00201aea2fdd74f30000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00198253bebfd6200000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=0013e68a37ba8c2d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00247ade23838bf60000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00e943cabce1a0c70000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=003f3c9bad58cb480000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00084ccde415d2ff0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=008c4f486bdf111e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00b9b0d80f376fb50000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=007f4c1c2bbc02320000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=001f220551498e5f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=007035e4313dc5130000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00175fe3bd2360a90000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00840c180eb709dc0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00ebed20bb100b570000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=004d2d18fce4960b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=009c9861b3a0136c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00da49389f805a780000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00e4c4876bdd29e80000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0039ea25fe7d8e1d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0038072a5c4124e90000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0011d3811bf882ad0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0076a4d3035ad26e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00971ef6197f303d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0069b6ebf473f4f90000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00d7b91164c30be40000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=006d5fb644456a180000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00af17a003d5b68b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=000fa6519fbe64490000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=007659e85ca24c540000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00af775f733e0b0e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00ec977ae34b876e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=001d3b495d72659b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0089518bd27a72a40000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00e64e21ca29b7440000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00d2a757241ac7e90000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=001b4dc1710be33e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c741b0010dc41e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00ff2cd914cb2e6c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00bdddc141618ef60000a01000010000 (packed-from-kernelParams)
[htod] dst=0x10010800200 size=32 (async) sym=d_header first=8f67a6447b1dca8873dc97f3ff4cedc073cf7f328ca00556ab677f828c3ace71
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00cef2e19d00c9590000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=002251e782a817bc0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00d18c014aeb188c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0004427127b633ec0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00233940d53945530000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c002d1fee680930000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0017a9d24c35b6e80000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00db091a1fea0f530000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806499686714125400ELm19060100871ELm0ELm4880223711522ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00de5226ec709edf0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806499686714125400ELm19060100871ELm0ELm4880223711522ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00499f28d03596470000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806499686714125400ELm19060100871ELm0ELm4880223711522ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0067d6bdb4cf78340000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806499686714125400ELm19060100871ELm0ELm4880223711522ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00abb1d4d7477d860000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806499686714125400ELm19060100871ELm0ELm4880223711522ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00cc0f3795e4416c0000a01000010000 (packed-from-kernelParams)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-206
View File
@@ -1,206 +0,0 @@
//! Ethash stratum client + mining loop.
//!
//! Ethash uses a different stratum dialect than the Zcash/Equihash `StratumClient`
//! in `src/stratum.rs`. This implements the common **EthereumStratum/1.0.0**
//! (NiceHash) shape — `mining.subscribe` / `mining.set_difficulty` /
//! `mining.notify [jobId, seedhash, headerhash, cleanJobs]` / `mining.submit
//! [user, jobId, nonce]`. The older getwork/ethproxy variant differs slightly;
//! `TODO(pool)` marks the framing to confirm against a live pool.
//!
//! Loop: job → GPU search (WIP, see ../ethash.rs) → **CPU verify** (`super::verify`)
//! → submit verified shares only.
use std::io::{BufRead, BufReader, Write};
use std::net::TcpStream;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use anyhow::{anyhow, Context, Result};
use serde_json::{json, Value};
use super::verify::{self, epoch_from_seedhash};
use super::EthashSolver;
/// One Ethash job.
#[derive(Clone)]
pub struct Job {
pub id: String,
pub seedhash: [u8; 32],
pub header_hash: [u8; 32],
pub target: [u8; 32],
pub epoch: u64,
}
pub struct EthashStratum {
stream: TcpStream,
reader: BufReader<TcpStream>,
next_id: u64,
/// Current difficulty → target boundary (set by mining.set_difficulty).
target: [u8; 32],
extranonce: String,
}
impl EthashStratum {
pub fn connect(host: &str, port: u16, user: &str, pass: &str) -> Result<Self> {
let stream = TcpStream::connect((host, port)).with_context(|| format!("connect {host}:{port}"))?;
let reader = BufReader::new(stream.try_clone()?);
let mut s = Self { stream, reader, next_id: 1, target: [0xff; 32], extranonce: String::new() };
// TODO(pool): some pools want ["miner/ver", "EthereumStratum/1.0.0"].
s.call("mining.subscribe", json!(["jackpotminer-ethash/0.1", "EthereumStratum/1.0.0"]))?;
s.call("mining.authorize", json!([user, pass]))?;
Ok(s)
}
fn send(&mut self, v: &Value) -> Result<()> {
let mut line = serde_json::to_string(v)?;
line.push('\n');
self.stream.write_all(line.as_bytes())?;
Ok(())
}
fn call(&mut self, method: &str, params: Value) -> Result<u64> {
let id = self.next_id;
self.next_id += 1;
self.send(&json!({ "id": id, "method": method, "params": params }))?;
Ok(id)
}
fn recv(&mut self) -> Result<Value> {
let mut line = String::new();
if self.reader.read_line(&mut line)? == 0 {
return Err(anyhow!("pool closed the connection"));
}
Ok(serde_json::from_str(line.trim())?)
}
/// Block until the next job, applying difficulty/extranonce updates en route.
pub fn next_job(&mut self) -> Result<Job> {
loop {
let msg = self.recv()?;
match msg.get("method").and_then(Value::as_str).unwrap_or("") {
"mining.set_difficulty" => {
if let Some(d) = msg["params"].get(0).and_then(Value::as_f64) {
self.target = target_from_difficulty(d.max(1.0) as u64);
}
}
"mining.set_extranonce" => {
if let Some(x) = msg["params"].get(0).and_then(Value::as_str) {
self.extranonce = x.to_string();
}
}
"mining.notify" => {
// params: [jobId, seedhash, headerhash, cleanJobs] TODO(pool): order varies.
let p = &msg["params"];
let id = p.get(0).and_then(Value::as_str).unwrap_or("").to_string();
let seedhash = hex32(p.get(1));
let header_hash = hex32(p.get(2));
let epoch = epoch_from_seedhash(&seedhash)
.ok_or_else(|| anyhow!("unknown seedhash (epoch scan failed)"))?;
return Ok(Job { id, seedhash, header_hash, target: self.target, epoch });
}
_ => {}
}
}
}
/// Submit a verified nonce. NiceHash: nonce hex is extranonce-prefixed.
/// TODO(pool): some pools also want the mix hash as a 4th param.
pub fn submit(&mut self, user: &str, job_id: &str, nonce: u64) -> Result<()> {
let nonce_hex = format!("0x{}{:016x}", self.extranonce, nonce);
self.call("mining.submit", json!([user, job_id, nonce_hex]))?;
Ok(())
}
}
fn hex32(v: Option<&Value>) -> [u8; 32] {
let s = v.and_then(Value::as_str).unwrap_or("").trim_start_matches("0x");
let mut o = [0u8; 32];
for i in 0..32.min(s.len() / 2) {
o[i] = u8::from_str_radix(&s[2 * i..2 * i + 2], 16).unwrap_or(0);
}
o
}
/// Ethash boundary = floor(2^256 / difficulty), big-endian 32 bytes.
pub fn target_from_difficulty(diff: u64) -> [u8; 32] {
if diff <= 1 {
return [0xff; 32];
}
let d = diff as u128;
let mut q = [0u8; 32];
let mut rem: u128 = 0;
// Dividend = 1 followed by 256 zero bits (257 bits); keep the low 256 quotient bits.
for bitpos in (0..=256usize).rev() {
rem = (rem << 1) | if bitpos == 256 { 1 } else { 0 };
if rem >= d {
rem -= d;
if bitpos < 256 {
let from_msb = 255 - bitpos;
q[from_msb / 8] |= 1 << (7 - (from_msb % 8));
}
}
}
q
}
/// The Ethash mining loop (single device). Mirrors `pearl_main::run`. The GPU
/// search is still WIP (see ../ethash.rs `TODO(capture)`); the verify+submit
/// path is real, so once `search` returns candidates this is end-to-end.
pub fn run(
host: &str,
port: u16,
user: &str,
pass: &str,
device: usize,
recording_path: &str,
running: Arc<AtomicBool>,
) -> Result<()> {
let _ = recording_path; // the recording is bundled; DAG is built in new()
let solver = EthashSolver::new(device).context("init Ethash solver")?;
// The GPU replay built the DAG from the captured (epoch-pinned) recording, so
// it verifies against that exact epoch. Cross-check on the CPU with the same
// light cache the GPU used — independent of the coin's epoch convention.
let light = solver.cpu_light();
let mut pool = EthashStratum::connect(host, port, user, pass)?;
log::info!("ethash: mining on device {device}");
let mut start_nonce: u64 = 0;
while running.load(Ordering::Relaxed) {
let job = pool.next_job()?;
match solver.search(&job.header_hash, &job.target, start_nonce) {
Ok(res) => {
for f in &res.found {
// CPU verify (same cache as the GPU): never submit a bad share.
if verify::verify(&light, &job.header_hash, f.nonce, &job.target, Some(&f.mix)) {
pool.submit(user, &job.id, f.nonce)?;
log::info!("ethash: submitted nonce {:#x} for job {}", f.nonce, job.id);
} else {
log::debug!("ethash: GPU nonce {:#x} failed CPU verify — dropped", f.nonce);
}
}
}
Err(e) => log::debug!("ethash: search error: {e}"),
}
start_nonce = start_nonce.wrapping_add(25_559_040); // 399360 * 64 nonces per batch
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn difficulty_target_basic() {
// diff 1 -> max boundary; larger diff -> smaller boundary.
assert_eq!(target_from_difficulty(1), [0xff; 32]);
let t2 = target_from_difficulty(2);
// 2^256/2 = 2^255 -> 0x80 00 .. 00
assert_eq!(t2[0], 0x80);
assert!(t2[1..].iter().all(|&b| b == 0));
// monotonic: higher difficulty => numerically smaller target
let a = target_from_difficulty(1000);
let b = target_from_difficulty(2000);
assert!(b < a); // lexicographic on big-endian == numeric
}
}
-432
View File
@@ -1,432 +0,0 @@
//! CPU Ethash light verifier — recompute a candidate share on the CPU and accept
//! it only if it genuinely meets target, so the (reverse-engineered) GPU replay
//! can never submit a bad share. Mirrors the role of `equihash::is_valid_solution`.
//!
//! Unlike pearlhash, Ethash is a public spec, so this is a *correct* light-client
//! implementation (no DAG needed — dataset items are derived from the cache on the
//! fly), not a stub. The full pipeline (mkcache → dataset_item → hashimoto → result)
//! is pinned by `hashimoto_geth_kat` below against go-ethereum's canonical
//! `TestHashimoto` vector, and the Keccak core has its own KATs.
//!
//! Spec: <https://eth.wiki/concepts/ethash/ethash> (Dagger-Hashimoto).
// ---------- Keccak-f[1600] (original Keccak padding 0x01, as Ethash uses) ----------
const RC: [u64; 24] = [
0x0000000000000001, 0x0000000000008082, 0x800000000000808a, 0x8000000080008000,
0x000000000000808b, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009,
0x000000000000008a, 0x0000000000000088, 0x0000000080008009, 0x000000008000000a,
0x000000008000808b, 0x800000000000008b, 0x8000000000008089, 0x8000000000008003,
0x8000000000008002, 0x8000000000000080, 0x000000000000800a, 0x800000008000000a,
0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008,
];
const RHO: [u32; 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 PI: [usize; 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,
];
fn keccakf(a: &mut [u64; 25]) {
for round in 0..24 {
// theta
let mut c = [0u64; 5];
for x in 0..5 {
c[x] = a[x] ^ a[x + 5] ^ a[x + 10] ^ a[x + 15] ^ a[x + 20];
}
for x in 0..5 {
let d = c[(x + 4) % 5] ^ c[(x + 1) % 5].rotate_left(1);
for y in 0..5 {
a[x + 5 * y] ^= d;
}
}
// rho + pi
let mut last = a[1];
for i in 0..24 {
let j = PI[i];
let tmp = a[j];
a[j] = last.rotate_left(RHO[i]);
last = tmp;
}
// chi
for y in 0..5 {
let t: [u64; 5] = [a[5 * y], a[5 * y + 1], a[5 * y + 2], a[5 * y + 3], a[5 * y + 4]];
for x in 0..5 {
a[x + 5 * y] = t[x] ^ ((!t[(x + 1) % 5]) & t[(x + 2) % 5]);
}
}
// iota
a[0] ^= RC[round];
}
}
/// Generic Keccak sponge with original-Keccak padding (delimiter 0x01).
fn keccak(rate: usize, input: &[u8], out: &mut [u8]) {
debug_assert!(rate % 8 == 0 && out.len() <= rate);
let mut st = [0u64; 25];
let absorb = |st: &mut [u64; 25], block: &[u8]| {
for i in 0..rate / 8 {
st[i] ^= u64::from_le_bytes(block[i * 8..i * 8 + 8].try_into().unwrap());
}
};
let mut off = 0;
while input.len() - off >= rate {
absorb(&mut st, &input[off..off + rate]);
keccakf(&mut st);
off += rate;
}
let rem = &input[off..];
let mut block = vec![0u8; rate];
block[..rem.len()].copy_from_slice(rem);
block[rem.len()] ^= 0x01;
block[rate - 1] ^= 0x80;
absorb(&mut st, &block);
keccakf(&mut st);
let mut bytes = [0u8; 200];
for i in 0..25 {
bytes[i * 8..i * 8 + 8].copy_from_slice(&st[i].to_le_bytes());
}
out.copy_from_slice(&bytes[..out.len()]);
}
fn keccak256(input: &[u8]) -> [u8; 32] {
let mut o = [0u8; 32];
keccak(136, input, &mut o);
o
}
fn keccak512(input: &[u8]) -> [u8; 64] {
let mut o = [0u8; 64];
keccak(72, input, &mut o);
o
}
// ---------- Ethash parameters ----------
const HASH_BYTES: usize = 64;
const MIX_BYTES: usize = 128;
const EPOCH_LENGTH: u64 = 30_000;
const CACHE_BYTES_INIT: usize = 1 << 24;
const CACHE_BYTES_GROWTH: usize = 1 << 17;
const DATASET_BYTES_INIT: usize = 1 << 30;
const DATASET_BYTES_GROWTH: usize = 1 << 23;
const DATASET_PARENTS: u32 = 256;
const CACHE_ROUNDS: usize = 3;
const ACCESSES: usize = 64;
const FNV_PRIME: u32 = 0x0100_0193;
#[inline]
fn fnv(a: u32, b: u32) -> u32 {
a.wrapping_mul(FNV_PRIME) ^ b
}
fn is_prime(n: usize) -> bool {
if n < 2 {
return false;
}
if n % 2 == 0 {
return n == 2;
}
let mut i = 3usize;
while i * i <= n {
if n % i == 0 {
return false;
}
i += 2;
}
true
}
pub fn epoch(block_number: u64) -> u64 {
block_number / EPOCH_LENGTH
}
/// Seed hash for an epoch (Keccak-256 chained from zero, `epoch` times).
pub fn seedhash(epoch: u64) -> [u8; 32] {
let mut s = [0u8; 32];
for _ in 0..epoch {
s = keccak256(&s);
}
s
}
/// Recover the epoch from a pool-supplied seedhash (bounded scan).
pub fn epoch_from_seedhash(seed: &[u8; 32]) -> Option<u64> {
let mut s = [0u8; 32];
for e in 0..(1u64 << 20) {
if &s == seed {
return Some(e);
}
s = keccak256(&s);
}
None
}
fn cache_size(epoch: u64) -> usize {
let mut sz = CACHE_BYTES_INIT + CACHE_BYTES_GROWTH * epoch as usize - HASH_BYTES;
while !is_prime(sz / HASH_BYTES) {
sz -= 2 * HASH_BYTES;
}
sz
}
fn full_size(epoch: u64) -> usize {
let mut sz = DATASET_BYTES_INIT + DATASET_BYTES_GROWTH * epoch as usize - MIX_BYTES;
while !is_prime(sz / MIX_BYTES) {
sz -= 2 * MIX_BYTES;
}
sz
}
#[inline]
fn words(row: &[u8; 64]) -> [u32; 16] {
let mut w = [0u32; 16];
for i in 0..16 {
w[i] = u32::from_le_bytes(row[i * 4..i * 4 + 4].try_into().unwrap());
}
w
}
#[inline]
fn bytes(w: &[u32; 16]) -> [u8; 64] {
let mut b = [0u8; 64];
for i in 0..16 {
b[i * 4..i * 4 + 4].copy_from_slice(&w[i].to_le_bytes());
}
b
}
/// Light cache for one epoch (`mkcache`). Held so verification of many shares in
/// an epoch pays generation once.
pub struct Light {
pub epoch: u64,
full_size: usize,
cache: Vec<[u8; 64]>,
}
/// `mkcache` — build the `n`-row light cache from a 32-byte seed (Keccak-512
/// seed chain + `CACHE_ROUNDS` of RandMemoHash). Shared by `Light::new` and the
/// known-answer tests so both exercise the exact same generator.
fn mkcache(n: usize, seed: &[u8; 32]) -> Vec<[u8; 64]> {
let mut cache: Vec<[u8; 64]> = Vec::with_capacity(n);
cache.push(keccak512(seed));
for i in 1..n {
cache.push(keccak512(&cache[i - 1]));
}
// CACHE_ROUNDS of RandMemoHash.
for _ in 0..CACHE_ROUNDS {
for i in 0..n {
let v = u32::from_le_bytes(cache[i][0..4].try_into().unwrap()) as usize % n;
let mut x = [0u8; 64];
for k in 0..64 {
x[k] = cache[(i + n - 1) % n][k] ^ cache[v][k];
}
cache[i] = keccak512(&x);
}
}
cache
}
impl Light {
pub fn new(epoch: u64) -> Self {
let n = cache_size(epoch) / HASH_BYTES;
let cache = mkcache(n, &seedhash(epoch));
Self { epoch, full_size: full_size(epoch), cache }
}
/// Build a `Light` directly from raw cache bytes + the full dataset size, with
/// no epoch math. Used to cross-check the GPU replay (`src/ethash.rs`): the
/// exact light cache miniZ uploaded is captured, so CPU hashimoto here uses the
/// *same* cache the kernels did — making verification independent of the
/// coin's epoch-length convention (ethash vs ECIP-1099 etchash).
pub fn from_raw(cache_bytes: &[u8], full_size: usize) -> Self {
assert!(cache_bytes.len() % HASH_BYTES == 0, "cache not a multiple of 64");
let cache = cache_bytes
.chunks_exact(HASH_BYTES)
.map(|c| {
let mut r = [0u8; 64];
r.copy_from_slice(c);
r
})
.collect();
Self { epoch: 0, full_size, cache }
}
/// `calc_dataset_item` — derive dataset row `i` from the cache.
fn dataset_item(&self, i: u32) -> [u32; 16] {
let n = self.cache.len() as u32;
let mut mix = words(&self.cache[(i % n) as usize]);
mix[0] ^= i;
mix = words(&keccak512(&bytes(&mix)));
for j in 0..DATASET_PARENTS {
let parent = fnv(i ^ j, mix[(j % 16) as usize]) % n;
let p = words(&self.cache[parent as usize]);
for k in 0..16 {
mix[k] = fnv(mix[k], p[k]);
}
}
words(&keccak512(&bytes(&mix)))
}
/// `hashimoto_light` — returns (mix_hash[32], result[32]) for a header+nonce.
pub fn hashimoto(&self, header_hash: &[u8; 32], nonce: u64) -> ([u8; 32], [u8; 32]) {
let n = (self.full_size / HASH_BYTES) as u32; // dataset rows
let mut seed_in = [0u8; 40];
seed_in[..32].copy_from_slice(header_hash);
seed_in[32..].copy_from_slice(&nonce.to_le_bytes());
let s = keccak512(&seed_in);
let sw = words(&s);
let mut mix = [0u32; 32]; // MIX_BYTES/4
mix[..16].copy_from_slice(&sw);
mix[16..].copy_from_slice(&sw);
let mixhashes = (MIX_BYTES / HASH_BYTES) as u32; // 2
for i in 0..ACCESSES as u32 {
let p = fnv(i ^ sw[0], mix[(i as usize) % 32]) % (n / mixhashes) * mixhashes;
let mut newdata = [0u32; 32];
for j in 0..mixhashes {
let item = self.dataset_item(p + j);
newdata[(j * 16) as usize..(j * 16 + 16) as usize].copy_from_slice(&item);
}
for k in 0..32 {
mix[k] = fnv(mix[k], newdata[k]);
}
}
// compress mix (32 -> 8 words)
let mut cmix = [0u32; 8];
for i in (0..32).step_by(4) {
cmix[i / 4] = fnv(fnv(fnv(mix[i], mix[i + 1]), mix[i + 2]), mix[i + 3]);
}
let mut mix_hash = [0u8; 32];
for i in 0..8 {
mix_hash[i * 4..i * 4 + 4].copy_from_slice(&cmix[i].to_le_bytes());
}
let mut final_in = [0u8; 96];
final_in[..64].copy_from_slice(&s);
final_in[64..].copy_from_slice(&mix_hash);
let result = keccak256(&final_in);
(mix_hash, result)
}
}
/// Big-endian 256-bit compare: `result <= target` (the Ethash boundary check).
fn le_or_eq_be(result: &[u8; 32], target: &[u8; 32]) -> bool {
for i in 0..32 {
if result[i] != target[i] {
return result[i] < target[i];
}
}
true
}
/// Verify a candidate share. `light` must be for the job's epoch. Returns true
/// only if the recomputed result meets `target`; if `mix_hash` is provided
/// (from the GPU/submit), it must also match — catching a bad mix.
pub fn verify(
light: &Light,
header_hash: &[u8; 32],
nonce: u64,
target: &[u8; 32],
mix_hash: Option<&[u8; 32]>,
) -> bool {
let (mix, result) = light.hashimoto(header_hash, nonce);
if let Some(expected) = mix_hash {
if &mix != expected {
return false;
}
}
le_or_eq_be(&result, target)
}
#[cfg(test)]
mod tests {
use super::*;
fn hex32(s: &str) -> [u8; 32] {
let mut o = [0u8; 32];
for i in 0..32 {
o[i] = u8::from_str_radix(&s[2 * i..2 * i + 2], 16).unwrap();
}
o
}
/// KAT: Keccak-256("") — the canonical Ethereum empty-string hash. Validates
/// the whole Keccak core (permutation, padding, rate).
#[test]
fn keccak256_empty_kat() {
assert_eq!(
keccak256(b""),
hex32("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470")
);
}
/// KAT: Keccak-256("abc").
#[test]
fn keccak256_abc_kat() {
assert_eq!(
keccak256(b"abc"),
hex32("4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45")
);
}
#[test]
fn fnv_matches_spec() {
// fnv(a,b) = a*FNV_PRIME ^ b, mod 2^32
assert_eq!(fnv(1, 0), FNV_PRIME);
assert_eq!(fnv(0, 7), 7);
}
#[test]
fn seedhash_epoch_roundtrip() {
let s = seedhash(3);
assert_eq!(epoch_from_seedhash(&s), Some(3));
assert_eq!(seedhash(0), [0u8; 32]);
}
/// Cache sizes are prime in HASH_BYTES units and shrink-search is stable.
#[test]
fn cache_size_is_prime_units() {
for e in [0u64, 1, 10] {
assert!(is_prime(cache_size(e) / HASH_BYTES));
assert!(is_prime(full_size(e) / MIX_BYTES));
}
}
/// Full-pipeline KAT for `hashimoto` (mkcache → dataset_item → mix → result),
/// using go-ethereum's canonical `TestHashimoto` vector
/// (`consensus/ethash/algorithm_test.go`): epoch-0 seed (32 zero bytes), a
/// 1024-byte / 16-row cache, dataset size 32*1024 bytes, header hash
/// `c9149cc0…`, nonce 0. This pins the *entire* light-verify path against a
/// trusted external implementation, not just the Keccak core.
#[test]
fn hashimoto_geth_kat() {
// 16-row cache from the epoch-0 seed (all zeros), and a 32768-byte
// dataset — the same tiny sizes geth's TestHashimoto uses.
let light = Light { epoch: 0, full_size: 32 * 1024, cache: mkcache(16, &[0u8; 32]) };
let header = hex32("c9149cc0386e689d789a1c2f3d5d169a61a6218ed30e74414dc736e442ef3d1f");
let (mix, result) = light.hashimoto(&header, 0);
assert_eq!(
mix,
hex32("e4073cffaef931d37117cefd9afd27ea0f1cad6a981dd2605c4a1ac97c519800"),
"mix digest mismatch vs geth TestHashimoto"
);
assert_eq!(
result,
hex32("d3539235ee2e6f8db665c0a72169f55b7f6c605712330b778ec3944f0eb5a557"),
"result hash mismatch vs geth TestHashimoto"
);
// verify() must accept when result <= target and reject just below it.
let mut target = result;
assert!(verify(&light, &header, 0, &target, Some(&mix)));
// A wrong mix is rejected even when the result meets target.
assert!(!verify(&light, &header, 0, &target, Some(&[0u8; 32])));
// Tightening target one ulp below the result rejects the share.
for b in target.iter_mut().rev() {
if *b > 0 { *b -= 1; break; } else { *b = 0xff; }
}
assert!(!verify(&light, &header, 0, &target, None));
}
}
-42
View File
@@ -17,14 +17,6 @@ mod gpu;
#[cfg(feature = "cuda")]
mod cuda;
// Ethash backend (default-off, work-in-progress; see src/ethash/README.md).
#[cfg(feature = "ethash")]
mod ethash;
// Pearl (PRL) pearlhash backend (default-off; native port of the open reference).
#[cfg(feature = "pearl")]
mod pearl;
#[cfg(feature = "cuda")]
mod nvml;
@@ -151,11 +143,6 @@ struct Args {
#[arg(long, default_value = "cuda")]
backend: String,
/// Mining algorithm: "equihash" (default) or "pearl" (PRL pearlhash; needs
/// the `pearl` feature). Pearl is a distinct PoW with its own pool protocol.
#[arg(long, default_value = "equihash")]
algo: String,
/// Force the OpenCL backend, disabling CUDA (overrides --backend).
#[arg(long)]
force_opencl: bool,
@@ -564,35 +551,6 @@ fn main() -> Result<()> {
} else {
"jackpot".to_string()
};
// Pearl (PRL) pearlhash is a distinct algorithm + pool protocol; branch to
// its own loop before the Equihash stratum client.
#[cfg(feature = "pearl")]
if args.algo.eq_ignore_ascii_case("pearl") {
let running = Arc::new(AtomicBool::new(true));
{
let r = running.clone();
ctrlc::set_handler(move || r.store(false, Ordering::Relaxed)).ok();
}
// Pearl pools authorize with a fixed password "x" (see the live capture);
// the Equihash jackpot/solo password modes don't apply. Honor an explicit
// non-default `-p`, else use "x".
let pearl_pass = if args.pass == "jackpot" { "x" } else { args.pass.as_str() };
return pearl::stratum::run(&host, port, &args.user, pearl_pass, running);
}
// Ethash/etchash is DAG + search with its own stratum dialect; branch to its
// loop. The GPU search drives miniZ's extracted solver via a captured trace
// (see src/ethash/README.md); every share is CPU-verified before submit.
#[cfg(feature = "ethash")]
if args.algo.eq_ignore_ascii_case("ethash") || args.algo.eq_ignore_ascii_case("etchash") {
let running = Arc::new(AtomicBool::new(true));
{
let r = running.clone();
ctrlc::set_handler(move || r.store(false, Ordering::Relaxed)).ok();
}
return ethash::stratum::run(&host, port, &args.user, &pass, args.device, "", running);
}
info!("connecting to {host}:{port} as '{}'", args.user);
let client = Arc::new(StratumClient::connect(&host, port, &args.user, &pass)?);
-17
View File
@@ -1,17 +0,0 @@
//! Pearl (PRL) "pearlhash" Proof-of-Useful-Work backend (feature `pearl`).
//!
//! Native CPU port of the official open-source reference
//! (github.com/pearl-research-labs/pearl, ISC), confirmed against the whitepaper
//! and the alpha-miner GPU SASS. See `pearl-dump/SPEC.md`. GPU acceleration and
//! the Pearl stratum client build on top of this core.
pub mod merkle;
pub mod pearlhash;
pub mod stratum;
/// GPU acceleration (NVRTC int8 GEMM+transcript kernel), feature `pearl-cuda`.
#[cfg(feature = "pearl-cuda")]
pub mod gpu;
/// Approach A: drive alpha-miner's extracted cubin directly, feature `pearl-cuda`.
#[cfg(feature = "pearl-cuda")]
pub mod alpha_kernel;
-403
View File
@@ -1,403 +0,0 @@
//! Approach A: drive alpha-miner's *extracted* CUDA kernels directly.
//!
//! alpha-miner's anti-analysis (dlmopen + /proc/self/maps pointer checks) lives in
//! its **host** code; the cubin itself is plain GPU code. So we `cuModuleLoadData`
//! the extracted `alpha-miner.35.sm_120.cubin` in *our* process and call its
//! kernels — no anti-analysis involved. `headless_mine_kernel` is the fused
//! production kernel (SASS shows IMMA GEMM + `ATOMS.XOR` transcript + the BLAKE3
//! IV + an atomic winner dump), so one launch does GEMM→transcript→jackpot→dump.
//!
//! The remaining RE (done experimentally with the validated CPU oracle in
//! `pearlhash`) is the *input contract*: the 23-param ABI is mapped (see
//! `pearl-dump/INTEGRATION.md §3`), but the grid mapping, the two seed buffers,
//! where the difficulty bound lives, the dump-entry layout, and whether operands
//! are pre-noised must be pinned by feeding known inputs and matching the dump to
//! the CPU jackpot. This module is the loader/launcher foundation for that.
use std::ffi::{c_char, c_int, c_uint, c_void, CStr, CString};
use std::ptr;
use anyhow::{anyhow, Result};
// Mangled names from pearl-dump/functions.mangled.txt (sm_120 / pearl_blackwell).
const MINE_LB0: &str = "_ZN15pearl_blackwell20headless_mine_kernelILb0ELb0EN4cute5tupleIJiiiEEENS2_IJNS1_1CILi128EEENS4_ILi256EEES5_EEEaNS2_IJiNS4_ILi1EEEEEENS1_14ComposedLayoutINS1_7SwizzleILi2ELi4ELi3EEENS4_ILi0EEENS1_6LayoutINS2_IJNS2_IJNS4_ILi16EEENS4_ILi8EEEEEENS2_IJS5_S8_EEENS2_IJS8_NS4_ILi2EEEEEEEEENS2_IJNS2_IJS5_NS4_ILi2048EEEEEENS2_IJS8_SD_EEENS2_IJSD_NS4_ILi16384EEEEEEEEEEEEENS1_9TiledCopyINS1_9Copy_AtomIJNS1_25SM80_CP_ASYNC_CACHEGLOBALIN7cutlass9uint128_tESY_EEaEEENSE_INS2_IJNS2_IJSG_NS4_ILi32EEEEEESF_EEENS2_IJNS2_IJNS4_ILi512EEES8_EEES11_EEEEENS2_IJS11_S5_EEEEENSV_IJNS1_17SM75_U32x4_LDSM_NEaEEEaS9_NSA_ISC_SD_NSE_INS2_IJNS2_IJSF_SF_EEESI_SK_EEENS2_IJSN_SO_NS2_IJSD_NS4_ILi32768EEEEEEEEEEEEES19_NSV_IJNS1_17SM75_U32x2_LDSM_NEaEEENS1_8TiledMMAINS1_8MMA_AtomIJNS1_26SM80_16x8x32_S32S8S8S32_TNEEEENSE_INS2_IJSJ_NS4_ILi4EEES8_EEENS2_IJS8_SJ_SD_EEEEENS2_IJS11_S11_S11_EEEEEEEvT1_T2_PKT3_T4_T5_T6_T7_PKT8_T9_T10_T11_T12_P16HostSignalHeaderP14HostSignalSyncPKjS2G_T13_iP29PearlHeadlessJackpotDumpEntryPiPjiS2L_";
const MINE_LB1: &str = "_ZN15pearl_blackwell20headless_mine_kernelILb1ELb0EN4cute5tupleIJiiiEEENS2_IJNS1_1CILi128EEENS4_ILi256EEES5_EEEaNS2_IJiNS4_ILi1EEEEEENS1_14ComposedLayoutINS1_7SwizzleILi2ELi4ELi3EEENS4_ILi0EEENS1_6LayoutINS2_IJNS2_IJNS4_ILi16EEENS4_ILi8EEEEEENS2_IJS5_S8_EEENS2_IJS8_NS4_ILi2EEEEEEEEENS2_IJNS2_IJS5_NS4_ILi2048EEEEEENS2_IJS8_SD_EEENS2_IJSD_NS4_ILi16384EEEEEEEEEEEEENS1_9TiledCopyINS1_9Copy_AtomIJNS1_25SM80_CP_ASYNC_CACHEGLOBALIN7cutlass9uint128_tESY_EEaEEENSE_INS2_IJNS2_IJSG_NS4_ILi32EEEEEESF_EEENS2_IJNS2_IJNS4_ILi512EEES8_EEES11_EEEEENS2_IJS11_S5_EEEEENSV_IJNS1_17SM75_U32x4_LDSM_NEaEEEaS9_NSA_ISC_SD_NSE_INS2_IJNS2_IJSF_SF_EEESI_SK_EEENS2_IJSN_SO_NS2_IJSD_NS4_ILi32768EEEEEEEEEEEEES19_NSV_IJNS1_17SM75_U32x2_LDSM_NEaEEENS1_8TiledMMAINS1_8MMA_AtomIJNS1_26SM80_16x8x32_S32S8S8S32_TNEEEENSE_INS2_IJSJ_NS4_ILi4EEES8_EEENS2_IJS8_SJ_SD_EEEEENS2_IJS11_S11_S11_EEEEEEEvT1_T2_PKT3_T4_T5_T6_T7_PKT8_T9_T10_T11_T12_P16HostSignalHeaderP14HostSignalSyncPKjS2G_T13_iP29PearlHeadlessJackpotDumpEntryPiPjiS2L_";
type CUresult = c_int;
type CUdevice = c_int;
type CUcontext = *mut c_void;
type CUmodule = *mut c_void;
type CUfunction = *mut c_void;
type CUdeviceptr = u64;
const CUDA_SUCCESS: CUresult = 0;
const CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES: c_int = 8;
const CU_LAUNCH_PARAM_END: usize = 0x00;
const CU_LAUNCH_PARAM_BUFFER_POINTER: usize = 0x01;
const CU_LAUNCH_PARAM_BUFFER_SIZE: usize = 0x02;
extern "C" {
fn cuInit(f: c_uint) -> CUresult;
fn cuDeviceGet(d: *mut CUdevice, o: c_int) -> CUresult;
fn cuCtxCreate_v2(c: *mut CUcontext, f: c_uint, d: CUdevice) -> CUresult;
fn cuCtxDestroy_v2(c: CUcontext) -> CUresult;
fn cuModuleLoadData(m: *mut CUmodule, image: *const c_void) -> CUresult;
fn cuModuleUnload(m: CUmodule) -> CUresult;
fn cuModuleGetFunction(f: *mut CUfunction, m: CUmodule, name: *const c_char) -> CUresult;
fn cuFuncSetAttribute(f: CUfunction, a: c_int, v: c_int) -> CUresult;
fn cuMemAlloc_v2(p: *mut CUdeviceptr, n: usize) -> CUresult;
fn cuMemFree_v2(p: CUdeviceptr) -> CUresult;
fn cuMemsetD8_v2(p: CUdeviceptr, uc: c_uint, n: usize) -> CUresult;
fn cuMemcpyHtoD_v2(dst: CUdeviceptr, src: *const c_void, n: usize) -> CUresult;
fn cuMemcpyDtoH_v2(dst: *mut c_void, src: CUdeviceptr, n: usize) -> CUresult;
fn cuLaunchKernel(f: CUfunction, gx: c_uint, gy: c_uint, gz: c_uint, bx: c_uint, by: c_uint, bz: c_uint, sh: c_uint, st: *mut c_void, params: *mut *mut c_void, extra: *mut *mut c_void) -> CUresult;
fn cuCtxSynchronize() -> CUresult;
fn cuGetErrorName(e: CUresult, s: *mut *const c_char) -> CUresult;
}
fn cu(r: CUresult, what: &str) -> Result<()> {
if r == CUDA_SUCCESS {
return Ok(());
}
let name = unsafe {
let mut p: *const c_char = ptr::null();
if cuGetErrorName(r, &mut p) == CUDA_SUCCESS && !p.is_null() {
CStr::from_ptr(p).to_string_lossy().into_owned()
} else {
format!("CUresult {r}")
}
};
Err(anyhow!("{what}: {name}"))
}
fn func(module: CUmodule, mangled: &str) -> Result<CUfunction> {
let cname = CString::new(mangled)?;
let mut f: CUfunction = ptr::null_mut();
cu(unsafe { cuModuleGetFunction(&mut f, module, cname.as_ptr()) }, "cuModuleGetFunction")?;
Ok(f)
}
/// alpha-miner's loaded kernels (in our process).
pub struct AlphaKernels {
ctx: CUcontext,
module: CUmodule,
/// `headless_mine_kernel<false,false,...>` (no jackpot dump).
pub mine_lb0: CUfunction,
/// `headless_mine_kernel<true,false,...>` (jackpot-dump enabled).
pub mine_lb1: CUfunction,
}
unsafe impl Send for AlphaKernels {}
impl AlphaKernels {
/// Load the extracted cubin (raw bytes) and resolve the mine kernels.
pub fn load(cubin: &[u8], device_index: usize) -> Result<Self> {
unsafe {
cu(cuInit(0), "cuInit")?;
let mut dev: CUdevice = 0;
cu(cuDeviceGet(&mut dev, device_index as c_int), "cuDeviceGet")?;
let mut ctx: CUcontext = ptr::null_mut();
cu(cuCtxCreate_v2(&mut ctx, 0, dev), "cuCtxCreate")?;
let mut module: CUmodule = ptr::null_mut();
cu(
cuModuleLoadData(&mut module, cubin.as_ptr() as *const c_void),
"cuModuleLoadData (alpha-miner cubin; arch must match GPU)",
)?;
let mine_lb0 = func(module, MINE_LB0)?;
let mine_lb1 = func(module, MINE_LB1)?;
Ok(Self { ctx, module, mine_lb0, mine_lb1 })
}
}
}
/// What the kernel wrote after an exploratory launch.
pub struct ExploreReport {
pub launched: bool,
pub dump_count: u32,
pub dump_head: Vec<u8>,
pub header_head: Vec<u8>,
/// (name, first 64 bytes) for every output buffer, to localize what changed.
pub buffers: Vec<(&'static str, Vec<u8>)>,
}
impl AlphaKernels {
/// Exploratory launch of `headless_mine_kernel<true,..>` on a tiny shape, to
/// reverse the input contract by inspecting what it writes. Sets the run-gate,
/// permissive header (0xFF), known operands; reads back the dump counter +
/// dump/header heads. The 23-param packed buffer follows INTEGRATION.md §3.
pub fn explore(&self, m: i32, n: i32, k: i32, _rank: i32, grid: (u32, u32, u32), smem: u32) -> Result<ExploreReport> {
unsafe {
let alloc = |bytes: usize, fill: u8| -> Result<CUdeviceptr> {
let mut p: CUdeviceptr = 0;
cu(cuMemAlloc_v2(&mut p, bytes.max(16)), "cuMemAlloc")?;
cu(cuMemsetD8_v2(p, fill as c_uint, bytes.max(16)), "cuMemset")?;
Ok(p)
};
// Over-allocate every buffer (8 MiB) so the CUTLASS kernel's vectorized
// cp.async / swizzled tile reads can't run off the end — isolates an
// out-of-bounds read (sizing) from a genuinely wrong pointer.
let big = 8usize << 20;
// PEARL_A / PEARL_B set a uniform int8 fill for A / B (default 1), to test
// whether the GEMM-derived dump fields scale with operand magnitude.
let af = std::env::var("PEARL_A").ok().and_then(|s| s.parse().ok()).unwrap_or(1u8);
let bf = std::env::var("PEARL_B").ok().and_then(|s| s.parse().ok()).unwrap_or(1u8);
let a = alloc(big, af)?; // A' int8
let b = alloc(big, bf)?; // B'ᵀ int8
// Optionally fill A/B with a VARIED int8 pattern (small magnitudes so the
// int32 GEMM stays bounded) so the transcript M is non-trivial — this
// pins the transcript field's exact offset in the dump entry. PEARL_VARIED=1.
// PEARL_VARIED: fill A and B with full-range pseudo-random int8 (two
// different LCGs) so the GEMM accumulators are effectively random and the
// per-tile XOR can't cancel — this is what real pearl operands (random
// from the commitment) look like. If M becomes non-zero, operands genuinely
// drive the transcript.
if std::env::var("PEARL_VARIED").map(|v| v == "1").unwrap_or(false) {
let mut sa: u32 = 0x1234_5678;
let mut sb: u32 = 0x9E37_79B1;
let mut pa = vec![0u8; big];
let mut pb = vec![0u8; big];
for i in 0..big {
sa = sa.wrapping_mul(1_664_525).wrapping_add(1_013_904_223);
sb = sb.wrapping_mul(1_103_515_245).wrapping_add(12_345);
pa[i] = (sa >> 24) as u8;
pb[i] = (sb >> 24) as u8;
}
cu(cuMemcpyHtoD_v2(a, pa.as_ptr() as *const c_void, big), "htod A")?;
cu(cuMemcpyHtoD_v2(b, pb.as_ptr() as *const c_void, big), "htod B")?;
}
let hdr = alloc(4096, 0xFF)?; // permissive
// HostSignalSync: [0] = first-finder CAS latch, [+4] = abort/stop flag.
// Prologue gate is `EXIT if sync[+4]==1`, so sync[+4] must be 0 (≠1) to run
// (we had this inverted — setting it to 1 forced instant exit). Zeroed.
let sync = alloc(256, 0)?;
// CONFIRMED via SASS + live dump: ord14 (c[0x3c0], PKj) = the 256-bit
// difficulty BOUND (hash≤bound wins; word-by-word MSW→LSW compare), and
// ord15 (c[0x3c8], S2G_) = the BLAKE3 KEY sA (8 words folded into the hash
// state at 0x2e00). Here both 0xFF: bound=max ⇒ every hash wins (proves the
// trigger); key=0xFF is just a placeholder for the exploratory launch.
let bound = alloc(big, 0xFF)?; // ord14
let key = alloc(big, 0xFF)?; // ord15
// PEARL_KEY=1: upload a known non-degenerate 32-byte key/commitment seed
// [0,1,..,31] so we can test whether the seed drives the transcript M
// (dumped hash would diverge from blake3(zeros, key)).
if std::env::var("PEARL_KEY").map(|v| v == "1").unwrap_or(false) {
let kb: [u8; 32] = std::array::from_fn(|i| i as u8);
cu(cuMemcpyHtoD_v2(key, kb.as_ptr() as *const c_void, 32), "htod key")?;
}
let dump = alloc(big, 0)?;
let dcount = alloc(big, 0)?;
let out20 = alloc(big, 0)?;
let out22 = alloc(big, 0)?;
// Pack the 128-byte argument buffer.
let mut arg = [0u8; 128];
let put_u32 = |a: &mut [u8], off: usize, v: u32| a[off..off + 4].copy_from_slice(&v.to_le_bytes());
let put_ptr = |a: &mut [u8], off: usize, v: u64| a[off..off + 8].copy_from_slice(&v.to_le_bytes());
put_u32(&mut arg, 0x00, m as u32);
put_u32(&mut arg, 0x04, n as u32);
put_u32(&mut arg, 0x08, k as u32);
put_ptr(&mut arg, 0x10, a);
// Stride scalars (cute Layout). PEARL_LDA/PEARL_LDB override (default k).
let envu = |name: &str, d: u32| std::env::var(name).ok().and_then(|s| s.parse().ok()).unwrap_or(d);
put_u32(&mut arg, 0x18, envu("PEARL_LDA", k as u32)); // ldA (ord3)
put_ptr(&mut arg, 0x20, b);
put_u32(&mut arg, 0x28, envu("PEARL_LDB", k as u32)); // ldB (ord8)
put_ptr(&mut arg, 0x30, hdr);
put_ptr(&mut arg, 0x38, sync);
put_ptr(&mut arg, 0x40, bound); // ord14 = 256-bit difficulty bound
put_ptr(&mut arg, 0x48, key); // ord15 = BLAKE3 key sA
put_u32(&mut arg, 0x54, envu("PEARL_O17", 1)); // ord17 = rank cadence divisor (chunk%ord17==0 folds)
put_ptr(&mut arg, 0x58, dump);
put_ptr(&mut arg, 0x60, dcount);
put_ptr(&mut arg, 0x68, out20);
put_u32(&mut arg, 0x70, envu("PEARL_O21", 1)); // ord21
put_ptr(&mut arg, 0x78, out22);
// <Lb0,Lb0> (mine_lb0) is the variant carrying the bound-compare +
// CAS first-finder latch + STG jackpot dump (SASS in /tmp/mk.sass).
// <Lb1,Lb0> (mine_lb1) is the atomic-accumulate variant (283 ATOMG.ADD)
// that updates global transcripts but never dumps. Pick via PEARL_LB1=1.
let use_lb1 = std::env::var("PEARL_LB1").map(|v| v == "1").unwrap_or(false);
let fnc = if use_lb1 { self.mine_lb1 } else { self.mine_lb0 };
let set = cuFuncSetAttribute(fnc, CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES, smem as c_int);
if set != CUDA_SUCCESS {
return Ok(ExploreReport { launched: false, dump_count: 0, dump_head: vec![set as u8], header_head: vec![0xEE], buffers: vec![] });
}
let mut argsz = arg.len();
let mut extra: [*mut c_void; 5] = [
CU_LAUNCH_PARAM_BUFFER_POINTER as *mut c_void,
arg.as_ptr() as *mut c_void,
CU_LAUNCH_PARAM_BUFFER_SIZE as *mut c_void,
&mut argsz as *mut usize as *mut c_void,
CU_LAUNCH_PARAM_END as *mut c_void,
];
let lr = cuLaunchKernel(fnc, grid.0, grid.1, grid.2, 256, 1, 1, smem, ptr::null_mut(), ptr::null_mut(), extra.as_mut_ptr());
let launched = lr == CUDA_SUCCESS && cuCtxSynchronize() == CUDA_SUCCESS;
// The found-count is HostSignalSync[+4] (ord19/c[0x3e0] is unused by the
// <Lb0,Lb0> dump variant). Read sync[1] (the u32 at byte offset 4).
let mut sync_words = [0u32; 2];
cuMemcpyDtoH_v2(sync_words.as_mut_ptr() as *mut c_void, sync, 8);
let count = [sync_words[1]];
let _ = dcount;
let mut dump_head = vec![0u8; 256];
cuMemcpyDtoH_v2(dump_head.as_mut_ptr() as *mut c_void, dump, 256);
// The jackpot dump lands in ord12 (HostSignalHeader, c[0x3b0]) — the SASS
// dump-finalize block writes the PearlHeadlessJackpotDumpEntry to R52 =
// LDC.64 c[0x0][0x3b0]. Read the full ~0x2d8-byte entry.
let mut header_head = vec![0u8; 768];
cuMemcpyDtoH_v2(header_head.as_mut_ptr() as *mut c_void, hdr, 768);
// Snapshot the first 64 bytes of every output buffer to localize writes.
let snap = |p: CUdeviceptr| -> Vec<u8> {
let mut v = vec![0u8; 64];
cuMemcpyDtoH_v2(v.as_mut_ptr() as *mut c_void, p, 64);
v
};
let buffers = vec![
("sync(ord13)", snap(sync)),
("counter(ord19/Pi)", snap(dcount)),
("dump(ord18)", snap(dump)),
("ord20(Pj)", snap(out20)),
("ord22(S2L)", snap(out22)),
("hdr(ord12)", snap(hdr)),
];
for p in [a, b, hdr, sync, bound, key, dump, dcount, out20, out22] {
cuMemFree_v2(p);
}
Ok(ExploreReport { launched, dump_count: count[0], dump_head, header_head, buffers })
}
}
}
impl Drop for AlphaKernels {
fn drop(&mut self) {
unsafe {
cuModuleUnload(self.module);
cuCtxDestroy_v2(self.ctx);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
/// Proves we can load alpha-miner's extracted cubin and resolve its mining
/// kernels in our own process (no anti-analysis). Ignored — needs the cubin +
/// an sm_120 GPU. Run:
/// cargo test --no-default-features --features pearl-cuda -- --ignored --nocapture
#[test]
#[ignore]
fn loads_alpha_cubin() {
let path = "pearl-dump/cubins/alpha-miner.35.sm_120.cubin";
let cubin = match std::fs::read(path) {
Ok(c) => c,
Err(_) => { eprintln!("no {path}; skipping"); return; }
};
let k = AlphaKernels::load(&cubin, 0).expect("load+resolve alpha-miner kernels");
assert!(!k.mine_lb0.is_null() && !k.mine_lb1.is_null());
eprintln!("loaded alpha-miner cubin; resolved headless_mine_kernel<false,..> and <true,..>");
}
/// Exploratory launch — observe what the fused kernel writes (no crash =
/// param ABI structurally valid). Ignored — needs the cubin + sm_120 GPU.
#[test]
#[ignore]
fn explore_mine_kernel() {
let path = "pearl-dump/cubins/alpha-miner.35.sm_120.cubin";
let cubin = match std::fs::read(path) {
Ok(c) => c,
Err(_) => { eprintln!("no {path}; skipping"); return; }
};
// ONE launch per process — an ILLEGAL_ADDRESS fault poisons the whole CUDA
// context state, so sweep smem from bash with PEARL_SMEM env, fresh process
// each. Baked CTA tile is 128x256; smem is a multistage pipeline
// (per-stage A 0x4000 + B 0x8000 = 49152).
let smem: u32 = std::env::var("PEARL_SMEM").ok().and_then(|s| s.parse().ok()).unwrap_or(98304);
let k = AlphaKernels::load(&cubin, 0).expect("load");
match k.explore(128, 256, 128, 128, (1, 1, 1), smem) {
Ok(r) => {
eprintln!("smem={smem} launched={} dump_count={}", r.launched, r.dump_count);
if r.launched {
eprintln!(" >>> JACKPOT DUMP ENTRY (ord12/HostSignalHeader), non-zero 16B rows:");
for (i, chunk) in r.header_head.chunks(16).enumerate() {
if chunk.iter().any(|&b| b != 0) {
eprintln!(" +0x{:03x}: {:02x?}", i * 16, chunk);
}
}
for (name, bytes) in &r.buffers {
let nz = bytes.iter().any(|&b| b != 0);
eprintln!(" {name:20} {}: {:02x?}", if nz { "CHANGED" } else { "zero " }, &bytes[..16]);
}
} else {
eprintln!(" (setattr/launch failed: dump_head[0]={:#x})", r.dump_head.first().copied().unwrap_or(0));
}
}
Err(e) => eprintln!("smem={smem} error: {e}"),
}
}
/// Prove we can REPRODUCE the kernel's dumped BLAKE3 jackpot hash with our own
/// CPU blake3 — i.e. we understand the hash function + the entry's transcript
/// field. The kernel writes the 256-bit hash at entry+0x29c; we passed key
/// (ord15) = all-0xFF. So some 64-byte window of the entry is the transcript M,
/// and `blake3_keyed(M, [0xFF;32]) == hash`. Brute-force the window to locate M
/// and confirm the match. Ignored — needs the cubin + sm_120 GPU.
#[test]
#[ignore]
fn reproduce_dumped_hash() {
use crate::pearl::pearlhash::blake3_digest;
let path = "pearl-dump/cubins/alpha-miner.35.sm_120.cubin";
let cubin = match std::fs::read(path) {
Ok(c) => c,
Err(_) => { eprintln!("no {path}; skipping"); return; }
};
let smem: u32 = std::env::var("PEARL_SMEM").ok().and_then(|s| s.parse().ok()).unwrap_or(98304);
let kdim: i32 = std::env::var("PEARL_K").ok().and_then(|s| s.parse().ok()).unwrap_or(128);
let k = AlphaKernels::load(&cubin, 0).expect("load");
eprintln!("launching with K={kdim} (UR7=ceil(K/128)={} chunks; transcript mainloop runs while UR7>1)", (kdim + 127) / 128);
let r = k.explore(128, 256, kdim, 128, (1, 1, 1), smem).expect("explore");
assert!(r.launched, "kernel must launch");
let e = &r.header_head; // the dump entry (in ord12)
let hash: [u8; 32] = e[0x29c..0x29c + 32].try_into().unwrap();
eprintln!("dumped hash @+0x29c = {:02x?}", hash);
// Candidate keys: what we passed. PEARL_KEY=1 uploads [0..31] to ord15.
let key_used: [u8; 32] = if std::env::var("PEARL_KEY").map(|v| v == "1").unwrap_or(false) {
std::array::from_fn(|i| i as u8)
} else {
[0xFFu8; 32]
};
// Decisive: if the dumped hash != blake3(zeros, key_used), then M != 0, i.e.
// the seed/commitment drives the transcript (operands don't).
let zeros_hash = blake3_digest(&[0u8; 64], Some(key_used));
eprintln!("blake3(zeros, key_used) == dumped_hash ? {} (true => M is still zero)",
zeros_hash == hash);
let key_candidates: [(&str, Option<[u8; 32]>); 2] =
[("keyed[key_used]", Some(key_used)), ("unkeyed", None)];
let mut found = false;
let mut found_nonzero = false;
for (kname, key) in key_candidates {
for off in 0..=(e.len().saturating_sub(64)) {
let window = &e[off..off + 64];
if blake3_digest(window, key) == hash {
let nonzero = window.iter().any(|&b| b != 0);
if !found || nonzero {
eprintln!("MATCH: transcript M @ entry+0x{off:03x}, key={kname}, nonzero={nonzero}");
}
if nonzero {
eprintln!(" M bytes = {:02x?}", window);
found_nonzero = true;
}
found = true;
if found_nonzero { break; }
}
}
if found_nonzero { break; }
}
eprintln!("=> hash reproduced: {found}; non-degenerate transcript reached: {found_nonzero}");
assert!(found, "could not reproduce the dumped hash from any 64-byte window — \
transcript layout or key interpretation still unknown");
}
}
-2352
View File
File diff suppressed because it is too large Load Diff
-190
View File
@@ -1,190 +0,0 @@
//! Keyed-BLAKE3 Merkle tree + multi-leaf proof — port of the reference
//! `pearl-blake3` (ISC), built on the stock `blake3::hazmat` API so the tree's
//! node hashes (and root) are bit-identical to BLAKE3's own tree. Used to build
//! the `PlainProof` Merkle authentication paths for share submission.
use blake3::hazmat::{merge_subtrees_non_root, merge_subtrees_root, HasherExt, Mode};
use blake3::{Hasher, CHUNK_LEN, OUT_LEN};
use std::collections::BTreeSet;
pub type Digest = [u8; OUT_LEN]; // 32
fn chunk_cv(key: &[u8; 32], data: &[u8], idx: u64) -> Digest {
Hasher::new_keyed(key)
.set_input_offset(idx * CHUNK_LEN as u64)
.update(data)
.finalize_non_root()
}
/// Round `raw_len` up to a multiple of the BLAKE3 chunk (1024).
pub fn padded_chunk_len(raw_len: usize) -> usize {
raw_len.div_ceil(CHUNK_LEN) * CHUNK_LEN
}
/// Merge precomputed chunk chaining values (`finalize_non_root` CVs, in order)
/// into the keyed-BLAKE3 root — the same pairwise reduction as [`MerkleTree::new`],
/// but for CVs computed elsewhere (e.g. on the GPU). Requires `cvs.len() >= 2`.
pub fn root_from_cvs(mut layer: Vec<Digest>, key: &[u8; 32]) -> Digest {
let mode = Mode::KeyedHash(key);
assert!(layer.len() >= 2, "root_from_cvs needs >= 2 chunks");
while layer.len() > 2 {
layer = layer
.chunks(2)
.map(|p| if p.len() == 2 { merge_subtrees_non_root(&p[0], &p[1], mode) } else { p[0] })
.collect();
}
*merge_subtrees_root(&layer[0], &layer[1], mode).as_bytes()
}
pub fn pad_to_chunk_boundary(data: &[u8]) -> Vec<u8> {
let mut v = data.to_vec();
v.resize(padded_chunk_len(v.len()), 0);
v
}
/// Keyed-BLAKE3 Merkle tree over 1024-byte leaves.
pub struct MerkleTree {
layers: Vec<Vec<Digest>>,
data: Vec<u8>,
key: [u8; 32],
}
impl MerkleTree {
pub fn new(data: &[u8], key: [u8; 32]) -> Self {
let mode = Mode::KeyedHash(&key);
if data.is_empty() {
return Self { layers: vec![vec![]], data: vec![], key };
}
if data.len() <= CHUNK_LEN {
let root = *blake3::keyed_hash(&key, data).as_bytes();
return Self { layers: vec![vec![root]], data: data.to_vec(), key };
}
let n = data.len().div_ceil(CHUNK_LEN);
let cvs: Vec<Digest> = (0..n)
.map(|i| {
let s = i * CHUNK_LEN;
let e = (s + CHUNK_LEN).min(data.len());
chunk_cv(&key, &data[s..e], i as u64)
})
.collect();
let mut layers = vec![cvs];
while layers.last().unwrap().len() > 2 {
let prev = layers.last().unwrap();
let next: Vec<Digest> = prev
.chunks(2)
.map(|p| if p.len() == 2 { merge_subtrees_non_root(&p[0], &p[1], mode) } else { p[0] })
.collect();
layers.push(next);
}
let last = layers.last().unwrap();
if last.len() == 2 {
let root = *merge_subtrees_root(&last[0], &last[1], mode).as_bytes();
layers.push(vec![root]);
}
Self { layers, data: data.to_vec(), key }
}
pub fn root(&self) -> Digest {
self.layers.last().map(|l| l[0]).unwrap_or([0u8; OUT_LEN])
}
pub fn num_leaves(&self) -> usize {
self.layers[0].len()
}
/// Leaf indices (1024-byte chunks) needed to authenticate the given matrix rows.
pub fn compute_leaf_indices_from_rows(row_indices: &[usize], shape: (usize, usize)) -> Vec<usize> {
let cols = shape.1;
let mut idx = BTreeSet::new();
for &row in row_indices {
let first = (row * cols) / CHUNK_LEN;
let last = ((row + 1) * cols - 1) / CHUNK_LEN;
for i in first..=last {
idx.insert(i);
}
}
idx.into_iter().collect()
}
pub fn get_multileaf_proof(&self, leaf_indices: &[usize]) -> MerkleProof {
assert!(!leaf_indices.is_empty());
let unique: BTreeSet<usize> = leaf_indices.iter().copied().collect();
let total_leaves = self.num_leaves();
assert!(*unique.last().unwrap() < total_leaves, "leaf index out of bounds");
let sorted: Vec<usize> = unique.iter().copied().collect();
let leaf_data: Vec<[u8; CHUNK_LEN]> = sorted
.iter()
.map(|&i| {
let s = i * CHUNK_LEN;
let e = (s + CHUNK_LEN).min(self.data.len());
let mut c = [0u8; CHUNK_LEN];
c[..e - s].copy_from_slice(&self.data[s..e]);
c
})
.collect();
let mut siblings = Vec::new();
let mut cur = unique;
let mut level_len = total_leaves;
let mut level = 0;
while level_len > 1 && !cur.is_empty() {
let nodes = &self.layers[level];
for &i in &cur {
if i % 2 == 1 {
if !cur.contains(&(i - 1)) {
siblings.push(nodes[i - 1]);
}
} else if !cur.contains(&(i + 1)) && (i + 1) < level_len {
siblings.push(nodes[i + 1]);
}
}
cur = cur.iter().map(|&i| i / 2).collect();
level_len = level_len.div_ceil(2);
level += 1;
}
MerkleProof { leaf_data, leaf_indices: sorted, total_leaves, root: self.root(), siblings }
}
#[cfg(test)]
fn key_used(&self) -> [u8; 32] {
self.key
}
}
/// Multi-leaf Merkle proof. `leaf_data` are the raw 1024-byte chunks; `siblings`
/// the authentication path.
#[derive(Clone)]
pub struct MerkleProof {
pub leaf_data: Vec<[u8; CHUNK_LEN]>,
pub leaf_indices: Vec<usize>,
pub total_leaves: usize,
pub root: Digest,
pub siblings: Vec<Digest>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn root_equals_keyed_blake3() {
let key = [99u8; 32];
for len in [500usize, 1024, 1500, 4096, 5000] {
let data: Vec<u8> = (0..len).map(|i| (i % 251) as u8).collect();
let padded = pad_to_chunk_boundary(&data);
let tree = MerkleTree::new(&padded, key);
assert_eq!(tree.root(), *blake3::keyed_hash(&key, &padded).as_bytes(), "len {len}");
assert_eq!(tree.key_used(), key);
}
}
#[test]
fn multileaf_proof_collects_siblings() {
let key = [7u8; 32];
let data: Vec<u8> = (0..8 * CHUNK_LEN).map(|i| (i % 251) as u8).collect();
let tree = MerkleTree::new(&data, key);
let proof = tree.get_multileaf_proof(&[0, 3]);
assert_eq!(proof.total_leaves, 8);
assert_eq!(proof.leaf_indices, vec![0, 3]);
assert!(!proof.siblings.is_empty());
assert_eq!(proof.root, tree.root());
}
}
-844
View File
@@ -1,844 +0,0 @@
//! pearlhash / Pearl (PRL) Proof-of-Useful-Work — native CPU implementation.
//!
//! A faithful port of the official reference (github.com/pearl-research-labs/pearl,
//! ISC license): `zk-pow/src/ffi/mine.rs` + `circuit/pearl_noise.rs` +
//! `api/proof{,_utils}.rs`, using the stock `blake3` crate. Confirmed against the
//! whitepaper (pearlresearch.ai) and the alpha-miner GPU SASS we dumped — see
//! `pearl-dump/SPEC.md`.
//!
//! Pipeline: keyed-BLAKE3 commitment → low-rank int8 noise (A=A+E, B=B+F) →
//! tiled int8·int8→int32 matmul → 16×u32 transcript `M[%16]=(M⋘13)⊕X` →
//! win when `BLAKE3(M, key=sA) ≤ difficulty·h·w·k`.
use primitive_types::U256;
use rand::Rng;
use super::merkle::{MerkleProof, MerkleTree};
// ---- constants (from pearl_program.rs / pearl_noise.rs) ----
pub const JACKPOT_SIZE: usize = 16;
pub const LROT_PER_TILE: u32 = 13;
const BLAKE3_DIGEST_SIZE: usize = 32;
const CHUNK_LEN: usize = 1024; // blake3 chunk
const SIGNAL_MIN: i8 = -64;
const SIGNAL_MAX: i8 = 64;
const NOISE_RANGE: usize = 128;
const IDXS_PER_COL: usize = 2;
const UNIFORM_NOISE_RANGE: usize = NOISE_RANGE / IDXS_PER_COL; // 64
const ZERO_POINT_TRANSLATION: i8 = (UNIFORM_NOISE_RANGE / 2) as i8; // 32
const RANGE_MASK: u8 = (UNIFORM_NOISE_RANGE - 1) as u8; // 63
const fn padded_label(label: [u8; 8]) -> [u8; 32] {
let mut r = [0u8; 32];
let mut i = 0;
while i < 8 {
r[i] = label[i];
i += 1;
}
r
}
/// BLAKE3 `seed` label for the A-side noise PRNG (goes in message bytes 32..64).
pub const SEED_LABEL_A: [u8; 32] = padded_label(*b"A_tensor");
/// BLAKE3 `seed` label for the B-side noise PRNG.
pub const SEED_LABEL_B: [u8; 32] = padded_label(*b"B_tensor");
/// Keyed (or unkeyed) BLAKE3, matching the reference `blake3_digest`.
pub fn blake3_digest(data: &[u8], key: Option<[u8; 32]>) -> [u8; 32] {
let mut h = match key {
Some(k) => blake3::Hasher::new_keyed(&k),
None => blake3::Hasher::new(),
};
h.update(data);
*h.finalize().as_bytes()
}
fn pad_to_chunk_boundary(data: &[u8]) -> Vec<u8> {
let mut v = data.to_vec();
let rem = v.len() % CHUNK_LEN;
if rem != 0 {
v.resize(v.len() + (CHUNK_LEN - rem), 0);
}
v
}
// ---- block header + mining configuration (wire-exact serialization) ----
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MMAType {
Int7xInt7ToInt32 = 0,
}
#[derive(Clone, Copy, Debug)]
pub struct IncompleteBlockHeader {
pub version: u32,
pub prev_block: [u8; 32],
pub merkle_root: [u8; 32],
pub timestamp: u32,
pub nbits: u32,
}
impl IncompleteBlockHeader {
pub const SERIALIZED_SIZE: usize = 76;
/// Parse the 76-byte serialized header (e.g. the `mining.notify` header hex).
/// Inverse of [`to_bytes`](Self::to_bytes).
pub fn from_bytes(d: &[u8]) -> Option<Self> {
if d.len() < 76 {
return None;
}
let mut prev_block: [u8; 32] = d[4..36].try_into().ok()?;
prev_block.reverse();
let mut merkle_root: [u8; 32] = d[36..68].try_into().ok()?;
merkle_root.reverse();
Some(Self {
version: u32::from_le_bytes(d[0..4].try_into().ok()?),
prev_block,
merkle_root,
timestamp: u32::from_le_bytes(d[68..72].try_into().ok()?),
nbits: u32::from_le_bytes(d[72..76].try_into().ok()?),
})
}
/// version LE | prev_block reversed | merkle_root reversed | timestamp LE | nbits LE
pub fn to_bytes(&self) -> [u8; 76] {
let mut b = Vec::with_capacity(76);
b.extend_from_slice(&self.version.to_le_bytes());
b.extend(self.prev_block.iter().rev().copied());
b.extend(self.merkle_root.iter().rev().copied());
b.extend_from_slice(&self.timestamp.to_le_bytes());
b.extend_from_slice(&self.nbits.to_le_bytes());
b.try_into().unwrap()
}
}
/// 3-dimensional periodic partition of matrix rows/cols (the "thread pattern").
#[derive(Clone, Copy, Debug)]
pub struct PeriodicPattern {
pub shape: [(u32, u32); 3], // (stride, length) per dim
}
impl PeriodicPattern {
pub const NUM_DIMS: usize = 3;
/// Size-1 pattern ({0}) — one row/col per tile.
pub fn single() -> Self {
Self { shape: [(1, 1); 3] }
}
pub fn to_list(&self) -> Vec<u32> {
let mut res = vec![0u32];
for &(stride, length) in &self.shape {
let mut next = Vec::with_capacity(res.len() * length as usize);
for i in 0..length {
for &r in &res {
next.push(r + i * stride);
}
}
res = next;
}
res
}
pub fn offset_is_valid(&self, mut offset: u32) -> bool {
for &(stride, length) in self.shape.iter().rev() {
offset %= stride * length;
if offset >= stride {
return false;
}
}
true
}
pub fn period(&self) -> u32 {
let &(stride, length) = self.shape.last().unwrap();
stride * length
}
pub fn size(&self) -> u32 {
self.shape.iter().map(|&(_, l)| l).product()
}
/// 6-byte serialization: per dim (factor-1, length-1).
pub fn to_bytes(&self) -> [u8; 6] {
let mut d = [0u8; 6];
let mut min_stride = 1u32;
for (i, &(stride, length)) in self.shape.iter().enumerate() {
let factor = stride / min_stride;
d[2 * i] = (factor - 1) as u8;
d[2 * i + 1] = (length - 1) as u8;
min_stride = stride * length;
}
d
}
/// Inverse of [`to_bytes`](Self::to_bytes): reconstruct shape from 6 bytes.
pub fn from_bytes(d: &[u8; 6]) -> Self {
let mut shape = [(0u32, 0u32); 3];
let mut min_stride = 1u32;
for i in 0..3 {
let factor = d[2 * i] as u32 + 1;
let length = d[2 * i + 1] as u32 + 1;
let stride = factor * min_stride;
shape[i] = (stride, length);
min_stride = stride * length;
}
Self { shape }
}
/// Build a pattern from a sorted index list starting at 0 (port of the
/// reference `PeriodicPattern::from_list`). Returns None if not periodic.
pub fn from_list(pattern: &[u32]) -> Option<Self> {
if pattern.is_empty() || pattern[0] != 0 || !pattern.windows(2).all(|w| w[0] < w[1]) {
return None;
}
let mut p = pattern.to_vec();
let mut shape_vec: Vec<(u32, u32)> = Vec::new();
while p.len() > 1 {
let mut found = false;
for period in 1..p.len() {
if p.len() % period == 0 {
let s = p[period];
if (0..p.len() - period).all(|i| p[i] + s == p[i + period]) {
shape_vec.push((s, (p.len() / period) as u32));
p.truncate(period);
found = true;
break;
}
}
}
found.then_some(())?;
}
shape_vec.reverse();
let period = shape_vec.last().map_or(1, |&(s, l)| s * l);
while shape_vec.len() < 3 {
shape_vec.push((period, 1));
}
Some(Self { shape: shape_vec.try_into().ok()? })
}
}
#[derive(Clone, Copy, Debug)]
pub struct MiningConfiguration {
pub common_dim: u32, // k
pub rank: u16, // r
pub mma_type: MMAType,
pub rows_pattern: PeriodicPattern,
pub cols_pattern: PeriodicPattern,
pub reserved: [u8; 32],
}
impl MiningConfiguration {
pub const SERIALIZED_SIZE: usize = 52;
pub fn to_bytes(&self) -> [u8; 52] {
let mut b = Vec::with_capacity(52);
b.extend_from_slice(&self.common_dim.to_le_bytes());
b.extend_from_slice(&self.rank.to_le_bytes());
b.extend_from_slice(&(self.mma_type as u16).to_le_bytes());
b.extend_from_slice(&self.rows_pattern.to_bytes());
b.extend_from_slice(&self.cols_pattern.to_bytes());
b.extend_from_slice(&self.reserved);
b.try_into().unwrap()
}
pub fn dot_product_length(&self) -> usize {
let k = self.common_dim as usize;
let r = self.rank as usize;
k - k % r
}
}
// ---- commitment + difficulty ----
fn compute_job_key(header: &IncompleteBlockHeader, config: &MiningConfiguration) -> [u8; 32] {
let mut d = Vec::with_capacity(128);
d.extend_from_slice(&header.to_bytes());
d.extend_from_slice(&config.to_bytes());
blake3_digest(&d, None)
}
/// Returns (b_noise_seed = sB, a_noise_seed = sA).
fn compute_commitment_hash(job_key: &[u8; 32], a_row_major: &[u8], b_col_major: &[u8]) -> ([u8; 32], [u8; 32]) {
let hash_a = blake3_digest(a_row_major, Some(*job_key));
let hash_b = blake3_digest(b_col_major, Some(*job_key));
let mut bi = [0u8; 64];
bi[..32].copy_from_slice(job_key);
bi[32..].copy_from_slice(&hash_b);
let b_noise_seed = blake3_digest(&bi, None);
let mut ai = [0u8; 64];
ai[..32].copy_from_slice(&b_noise_seed);
ai[32..].copy_from_slice(&hash_a);
let a_noise_seed = blake3_digest(&ai, None);
(b_noise_seed, a_noise_seed)
}
pub fn compute_jackpot_hash(jackpot: &[u32; 16], commitment_hash: [u8; 32]) -> [u8; 32] {
let msg: [u8; 64] = std::array::from_fn(|i| jackpot[i / 4].to_le_bytes()[i % 4]);
blake3_digest(&msg, Some(commitment_hash))
}
/// Bitcoin-style compact target decode.
pub fn nbits_to_difficulty(nbits: u32) -> U256 {
let exponent = (nbits >> 24) as usize;
let mantissa = nbits & 0x00ff_ffff;
if mantissa == 0 || exponent == 0 || mantissa & 0x0080_0000 != 0 {
return U256::zero();
}
let mut t = U256::from(mantissa);
if exponent <= 3 {
t >>= 8 * (3 - exponent);
} else {
t <<= 8 * (exponent - 3);
}
t
}
/// Pool **share** acceptance bound for stratum difficulty `D`: a candidate tile
/// is a valid share iff `jackpot_hash (LE u256) <= share_bound(D, h, w, k)`.
///
/// Derived empirically by recomputing 5 accepted prl.kryptex.network shares
/// (all at `mining.set_difficulty 30`): they satisfy
/// `hash <= 2^256 / (D · h·w·k · C)` with `C ≈ 32` — the `∝ 1/(D·h·w·k)` form
/// matches the reference block bound, and the weakest accepted share is within
/// ~1% of the `C=32` threshold. We use `C=32` (slightly strict) so every share
/// we submit clears the pool's threshold; re-derive `C` if a new config rejects.
pub fn share_bound(difficulty: u64, h: usize, w: usize, k: usize) -> U256 {
let denom = U256::from(difficulty) * U256::from(h * w * k) * U256::from(32u64);
if denom.is_zero() { U256::MAX } else { U256::MAX / denom }
}
/// Block-level acceptance bound (full network difficulty from `nbits`):
/// `hash <= nbits_to_difficulty(nbits) · h·w·k`. Pool mining uses [`share_bound`].
pub fn extract_difficulty_bound(nbits: u32, config: &MiningConfiguration) -> U256 {
let diff = nbits_to_difficulty(nbits);
let h = config.rows_pattern.size() as usize;
let w = config.cols_pattern.size() as usize;
let factor = U256::from(h * w * config.dot_product_length());
if factor.is_zero() || diff > U256::MAX / factor {
U256::MAX
} else {
diff * factor
}
}
// ---- noise generation (port of pearl_noise.rs) ----
fn get_random_hash(index: usize, seed: &[u8; 32], key: &[u8; 32], prepend_index: usize) -> [u8; 32] {
let mut m = [0u8; 64];
let v = (1 + index) as i32;
m[prepend_index * 4..prepend_index * 4 + 4].copy_from_slice(&v.to_le_bytes());
m[32..64].copy_from_slice(seed);
blake3_digest(&m, Some(*key))
}
fn generate_uniform_random_matrix(seed: &[u8; 32], key: &[u8; 32], row_indices: &[usize], num_cols: usize) -> Vec<Vec<i8>> {
row_indices
.iter()
.map(|&row| {
let start = row * num_cols;
(start / BLAKE3_DIGEST_SIZE..(start + num_cols).div_ceil(BLAKE3_DIGEST_SIZE))
.flat_map(|block| {
get_random_hash(block, seed, key, 0).into_iter().enumerate().filter_map(move |(k, byte)| {
let idx = block * BLAKE3_DIGEST_SIZE + k;
(idx >= start && idx < start + num_cols).then(|| (byte & RANGE_MASK) as i8 - ZERO_POINT_TRANSLATION)
})
})
.collect()
})
.collect()
}
fn mul_hi_u32(a: u32, b: u32) -> u32 {
((a as u64 * b as u64) >> 32) as u32
}
fn generate_permutation_matrix(seed: &[u8; 32], key: &[u8; 32], k: usize, noise_rank: usize) -> Vec<[u32; 2]> {
const LINES_PER_HASH: usize = BLAKE3_DIGEST_SIZE / 4;
let rank_mask = (noise_rank - 1) as u32;
let mut res = vec![[0u32; 2]; k];
for (i, chunk) in res.chunks_mut(LINES_PER_HASH).enumerate() {
let rh = get_random_hash(i, seed, key, 1);
for (j, slot) in chunk.iter_mut().enumerate() {
let r = u32::from_le_bytes([rh[j * 4], rh[j * 4 + 1], rh[j * 4 + 2], rh[j * 4 + 3]]);
let first = r & rank_mask;
let second = first ^ (1 + mul_hi_u32((noise_rank - 1) as u32, r));
*slot = [first, second];
}
}
res
}
fn matvec_sparse_perm(perm: &[[u32; 2]], vec: &[i8]) -> Vec<i8> {
perm.iter()
.map(|&[a, b]| (vec[a as usize] as i32 - vec[b as usize] as i32) as i8)
.collect()
}
struct Noise {
a: Vec<Vec<i8>>, // m×k (selected rows)
b: Vec<Vec<i8>>, // n×k (selected cols of Bᵀ)
}
fn compute_noise_for_indices(
k: usize,
noise_rank: usize,
(b_noise_seed, a_noise_seed): ([u8; 32], [u8; 32]),
a_rows: &[usize],
b_cols: &[usize],
) -> Noise {
let e_al = generate_uniform_random_matrix(&SEED_LABEL_A, &a_noise_seed, a_rows, noise_rank);
let e_ar_t = generate_permutation_matrix(&SEED_LABEL_A, &a_noise_seed, k, noise_rank);
let e_bl = generate_permutation_matrix(&SEED_LABEL_B, &b_noise_seed, k, noise_rank);
let e_br_t = generate_uniform_random_matrix(&SEED_LABEL_B, &b_noise_seed, b_cols, noise_rank);
Noise {
a: e_al.iter().map(|row| matvec_sparse_perm(&e_ar_t, row)).collect(),
b: e_br_t.iter().map(|col| matvec_sparse_perm(&e_bl, col)).collect(),
}
}
// ---- mining ----
fn flatten(matrix: &[Vec<i8>]) -> Vec<u8> {
matrix.iter().flatten().map(|&x| x as u8).collect()
}
pub fn threads_partition(pattern: &PeriodicPattern, total: usize) -> Vec<Vec<usize>> {
let period = pattern.period() as usize;
assert!(total % period == 0, "dimension must be divisible by pattern period");
let base: Vec<usize> = pattern.to_list().iter().map(|&i| i as usize).collect();
(0..total)
.filter(|&i| pattern.offset_is_valid(i as u32))
.map(|off| base.iter().map(|&d| off + d).collect())
.collect()
}
/// A winning tile: the matrices + the row/col indices that open it. Enough to
/// rebuild the Merkle proof for submission (TODO: proof serialization).
pub struct Solution {
pub m: usize,
pub n: usize,
pub k: usize,
pub rank: usize,
pub a: Vec<Vec<i8>>,
pub bt: Vec<Vec<i8>>, // Bᵀ
pub a_rows: Vec<usize>,
pub b_cols: Vec<usize>,
pub jackpot_hash: [u8; 32],
}
/// Noised int8 operands for one mining attempt, shared by the CPU and GPU
/// miners so they cannot drift. `A = A + E` and `B′ᵀ = (B + F)ᵀ` both fit int8
/// (A,B∈[-64,64], noise∈[-63,62] ⇒ [-127,126]), stored row-major and flat.
pub struct AttemptOperands {
pub a_noised: Vec<i8>, // m×k row-major, A = A + E
pub bt_noised: Vec<i8>, // n×k row-major, B′ᵀ = (B + F)ᵀ
pub a_noise_seed: [u8; 32], // sA — the keyed-BLAKE3 jackpot-hash key
}
/// Commitment + noise for an attempt over random `a` (m×k) and `bt` (n×k = Bᵀ),
/// producing the flat int8 noised operands and the jackpot key. This is the work
/// every tile sweep (CPU or GPU) shares; the per-tile GEMM is [`tile_jackpot`].
pub fn prepare_attempt(header: &IncompleteBlockHeader, config: &MiningConfiguration, a: &[Vec<i8>], bt: &[Vec<i8>]) -> AttemptOperands {
let m = a.len();
let n = bt.len();
let k = config.common_dim as usize;
let rank = config.rank as usize;
let job_key = compute_job_key(header, config);
let a_rm = pad_to_chunk_boundary(&flatten(a));
let b_cm = pad_to_chunk_boundary(&flatten(bt));
let seeds = compute_commitment_hash(&job_key, &a_rm, &b_cm);
let a_noise_seed = seeds.1;
let noise = compute_noise_for_indices(k, rank, seeds, &(0..m).collect::<Vec<_>>(), &(0..n).collect::<Vec<_>>());
let mut a_noised = vec![0i8; m * k];
for (row, (ar, nr)) in a.iter().zip(&noise.a).enumerate() {
for (l, (&x, &e)) in ar.iter().zip(nr).enumerate() {
a_noised[row * k + l] = (x as i32 + e as i32) as i8;
}
}
// noise.b is indexed [col][l] (per selected column of Bᵀ).
let mut bt_noised = vec![0i8; n * k];
for (col, (bc, nc)) in bt.iter().zip(&noise.b).enumerate() {
for (l, (&x, &e)) in bc.iter().zip(nc).enumerate() {
bt_noised[col * k + l] = (x as i32 + e as i32) as i8;
}
}
AttemptOperands { a_noised, bt_noised, a_noise_seed }
}
/// The job key = `BLAKE3(header‖config)` (no key). Drives the commitment.
pub fn job_key(header: &IncompleteBlockHeader, config: &MiningConfiguration) -> [u8; 32] {
compute_job_key(header, config)
}
/// Derive `(b_noise_seed, a_noise_seed)` from the job key and the two matrix
/// commitments `HA`/`HB` (e.g. computed on the GPU). Same as the seed-mixing
/// inside [`attempt_seeds`], but for externally-computed `HA`/`HB`.
pub fn seeds_from_commitment(job_key: &[u8; 32], hash_a: [u8; 32], hash_b: [u8; 32]) -> ([u8; 32], [u8; 32]) {
let mut bi = [0u8; 64];
bi[..32].copy_from_slice(job_key);
bi[32..].copy_from_slice(&hash_b);
let b_noise_seed = blake3_digest(&bi, None);
let mut ai = [0u8; 64];
ai[..32].copy_from_slice(&b_noise_seed);
ai[32..].copy_from_slice(&hash_a);
let a_noise_seed = blake3_digest(&ai, None);
(b_noise_seed, a_noise_seed)
}
/// Commitment seeds for an attempt, without computing the noise: returns
/// `(b_noise_seed, a_noise_seed)` (= sB, sA). `a_noise_seed` is also the jackpot
/// hash key. Used by the GPU noise path, which generates A/B′ᵀ on-device from
/// these seeds. The CPU [`prepare_attempt`] computes the same seeds internally.
pub fn attempt_seeds(header: &IncompleteBlockHeader, config: &MiningConfiguration, a: &[Vec<i8>], bt: &[Vec<i8>]) -> ([u8; 32], [u8; 32]) {
let job_key = compute_job_key(header, config);
let a_rm = pad_to_chunk_boundary(&flatten(a));
let b_cm = pad_to_chunk_boundary(&flatten(bt));
compute_commitment_hash(&job_key, &a_rm, &b_cm)
}
/// Cumulative tiled int8 GEMM + transcript fold for one tile, over the flat
/// noised operands from [`prepare_attempt`]. `Cblk` accumulates across rank
/// chunks; each chunk XOR-reduces the tile and folds it into the 16×u32
/// transcript `M[chunk%16] = (M⋘13) ⊕ X`. Matches the GPU `pearl_tile_dp4a`.
pub fn tile_jackpot(a_noised: &[i8], bt_noised: &[i8], a_rows: &[usize], b_cols: &[usize], k: usize, rank: usize) -> [u32; 16] {
let (th, tw) = (a_rows.len(), b_cols.len());
let mut tile = vec![0i32; th * tw];
let mut jackpot = [0u32; 16];
let mut chunk = 0usize;
let mut ll = rank;
while ll <= k {
for (u, &ai) in a_rows.iter().enumerate() {
for (v, &bi) in b_cols.iter().enumerate() {
let mut s = tile[u * tw + v];
for l in ll - rank..ll {
s += a_noised[ai * k + l] as i32 * bt_noised[bi * k + l] as i32;
}
tile[u * tw + v] = s;
}
}
let xored = tile.iter().fold(0u32, |acc, &x| acc ^ x as u32);
jackpot[chunk % JACKPOT_SIZE] = jackpot[chunk % JACKPOT_SIZE].rotate_left(LROT_PER_TILE) ^ xored;
chunk += 1;
ll += rank;
}
jackpot
}
/// One mining attempt over random A,B. Returns a solution if any tile opens.
pub fn try_mine_one<R: Rng>(
rng: &mut R,
m: usize,
n: usize,
k: usize,
header: &IncompleteBlockHeader,
config: &MiningConfiguration,
bound: U256,
) -> Option<Solution> {
let rank = config.rank as usize;
let a: Vec<Vec<i8>> = (0..m).map(|_| (0..k).map(|_| rng.random_range(SIGNAL_MIN..=SIGNAL_MAX)).collect()).collect();
let b: Vec<Vec<i8>> = (0..k).map(|_| (0..n).map(|_| rng.random_range(SIGNAL_MIN..=SIGNAL_MAX)).collect()).collect();
let bt: Vec<Vec<i8>> = (0..n).map(|i| (0..k).map(|j| b[j][i]).collect()).collect();
let op = prepare_attempt(header, config, &a, &bt);
for a_rows in threads_partition(&config.rows_pattern, m) {
for b_cols in threads_partition(&config.cols_pattern, n) {
let jackpot = tile_jackpot(&op.a_noised, &op.bt_noised, &a_rows, &b_cols, k, rank);
let jackpot_hash = compute_jackpot_hash(&jackpot, op.a_noise_seed);
if U256::from_little_endian(&jackpot_hash) <= bound {
return Some(Solution { m, n, k, rank, a, bt, a_rows, b_cols, jackpot_hash });
}
}
}
None
}
/// Recompute a solution's jackpot hash and check it meets target — the CPU
/// share verifier (gate before submit). Self-consistent with the miner.
pub fn verify(header: &IncompleteBlockHeader, config: &MiningConfiguration, sol: &Solution, bound: U256) -> bool {
let (_m, n, k, rank) = (sol.m, sol.n, sol.k, sol.rank);
let job_key = compute_job_key(header, config);
let a_rm = pad_to_chunk_boundary(&flatten(&sol.a));
let b_cm = pad_to_chunk_boundary(&flatten(&sol.bt));
let seeds = compute_commitment_hash(&job_key, &a_rm, &b_cm);
let a_noise_seed = seeds.1;
let noise = compute_noise_for_indices(k, rank, seeds, &sol.a_rows, &sol.b_cols);
let mut jackpot = [0u32; 16];
let mut tile = vec![vec![0i32; sol.b_cols.len()]; sol.a_rows.len()];
for (li, ll) in (rank..=k).step_by(rank).enumerate() {
for (u, _ai) in sol.a_rows.iter().enumerate() {
for (v, _bi) in sol.b_cols.iter().enumerate() {
for l in ll - rank..ll {
// A = A + E (noise rows are indexed 0..rows for the selected set)
let a_v = sol.a[sol.a_rows[u]][l] as i32 + noise.a[u][l] as i32;
let b_v = sol.bt[sol.b_cols[v]][l] as i32 + noise.b[v][l] as i32;
tile[u][v] += a_v * b_v;
}
}
}
let xored = tile.iter().flatten().fold(0u32, |acc, &x| acc ^ x as u32);
let tid = li % JACKPOT_SIZE;
jackpot[tid] = jackpot[tid].rotate_left(LROT_PER_TILE) ^ xored;
}
let jh = compute_jackpot_hash(&jackpot, a_noise_seed);
let _ = n;
jh == sol.jackpot_hash && U256::from_little_endian(&jh) <= bound
}
// ---- submission proof (Merkle authentication of the used A-rows / B-cols) ----
/// Merkle proof for one matrix + which rows it authenticates.
pub struct MatrixMerkleProof {
pub proof: MerkleProof,
pub row_indices: Vec<usize>,
}
/// The block-opening proof submitted to the pool (pre-ZK "PlainProof").
pub struct PlainProof {
pub m: usize,
pub n: usize,
pub k: usize,
pub noise_rank: usize,
pub a: MatrixMerkleProof,
pub bt: MatrixMerkleProof,
}
/// Build a matrix's Merkle proof for `row_indices` (port of reference
/// `build_matrix_proof`). The tree root equals `blake3(padded, key=job_key)`,
/// i.e. the commitment HA/HB.
fn build_matrix_proof(matrix: &[Vec<i8>], job_key: &[u8; 32], row_indices: &[usize], num_cols: usize) -> MatrixMerkleProof {
let padded = super::merkle::pad_to_chunk_boundary(&flatten(matrix));
let tree = MerkleTree::new(&padded, *job_key);
let leaf_indices = MerkleTree::compute_leaf_indices_from_rows(row_indices, (matrix.len(), num_cols));
MatrixMerkleProof {
proof: tree.get_multileaf_proof(&leaf_indices),
row_indices: row_indices.to_vec(),
}
}
/// Assemble the submittable proof for a found [`Solution`].
pub fn build_proof(header: &IncompleteBlockHeader, config: &MiningConfiguration, sol: &Solution) -> PlainProof {
let job_key = compute_job_key(header, config);
PlainProof {
m: sol.m,
n: sol.n,
k: sol.k,
noise_rank: sol.rank,
a: build_matrix_proof(&sol.a, &job_key, &sol.a_rows, sol.k),
bt: build_matrix_proof(&sol.bt, &job_key, &sol.b_cols, sol.k),
}
}
/// Wire encoding of the proof = `bincode(PlainProof)`, matching the reference
/// exactly (the pool accepts `base64(this)`; confirmed from the live capture —
/// `mining.submit [addr, job_id, base64(proof)]`, `share_format:"base64"`).
///
/// bincode layout (little-endian fixint, `usize→u64`, `Vec→u64 count+elems`):
/// PlainProof { m, n, k, noise_rank, a, bt }
/// MatrixMerkleProof { proof, row_indices: Vec<u64> }
/// MerkleProof { leaf_data, leaf_indices, total_leaves, root[32], siblings }
/// leaf_data (serde_chunk_vec = `Vec<&[u8]>`): count, then per leaf `len(1024)+bytes`.
pub fn encode_proof(p: &PlainProof) -> Vec<u8> {
let mut out = Vec::new();
let mut u64 = |o: &mut Vec<u8>, v: usize| o.extend_from_slice(&(v as u64).to_le_bytes());
u64(&mut out, p.m);
u64(&mut out, p.n);
u64(&mut out, p.k);
u64(&mut out, p.noise_rank);
for mp in [&p.a, &p.bt] {
// MerkleProof.leaf_data : Vec<&[u8]> (count, then per-leaf len + bytes)
u64(&mut out, mp.proof.leaf_data.len());
for leaf in &mp.proof.leaf_data {
u64(&mut out, leaf.len()); // 1024
out.extend_from_slice(leaf);
}
// leaf_indices : Vec<u64>
u64(&mut out, mp.proof.leaf_indices.len());
for &li in &mp.proof.leaf_indices {
u64(&mut out, li);
}
// total_leaves : u64
u64(&mut out, mp.proof.total_leaves);
// root : [u8;32]
out.extend_from_slice(&mp.proof.root);
// siblings : Vec<[u8;32]>
u64(&mut out, mp.proof.siblings.len());
for sib in &mp.proof.siblings {
out.extend_from_slice(sib);
}
// MatrixMerkleProof.row_indices : Vec<u64>
u64(&mut out, mp.row_indices.len());
for &r in &mp.row_indices {
u64(&mut out, r);
}
}
out
}
#[cfg(test)]
mod tests {
use super::*;
fn easy_config(k: u32, rank: u16) -> MiningConfiguration {
MiningConfiguration {
common_dim: k,
rank,
mma_type: MMAType::Int7xInt7ToInt32,
rows_pattern: PeriodicPattern::single(),
cols_pattern: PeriodicPattern::single(),
reserved: [0u8; 32],
}
}
#[test]
fn serialization_sizes() {
let h = IncompleteBlockHeader { version: 1, prev_block: [3; 32], merkle_root: [4; 32], timestamp: 9, nbits: 0x207fffff };
assert_eq!(h.to_bytes().len(), 76);
let c = easy_config(64, 32);
assert_eq!(c.to_bytes().len(), 52);
assert_eq!(c.rows_pattern.to_list(), vec![0]); // size-1 pattern
}
/// Recompute the jackpot hash from a real ACCEPTED pool proof
/// (/tmp/pearl_proof.bin) to derive the difficulty-30 share-target formula.
/// Ignored — needs the captured proof file. Run:
/// cargo test --no-default-features --features pearl --bin jackpotminer derive_share_target -- --ignored --nocapture
#[test]
#[ignore]
fn derive_share_target() {
let hx = |s: &str| -> Vec<u8> { (0..s.len() / 2).map(|i| u8::from_str_radix(&s[2*i..2*i+2], 16).unwrap()).collect() };
let hdr_hex = match std::fs::read_to_string("/tmp/pearl_headers.txt") {
Ok(s) => s.lines().find(|l| !l.trim().is_empty()).unwrap_or("").to_string(),
Err(_) => { eprintln!("no /tmp/pearl_headers.txt; skipping"); return; }
};
let header = IncompleteBlockHeader::from_bytes(&hx(&hdr_hex)).unwrap();
let config = MiningConfiguration {
common_dim: 4096, rank: 128, mma_type: MMAType::Int7xInt7ToInt32,
rows_pattern: PeriodicPattern::from_list(&[0, 32]).unwrap(),
cols_pattern: PeriodicPattern::from_list(&(0..64).collect::<Vec<_>>()).unwrap(),
reserved: [0u8; 32],
};
let job_key = compute_job_key(&header, &config);
let mut quals: Vec<U256> = vec![];
let mut hwk = U256::one();
for idx in 0..16usize {
let raw = match std::fs::read(format!("/tmp/pearl_proof_{idx}.bin")) {
Ok(r) => r,
Err(_) => break,
};
let mut o = 0usize;
let rd = |o: &mut usize| { let v = u64::from_le_bytes(raw[*o..*o + 8].try_into().unwrap()); *o += 8; v as usize };
let (_m, _n, k, rank) = (rd(&mut o), rd(&mut o), rd(&mut o), rd(&mut o));
let mut mats = vec![];
for _ in 0..2 {
let ld = rd(&mut o);
let mut chunks = std::collections::HashMap::new();
let mut idxs = vec![];
let mut leaves = vec![];
for _ in 0..ld { let l = rd(&mut o); leaves.push(raw[o..o + l].to_vec()); o += l; }
let li = rd(&mut o);
for _ in 0..li { idxs.push(rd(&mut o)); }
let _t = rd(&mut o);
let root: [u8; 32] = raw[o..o + 32].try_into().unwrap(); o += 32;
let sib = rd(&mut o); o += sib * 32;
let rows = rd(&mut o);
let mut row_indices = vec![];
for _ in 0..rows { row_indices.push(rd(&mut o)); }
for (c, leaf) in idxs.iter().zip(leaves) { chunks.insert(*c, leaf); }
mats.push((chunks, row_indices, root));
}
let cpr = k / 1024;
let extract = |chunks: &std::collections::HashMap<usize, Vec<u8>>, row: usize| -> Vec<i8> {
let mut v = Vec::with_capacity(k);
for c in 0..cpr { v.extend(chunks[&(row * cpr + c)].iter().map(|&b| b as i8)); }
v
};
let (hash_a, hash_b) = (mats[0].2, mats[1].2);
let mut bi = [0u8; 64]; bi[..32].copy_from_slice(&job_key); bi[32..].copy_from_slice(&hash_b);
let b_seed = blake3_digest(&bi, None);
let mut ai = [0u8; 64]; ai[..32].copy_from_slice(&b_seed); ai[32..].copy_from_slice(&hash_a);
let a_seed = blake3_digest(&ai, None);
let a_rows = mats[0].1.clone();
let b_cols = mats[1].1.clone();
let noise = compute_noise_for_indices(k, rank, (b_seed, a_seed), &a_rows, &b_cols);
let a_strips: Vec<Vec<i8>> = a_rows.iter().map(|&r| extract(&mats[0].0, r)).collect();
let b_strips: Vec<Vec<i8>> = b_cols.iter().map(|&c| extract(&mats[1].0, c)).collect();
let (h, w) = (a_rows.len(), b_cols.len());
hwk = U256::from(h * w * k);
let mut jackpot = [0u32; 16];
let mut tile = vec![vec![0i32; w]; h]; // Cblk ACCUMULATES across chunks
for (ci, ll) in (rank..=k).step_by(rank).enumerate() {
for u in 0..h {
for vv in 0..w {
for l in ll - rank..ll {
let a = a_strips[u][l] as i32 + noise.a[u][l] as i32;
let b = b_strips[vv][l] as i32 + noise.b[vv][l] as i32;
tile[u][vv] = tile[u][vv].wrapping_add(a * b);
}
}
}
let x = tile.iter().flatten().fold(0u32, |acc, &e| acc ^ e as u32);
jackpot[ci % 16] = jackpot[ci % 16].rotate_left(13) ^ x;
}
let hash = U256::from_little_endian(&compute_jackpot_hash(&jackpot, a_seed));
let q = U256::MAX / hash;
eprintln!("proof[{idx}] h={h} w={w} hwk={} hash=0x{:x} MAX/hash={}", h * w * k, hash, q);
quals.push(q);
}
if quals.is_empty() { eprintln!("no /tmp/pearl_proof_*.bin"); return; }
let minq = *quals.iter().min().unwrap();
eprintln!("--- pool share difficulty was 30 ---");
eprintln!("min(MAX/hash) = {}", minq);
eprintln!("min(MAX/hash) / 30 = {}", minq / U256::from(30u64));
eprintln!("min(MAX/hash) / hwk = {}", minq / hwk);
eprintln!("min(MAX/hash) / (30*hwk) = {}", minq / (U256::from(30u64) * hwk));
}
#[test]
fn pattern_from_list_and_bytes_roundtrip() {
let p = PeriodicPattern::from_list(&[0, 1, 8, 9]).expect("periodic");
let mut got = p.to_list();
got.sort_unstable();
assert_eq!(got, vec![0, 1, 8, 9]);
assert_eq!(p.size(), 4);
let p2 = PeriodicPattern::from_bytes(&p.to_bytes());
assert_eq!(p2.shape, p.shape, "to_bytes/from_bytes roundtrip");
assert!(PeriodicPattern::from_list(&[0, 1, 3]).is_none(), "non-periodic rejected");
}
/// Mine on a very easy target, then verify the found solution round-trips,
/// and a tampered nonce/jackpot is rejected.
#[test]
fn mine_then_verify_roundtrip() {
let header = IncompleteBlockHeader { version: 0, prev_block: [1; 32], merkle_root: [2; 32], timestamp: 0x66666666, nbits: 0x207fffff };
let config = easy_config(64, 32); // k=64, r=32
let bound = extract_difficulty_bound(header.nbits, &config); // easy nbits
let mut rng = rand::rng();
// Easy target => a tile opens within a few attempts.
let mut sol = None;
for _ in 0..64 {
if let Some(s) = try_mine_one(&mut rng, 2, 2, 64, &header, &config, bound) {
sol = Some(s);
break;
}
}
let sol = sol.expect("found a solution on easy difficulty");
assert!(verify(&header, &config, &sol, bound), "found solution must verify");
// Build the submission proof; its Merkle root must equal the commitment HA.
let proof = build_proof(&header, &config, &sol);
let jk = compute_job_key(&header, &config);
let pa = crate::pearl::merkle::pad_to_chunk_boundary(&flatten(&sol.a));
assert_eq!(proof.a.proof.root, blake3_digest(&pa, Some(jk)), "merkle root == commitment HA");
assert!(!encode_proof(&proof).is_empty());
// Tamper: corrupt the recorded jackpot hash -> verify fails.
let mut bad = Solution { jackpot_hash: sol.jackpot_hash, ..sol_clone(&sol) };
bad.jackpot_hash[0] ^= 1;
assert!(!verify(&header, &config, &bad, bound), "tampered solution must be rejected");
}
fn sol_clone(s: &Solution) -> Solution {
Solution {
m: s.m, n: s.n, k: s.k, rank: s.rank,
a: s.a.clone(), bt: s.bt.clone(),
a_rows: s.a_rows.clone(), b_cols: s.b_cols.clone(),
jackpot_hash: s.jackpot_hash,
}
}
}
-447
View File
@@ -1,447 +0,0 @@
//! Pearl (PRL) pool client + mining loop — wire protocol pinned from a live
//! capture of `prl.kryptex.network` (see `pearl-dump/pearl-stratum.log`).
//!
//! Handshake:
//! C> mining.configure [["pearl/v1"], {}] S> {pearl/v1:true, share_format:"base64"}
//! C> mining.subscribe ["<ua>"] S> [[["mining.set_difficulty",id],["mining.notify",id]], "", 0]
//! C> mining.authorize ["<address>", "<pw>"]
//! Server notifications:
//! pearl.set_mining_params [{m,n,k,rank,rows_pattern,cols_pattern,mma_type}]
//! mining.set_difficulty [<share_diff>]
//! mining.notify [job_id, prev_hash, header_hex(76B = IncompleteBlockHeader),
//! height, ntime, nbits, clean]
//! Submit (TODO: confirm against an accepted share):
//! mining.submit / submitPlainProof with base64 proof (share_format=base64).
//!
//! Reality from the capture: m=n=131072, k=4096 → each attempt is a ~512MB×512MB
//! int8 GEMM (GPU-scale). The CPU path here parses/validates and grinds only at
//! small sizes; real mining needs the GPU pipeline.
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Mutex};
use std::io::{BufRead, BufReader, Write};
use std::net::TcpStream;
use std::time::{Duration, Instant};
use anyhow::{anyhow, Context, Result};
use serde_json::{json, Value};
use primitive_types::U256;
use super::pearlhash::{
build_proof, encode_proof, share_bound, try_mine_one, verify, IncompleteBlockHeader, MMAType, MiningConfiguration,
PeriodicPattern, Solution,
};
/// Largest CPU-grindable problem (elements per operand). Real pool configs are
/// far bigger (131072×4096) and need the GPU; above this we parse+log only.
const CPU_GRIND_LIMIT: usize = 4096 * 256;
/// Upper bounds on what the GPU path (feature `pearl-cuda`) will attempt. The
/// whole attempt is on-GPU now (rng + commitment + noise + IMMA sweep + harvest),
/// so the only real limit is VRAM: the full-GPU path holds 4 operand buffers ≈
/// `2·(m+n)·k` bytes, so `GPU_MAX_ELEMS` ≈ half the VRAM budget. The **live
/// config (m=n=131072 ⇒ 134M tiles, ~2.15 GB) now FITS and runs** (~50 s/attempt
/// on a 16 GB 5080 via the tensor-core sweep — functional but latency-bound).
/// `GPU_MAX_TILES` is a backstop against absurd grids.
#[cfg(feature = "pearl-cuda")]
const GPU_MAX_TILES: u128 = 256 << 20; // up to ~268M tiles per attempt (live = 134M)
#[cfg(feature = "pearl-cuda")]
const GPU_MAX_ELEMS: usize = 1280 << 20; // (m+n)·k ≤ 1.34e9 ⇒ ≲2.7 GB resident
/// Tiles per GPU sweep batch — bounds the per-batch index upload + jackpot
/// readback (~64 B/tile); the resident matrices are untouched between batches.
#[cfg(feature = "pearl-cuda")]
const GPU_BATCH_TILES: usize = 1 << 16;
#[derive(Clone)]
pub struct Job {
pub id: String,
pub header: IncompleteBlockHeader,
pub config: MiningConfiguration,
pub m: usize,
pub n: usize,
}
impl Job {
fn k(&self) -> usize {
self.config.common_dim as usize
}
}
pub struct PearlStratum {
stream: TcpStream,
rx: std::sync::mpsc::Receiver<Value>,
pending: std::collections::VecDeque<Value>,
next_id: u64,
closed: bool,
}
impl PearlStratum {
pub fn connect(host: &str, port: u16, user: &str, pass: &str) -> Result<Self> {
let stream = TcpStream::connect((host, port)).with_context(|| format!("connect {host}:{port}"))?;
// A dedicated reader thread does blocking line reads (no partial-line /
// non-blocking hazards) and forwards parsed messages over a channel, so
// the mine loop can poll for newer jobs without ever blocking on I/O.
let read_stream = stream.try_clone()?;
let (tx, rx) = std::sync::mpsc::channel::<Value>();
std::thread::spawn(move || {
let mut reader = BufReader::new(read_stream);
let mut line = String::new();
loop {
line.clear();
match reader.read_line(&mut line) {
Ok(0) | Err(_) => break, // closed / fatal
Ok(_) => {
let t = line.trim();
if t.is_empty() {
continue;
}
match serde_json::from_str::<Value>(t) {
Ok(v) => {
if tx.send(v).is_err() {
break; // receiver gone
}
}
Err(_) => {} // ignore malformed lines
}
}
}
}
});
let mut s = Self { stream, rx, pending: std::collections::VecDeque::new(), next_id: 1, closed: false };
s.call("mining.configure", json!([["pearl/v1"], {}]))?;
s.call("mining.subscribe", json!(["jackpotminer/0.1"]))?;
s.call("mining.authorize", json!([user, pass]))?;
Ok(s)
}
fn call(&mut self, method: &str, params: Value) -> Result<u64> {
let id = self.next_id;
self.next_id += 1;
let mut line = serde_json::to_string(&json!({ "id": id, "method": method, "params": params }))?;
line.push('\n');
self.stream.write_all(line.as_bytes())?;
Ok(id)
}
/// Drain the reader channel into the pending buffer (non-blocking).
fn pump(&mut self) {
loop {
match self.rx.try_recv() {
Ok(v) => self.pending.push_back(v),
Err(std::sync::mpsc::TryRecvError::Empty) => break,
Err(std::sync::mpsc::TryRecvError::Disconnected) => {
self.closed = true;
break;
}
}
}
}
fn try_recv(&mut self) -> Result<Option<Value>> {
self.pump();
if let Some(v) = self.pending.pop_front() {
return Ok(Some(v));
}
if self.closed {
return Err(anyhow!("pool closed the connection"));
}
Ok(None)
}
/// Whether a `mining.notify` for a job other than `current_id` is buffered —
/// i.e. newer work has arrived and the current attempt should be abandoned.
/// Non-consuming: the message stays queued for the main loop to apply.
pub fn has_newer_job(&mut self, current_id: &str) -> bool {
self.pump();
self.pending.iter().any(|m| is_newer_notify(m, current_id))
}
/// Submit a base64 proof for `job_id`. TODO(confirm): exact method/params +
/// any nonce/ntime fields, from an accepted-share capture.
pub fn submit(&mut self, user: &str, job_id: &str, proof: &[u8]) -> Result<()> {
use base64::Engine;
let b64 = base64::engine::general_purpose::STANDARD.encode(proof);
self.call("mining.submit", json!([user, job_id, b64]))?;
Ok(())
}
}
/// A buffered message is "newer work" iff it's a `mining.notify` whose job id
/// (params[0]) differs from the one currently being mined.
fn is_newer_notify(m: &Value, current_id: &str) -> bool {
m.get("method").and_then(Value::as_str) == Some("mining.notify")
&& m["params"].get(0).and_then(Value::as_str).is_some_and(|id| id != current_id)
}
fn unhex(s: &str) -> Vec<u8> {
let s = s.trim_start_matches("0x");
(0..s.len() / 2).filter_map(|i| u8::from_str_radix(&s[2 * i..2 * i + 2], 16).ok()).collect()
}
/// Parse `pearl.set_mining_params` → (config, m, n).
fn parse_mining_params(p: &Value) -> Option<(MiningConfiguration, usize, usize)> {
let o = p.get(0)?;
let m = o.get("m")?.as_u64()? as usize;
let n = o.get("n")?.as_u64()? as usize;
let k = o.get("k")?.as_u64()? as u32;
let rank = o.get("rank")?.as_u64()? as u16;
let to_list = |key: &str| -> Option<Vec<u32>> {
Some(o.get(key)?.as_array()?.iter().filter_map(|v| v.as_u64().map(|x| x as u32)).collect())
};
let rows = PeriodicPattern::from_list(&to_list("rows_pattern")?)?;
let cols = PeriodicPattern::from_list(&to_list("cols_pattern")?)?;
let config = MiningConfiguration {
common_dim: k,
rank,
mma_type: MMAType::Int7xInt7ToInt32,
rows_pattern: rows,
cols_pattern: cols,
reserved: [0u8; 32],
};
Some((config, m, n))
}
/// Parse a `mining.notify` array using the current matmul config.
fn parse_notify(p: &Value, config: &MiningConfiguration, m: usize, n: usize) -> Option<Job> {
let arr = p.as_array()?;
let id = arr.first()?.as_str()?.to_string();
let header_hex = arr.get(2)?.as_str()?;
let header = IncompleteBlockHeader::from_bytes(&unhex(header_hex))?;
Some(Job { id, header, config: *config, m, n })
}
/// The Pearl mining loop. Connects, tracks config/difficulty, parses jobs.
/// Grinds on CPU only for small problems; real (131072×4096) configs are logged
/// for the GPU pipeline.
pub fn run(host: &str, port: u16, user: &str, pass: &str, running: Arc<AtomicBool>) -> Result<()> {
let mut pool = PearlStratum::connect(host, port, user, pass)?;
let threads = num_cpus::get().max(1);
log::info!("pearl: connected to {host}:{port} ({threads} CPU threads)");
#[cfg(feature = "pearl-cuda")]
let mut gpu_nonce: u64 = 0;
#[cfg(feature = "pearl-cuda")]
let gpu = match super::gpu::PearlGpu::new(0) {
Ok(g) => {
log::info!("pearl: GPU 0 ready (int8 dp4a tile kernel)");
Some(g)
}
Err(e) => {
log::warn!("pearl: GPU init failed ({e}); CPU grind only");
None
}
};
let mut config: Option<MiningConfiguration> = None;
let (mut m, mut n) = (0usize, 0usize);
let mut difficulty = 1u64;
let mut job: Option<Job> = None;
while running.load(Ordering::Relaxed) {
while let Some(msg) = pool.try_recv()? {
log::debug!("pearl: recv {}", serde_json::to_string(&msg).unwrap_or_default());
match msg.get("method").and_then(Value::as_str).unwrap_or("") {
"pearl.set_mining_params" => {
if let Some((c, mm, nn)) = parse_mining_params(&msg["params"]) {
log::info!(
"pearl: params m={mm} n={nn} k={} rank={} h={} w={}",
c.common_dim, c.rank, c.rows_pattern.size(), c.cols_pattern.size()
);
config = Some(c);
m = mm;
n = nn;
}
}
"mining.set_difficulty" => {
if let Some(d) = msg["params"].get(0).and_then(Value::as_f64) {
difficulty = d.max(1.0) as u64;
log::info!("pearl: share difficulty {difficulty}");
}
}
"mining.notify" => {
if let Some(c) = &config {
if let Some(j) = parse_notify(&msg["params"], c, m, n) {
log::info!("pearl: job {} (nbits {:#010x})", j.id, j.header.nbits);
job = Some(j);
}
}
}
_ => {}
}
}
let Some(j) = job.clone() else {
std::thread::sleep(Duration::from_millis(200));
continue;
};
let bound = share_bound(difficulty, j.config.rows_pattern.size() as usize, j.config.cols_pattern.size() as usize, j.k());
let deadline = Instant::now() + Duration::from_millis(500);
let cpu_ok = j.m.saturating_mul(j.k()) <= CPU_GRIND_LIMIT;
// Pick a miner: GPU for tractable configs (pearl-cuda), else CPU for
// small problems, else skip. A GPU attempt can open several tiles — each
// is a separate share — so the miner returns ALL winners for the job.
let sols: Vec<Solution> = {
#[cfg(feature = "pearl-cuda")]
{
if let (Some(g), true) = (gpu.as_ref(), gpu_suitable(&j)) {
gpu_mine(g, &j, bound, &mut pool, &running, &mut gpu_nonce)
} else if cpu_ok {
mine_batch(&j, bound, deadline, &running, threads).into_iter().collect()
} else {
log::warn!(
"pearl: job {} too large for the GPU VRAM budget (m={} n={} k={}, {} tiles)",
j.id, j.m, j.n, j.k(), tile_count(&j)
);
std::thread::sleep(Duration::from_millis(500));
Vec::new()
}
}
#[cfg(not(feature = "pearl-cuda"))]
{
if cpu_ok {
mine_batch(&j, bound, deadline, &running, threads).into_iter().collect()
} else {
log::warn!(
"pearl: job {} is GPU-scale (m={} k={}); CPU grind skipped — build with --features pearl-cuda",
j.id, j.m, j.k()
);
std::thread::sleep(Duration::from_millis(500));
Vec::new()
}
}
};
for sol in &sols {
let proof = build_proof(&j.header, &j.config, sol);
pool.submit(user, &j.id, &encode_proof(&proof))?;
}
if !sols.is_empty() {
log::info!("pearl: submitted {} share(s) for job {}", sols.len(), j.id);
}
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
/// Validate parsing against the real prl.kryptex.network capture
/// (pearl-dump/pearl-stratum.log).
#[test]
fn parses_live_capture() {
let cols: Vec<u32> = (0..64).collect();
let params = json!([{
"m": 131072, "n": 131072, "k": 4096, "rank": 128,
"rows_pattern": [0, 32], "cols_pattern": cols, "mma_type": "Int7xInt7ToInt32"
}]);
let (c, m, n) = parse_mining_params(&params).expect("params");
assert_eq!((m, n, c.common_dim, c.rank), (131072, 131072, 4096, 128));
assert_eq!(c.rows_pattern.size(), 2);
assert_eq!(c.cols_pattern.size(), 64);
let header_hex = "0000402089571bf45a9e6d9f88d4e48aa1d44fe0060dbb1b871002d21a58b56a36e0793958eec088936f1453e3f3903402e691f23ab996f73ca0fa38146d70cb1656b2ee2a4e226a86350118";
let prev = "3979e0366ab5581ad20210871bbb0d06e04fd4a18ae4d4889f6d9e5af41b5789";
let notify = json!(["0001099c-fad2b0b3-1978c7701d91dda9", prev, header_hex, 67996, "6a224e2a", "18013586", true]);
let j = parse_notify(&notify, &c, m, n).expect("notify");
assert_eq!(j.id, "0001099c-fad2b0b3-1978c7701d91dda9");
assert_eq!(j.header.nbits, 0x1801_3586);
assert_eq!(j.header.timestamp, 0x6a22_4e2a);
// prev_block recovered (header stores it reversed); job_key uses to_bytes.
assert_eq!(j.header.prev_block.to_vec(), unhex(prev));
// header round-trips: to_bytes == the notify header hex (so commitment matches).
assert_eq!(j.header.to_bytes().to_vec(), unhex(header_hex));
}
/// `is_newer_notify` drives the abandon-stale-work check: it fires only for a
/// `mining.notify` carrying a job id different from the one being mined.
#[test]
fn detects_newer_job() {
let cur = "0001099c-fad2b0b3-1978c7701d91dda9";
let same = json!({"method": "mining.notify", "params": [cur, "prev", "00", 1, "t", "n", true]});
let newer = json!({"method": "mining.notify", "params": ["0001099d-aaaa-bbbb", "prev", "00", 1, "t", "n", true]});
let other = json!({"method": "mining.set_difficulty", "params": [30]});
assert!(!is_newer_notify(&same, cur), "same job id is not newer");
assert!(is_newer_notify(&newer, cur), "different job id is newer work");
assert!(!is_newer_notify(&other, cur), "non-notify is not newer work");
}
}
/// Grind `try_mine_one` across `threads` cores until a tile opens or the deadline
/// passes. First verified solution wins.
fn mine_batch(j: &Job, bound: U256, deadline: Instant, running: &AtomicBool, threads: usize) -> Option<Solution> {
let found: Mutex<Option<Solution>> = Mutex::new(None);
let stop = AtomicBool::new(false);
std::thread::scope(|s| {
for _ in 0..threads {
s.spawn(|| {
let mut rng = rand::rng();
while !stop.load(Ordering::Relaxed) && running.load(Ordering::Relaxed) && Instant::now() < deadline {
if let Some(sol) = try_mine_one(&mut rng, j.m, j.n, j.k(), &j.header, &j.config, bound) {
if verify(&j.header, &j.config, &sol, bound) {
*found.lock().unwrap() = Some(sol);
stop.store(true, Ordering::Relaxed);
return;
}
}
}
});
}
});
found.into_inner().unwrap()
}
/// Tiles swept per attempt for the periodic patterns: `(m/h)·(n/w)`.
#[cfg(feature = "pearl-cuda")]
fn tile_count(j: &Job) -> u128 {
let h = j.config.rows_pattern.size() as usize;
let w = j.config.cols_pattern.size() as usize;
(j.m / h.max(1)) as u128 * (j.n / w.max(1)) as u128
}
/// Whether the GPU host-gather path can attempt this job (operands + tile count
/// within [`GPU_MAX_ELEMS`]/[`GPU_MAX_TILES`]). The live config exceeds both.
#[cfg(feature = "pearl-cuda")]
fn gpu_suitable(j: &Job) -> bool {
let elems = j.m.saturating_add(j.n).saturating_mul(j.k());
elems <= GPU_MAX_ELEMS && tile_count(j) <= GPU_MAX_TILES
}
/// GPU mining: runs ONE **fully-on-GPU** attempt (A,Bᵀ generated, committed,
/// noised, and swept on the GPU; see [`super::gpu::PearlGpu::mine_full_gpu_all`])
/// over every tile with the next nonce, returning ALL winning tiles (each a
/// separate share). The sweep checks `running` between row-tile chunks, so a long
/// live-scale attempt stays interruptible. The chunk-aligned fast path needs
/// `(m·k)%1024==0`; otherwise it falls back to CPU-generated operands (first win).
/// The caller loops (refreshing the job between attempts).
#[cfg(feature = "pearl-cuda")]
fn gpu_mine(gpu: &super::gpu::PearlGpu, j: &Job, bound: U256, pool: &mut PearlStratum, running: &AtomicBool, nonce: &mut u64) -> Vec<Solution> {
let (m, n, k) = (j.m, j.n, j.k());
let batch = GPU_BATCH_TILES;
let aligned = (m * k) % 1024 == 0 && (n * k) % 1024 == 0;
*nonce = nonce.wrapping_add(1);
let attempt = if aligned {
// Abandon the attempt on shutdown or when the pool pushes a newer job.
let jid = j.id.clone();
gpu.mine_full_gpu_all(&j.header, &j.config, m, n, bound, *nonce, batch, || {
running.load(Ordering::Relaxed) && !pool.has_newer_job(&jid)
})
} else {
use rand::Rng;
let mut rng = rand::rng();
let a: Vec<Vec<i8>> = (0..m).map(|_| (0..k).map(|_| rng.random_range(-64..=64i8)).collect()).collect();
let b: Vec<Vec<i8>> = (0..k).map(|_| (0..n).map(|_| rng.random_range(-64..=64i8)).collect()).collect();
let bt: Vec<Vec<i8>> = (0..n).map(|i| (0..k).map(|jj| b[jj][i]).collect()).collect();
gpu.try_mine_one_gpu(&j.header, &j.config, a, bt, m, n, bound, batch).map(|o| o.into_iter().collect())
};
match attempt {
Ok(v) => v,
Err(e) => {
log::error!("pearl: GPU mine error: {e}");
Vec::new()
}
}
}