diff --git a/proving/prover-floor/sp1-gpu-6.8.1-floor.patch b/proving/prover-floor/sp1-gpu-6.8.1-floor.patch index 9d257aaa3..71a8d88e4 100644 --- a/proving/prover-floor/sp1-gpu-6.8.1-floor.patch +++ b/proving/prover-floor/sp1-gpu-6.8.1-floor.patch @@ -1,3 +1,24 @@ +diff --git a/sp1-gpu/crates/cuda/src/task.rs b/sp1-gpu/crates/cuda/src/task.rs +index a503a86..813016b 100644 +--- a/sp1-gpu/crates/cuda/src/task.rs ++++ b/sp1-gpu/crates/cuda/src/task.rs +@@ -149,7 +149,15 @@ pub enum GlobalTaskPoolBuildError { + + impl TaskPoolBuilder { + pub fn new() -> Self { +- Self { capacity: None, device: CudaDevice(0), mem_release_threshold: u64::MAX } ++ // Igneum prover-floor patch: upstream keeps every freed device allocation in the pool for the process's ++ // life (threshold u64::MAX), so the prover holds its high-water mark between shards on a card it shares ++ // with a miner. `SP1_GPU_MEM_RELEASE_THRESHOLD=` sets the pool's release threshold (0 returns ++ // freed memory to the driver at once); unset, upstream's behaviour. ++ let mem_release_threshold = std::env::var("SP1_GPU_MEM_RELEASE_THRESHOLD") ++ .ok() ++ .and_then(|s| s.parse::().ok()) ++ .unwrap_or(u64::MAX); ++ Self { capacity: None, device: CudaDevice(0), mem_release_threshold } + } + + pub fn num_tasks(mut self, num_tasks: usize) -> Self { diff --git a/sp1-gpu/crates/jagged_tracegen/src/lib.rs b/sp1-gpu/crates/jagged_tracegen/src/lib.rs index 579f70a..2264044 100644 --- a/sp1-gpu/crates/jagged_tracegen/src/lib.rs diff --git a/tools/prover-floor/pc2-build-server.ps1 b/tools/prover-floor/pc2-build-server.ps1 index d4ca0dfb1..dccc15d67 100644 --- a/tools/prover-floor/pc2-build-server.ps1 +++ b/tools/prover-floor/pc2-build-server.ps1 @@ -1,13 +1,13 @@ # Prover floor (5 October 2026): builds sp1-gpu-server 6.8.1 from source with the Igneum floor patch on PC 2 inside # WSL2 Ubuntu-24.04 as root, into /opt/igneum-floor (the live /root/.sp1/bin/sp1-gpu-server and /opt/igneum are # never touched). CPU only: the miners keep mining, the card is not used. Generated by make-build-playbook.sh; -# patch sha256 3f9d3ab0845b08c01683038765db07a9293aeb03360c45dc5cba5a8c607bed8a. CUDA_ARCHS=86,89,120 (the 12 GB tier is sm_86 (3060) and sm_89 (4070), the 16 GB tier sm_89 and sm_120; PC 2 runs sm_120; a shipped build lists every target the stock server does: 80, 86, 89, 90, 100, 120). +# patch sha256 e81cb0d03b291f9fd4bf0a109d6da2d7c897795c9ffd7f797c0ddce723eee2b1. CUDA_ARCHS=86,89,120 (the 12 GB tier is sm_86 (3060) and sm_89 (4070), the 16 GB tier sm_89 and sm_120; PC 2 runs sm_120; a shipped build lists every target the stock server does: 80, 86, 89, 90, 100, 120). $ErrorActionPreference = 'Continue' function Stamp { (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ') } "RESULT start $(Stamp)" $job = $env:IGNEUM_JOB_DIR; if (-not $job) { $job = Join-Path $env:TEMP 'igneum-floor' }; New-Item -ItemType Directory -Force -Path $job | Out-Null function WslPath($p) { $w = (& wsl.exe -d Ubuntu-24.04 -u root -- wslpath -a ($p -replace '\\', '/') 2>$null); if ($w) { ($w -replace "`0", '').Trim() } else { '/mnt/c' + ($p.Substring(2) -replace '\\', '/') } } -$patchB64 = 'ZGlmZiAtLWdpdCBhL3NwMS1ncHUvY3JhdGVzL2phZ2dlZF90cmFjZWdlbi9zcmMvbGliLnJzIGIvc3AxLWdwdS9jcmF0ZXMvamFnZ2VkX3RyYWNlZ2VuL3NyYy9saWIucnMKaW5kZXggNTc5ZjcwYS4uMjI2NDA0NCAxMDA2NDQKLS0tIGEvc3AxLWdwdS9jcmF0ZXMvamFnZ2VkX3RyYWNlZ2VuL3NyYy9saWIucnMKKysrIGIvc3AxLWdwdS9jcmF0ZXMvamFnZ2VkX3RyYWNlZ2VuL3NyYy9saWIucnMKQEAgLTQ4MSw2ICs0ODEsMzMgQEAgYXN5bmMgZm4gZGV2aWNlX3ByZXByb2Nlc3NlZF90cmFjZWdlbjxBOiBDdWRhVHJhY2VnZW5BaXI8RmVsdD4+KAogICAgIG5hbWVkX3RyYWNlcwogfQogCisvLy8gSWduZXVtIHByb3Zlci1mbG9vciBwYXRjaDogdGhlIGRlbnNlIGVsZW1lbnRzIGEgc2V0IG9mIHRyYWNlcyB3aWxsIG9jY3VweSBvbmNlIGBnZW5lcmF0ZV9qYWdnZWRfdHJhY2VzYAorLy8vIGhhcyBsYWlkIHRoZW0gb3V0LCB0aGF0IGlzIHRoZSBzdW0gb2YgdGhlaXIgYnVmZmVycyBwYWRkZWQgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgMl5sb2dfc3RhY2tpbmdfaGVpZ2h0CisvLy8gKHRoZSAiZmluYWwgcGFkZGluZyIgc3RlcCBiZWxvdykuIEVhY2ggcGhhc2UgKHByZXByb2Nlc3NlZCwgdGhlbiBtYWluKSBpcyBwYWRkZWQgb24gaXRzIG93bi4KK3B1YiBmbiBwYWRkZWRfdHJhY2VfZWxlbWVudHMoCisgICAgdHJhY2VzOiAmQlRyZWVNYXA8U3RyaW5nLCBUcmFjZTxUYXNrU2NvcGU+PiwKKyAgICBsb2dfc3RhY2tpbmdfaGVpZ2h0OiB1MzIsCispIC0+IHVzaXplIHsKKyAgICBsZXQgdG90YWw6IHVzaXplID0gdHJhY2VzCisgICAgICAgIC52YWx1ZXMoKQorICAgICAgICAubWFwKHx0fCBtYXRjaCB0IHsKKyAgICAgICAgICAgIFRyYWNlOjpSZWFsKHRyYWNlKSA9PiB0cmFjZS5ndXRzKCkuYXNfYnVmZmVyKCkubGVuKCksCisgICAgICAgICAgICBUcmFjZTo6UGFkZGluZyhfKSA9PiAwLAorICAgICAgICB9KQorICAgICAgICAuc3VtKCk7CisgICAgdG90YWwubmV4dF9tdWx0aXBsZV9vZigxIDw8IGxvZ19zdGFja2luZ19oZWlnaHQpCit9CisKKy8vLyBJZ25ldW0gcHJvdmVyLWZsb29yIHBhdGNoOiB0aGUgY2FwYWNpdHkgdG8gYWxsb2NhdGUgZm9yIGEgdHJhY2Ugc2V0OiB0aGUgZXhhY3QgcGFkZGVkIHNpemUgcGx1cyBvbmUKKy8vLyBzdGFja2luZyBoZWlnaHQgb2Ygc2xhY2ssIG5ldmVyIG1vcmUgdGhhbiB0aGUgcHJvdmVyJ3MgYG1heF90cmFjZV9zaXplYC4gYFNQMV9HUFVfRkxPT1JfRVhBQ1Q9MGAgcmVzdG9yZXMKKy8vLyB1cHN0cmVhbSdzIGZ1bGwtY2FwYWNpdHkgYWxsb2NhdGlvbi4KK2ZuIGZsb29yX2NhcGFjaXR5KG1heF90cmFjZV9zaXplOiB1c2l6ZSwgbmVlZGVkOiB1c2l6ZSwgbG9nX3N0YWNraW5nX2hlaWdodDogdTMyKSAtPiB1c2l6ZSB7CisgICAgaWYgc3RkOjplbnY6OnZhcigiU1AxX0dQVV9GTE9PUl9FWEFDVCIpLm1hcCh8dnwgdiA9PSAiMCIpLnVud3JhcF9vcihmYWxzZSkgeworICAgICAgICByZXR1cm4gbWF4X3RyYWNlX3NpemU7CisgICAgfQorICAgIG1heF90cmFjZV9zaXplLm1pbihuZWVkZWQgKyAoMSA8PCBsb2dfc3RhY2tpbmdfaGVpZ2h0KSkKK30KKwogYXN5bmMgZm4gYWxsb2NhdGVfYW5kX2luaXRpYWxpemVfdHJhY2VzKAogICAgIHByZXByb2Nlc3NlZF90cmFjZXM6IEJUcmVlTWFwPFN0cmluZywgVHJhY2U8VGFza1Njb3BlPj4sCiAgICAgbWF4X3RyYWNlX3NpemU6IHVzaXplLApAQCAtNDk0LDYgKzUyMSwxMSBAQCBhc3luYyBmbiBhbGxvY2F0ZV9hbmRfaW5pdGlhbGl6ZV90cmFjZXMoCiAKICAgICBsZXQgdG90YWxfZ2IgPSB0b3RhbF9ieXRlcyBhcyBmNjQgLyAoMSA8PCAzMCkgYXMgZjY0OwogICAgIHRyYWNpbmc6OmRlYnVnISgiQWxsb2NhdGluZyB7Oj99IEdCIG9mIHRyYWNlcyIsIHRvdGFsX2diKTsKKyAgICBpZiBzdGQ6OmVudjo6dmFyKCJTUDFfR1BVX0ZMT09SX0xPRyIpLmlzX29rKCkgeworICAgICAgICBlcHJpbnRsbiEoCisgICAgICAgICAgICAiRkxPT1IgdHJhY2VnZW4gYWxsb2MgY2FwYWNpdHlfZWxlbWVudHM9e21heF90cmFjZV9zaXplfSBieXRlcz17dG90YWxfYnl0ZXN9ICh7dG90YWxfZ2I6LjN9IEdCKSIKKyAgICAgICAgKTsKKyAgICB9CiAgICAgbGV0IG11dCBkZW5zZV9kYXRhOiBCdWZmZXI8RmVsdCwgVGFza1Njb3BlPiA9CiAgICAgICAgIEJ1ZmZlcjo6d2l0aF9jYXBhY2l0eV9pbihtYXhfdHJhY2Vfc2l6ZSwgYmFja2VuZC5jbG9uZSgpKTsKICAgICBsZXQgbXV0IGNvbF9pbmRleDogQnVmZmVyPHUzMiwgVGFza1Njb3BlPiA9CkBAIC02NzcsOSArNzA5LDE0IEBAIHB1YiBhc3luYyBmbiBzZXR1cF90cmFjZWdlbjxBOiBDdWRhVHJhY2VnZW5BaXI8RmVsdD4+KAogICAgIGxldCBwcmVwcm9jZXNzZWRfdHJhY2VzID0KICAgICAgICAgZGV2aWNlX3ByZXByb2Nlc3NlZF90cmFjZWdlbihwcm9ncmFtLCBob3N0X3BoYXNlX3RyYWNlZ2VuLCBiYWNrZW5kKS5hd2FpdDsKIAorICAgIGxldCBjYXBhY2l0eSA9IGZsb29yX2NhcGFjaXR5KAorICAgICAgICBtYXhfdHJhY2Vfc2l6ZSwKKyAgICAgICAgcGFkZGVkX3RyYWNlX2VsZW1lbnRzKCZwcmVwcm9jZXNzZWRfdHJhY2VzLCBsb2dfc3RhY2tpbmdfaGVpZ2h0KSwKKyAgICAgICAgbG9nX3N0YWNraW5nX2hlaWdodCwKKyAgICApOwogICAgIGxldCBqYWdnZWRfdHJhY2VzID0gYWxsb2NhdGVfYW5kX2luaXRpYWxpemVfdHJhY2VzKAogICAgICAgICBwcmVwcm9jZXNzZWRfdHJhY2VzLAotICAgICAgICBtYXhfdHJhY2Vfc2l6ZSwKKyAgICAgICAgY2FwYWNpdHksCiAgICAgICAgIGxvZ19zdGFja2luZ19oZWlnaHQsCiAgICAgICAgIG1heF9sb2dfcm93X2NvdW50LAogICAgICAgICBiYWNrZW5kLApAQCAtOTA2LDYgKzk0MywxMSBAQCBwdWIgYXN5bmMgZm4gbWFpbl90cmFjZWdlbjxHQzogSW9wQ3R4PEYgPSBGZWx0PiwgQTogQ3VkYVRyYWNlZ2VuQWlyPEZlbHQ+PigKIAogICAgIGxvZ19jaGlwX3N0YXRzKG1hY2hpbmUsICZjaGlwX3NldCwgJnRyYWNlcyk7CiAKKyAgICAvLyBJZ25ldW0gcHJvdmVyLWZsb29yIHBhdGNoOiB0aGUga2V5J3MgYnVmZmVyIGlzIHNpemVkIHRvIGl0cyBwcmVwcm9jZXNzZWQgdHJhY2VzIGF0IHNldHVwICh1cHN0cmVhbSBzaXplZCBpdAorICAgIC8vIGZvciBhIHdob2xlIHNoYXJkKSwgc28gZ3JvdyBpdCBoZXJlIHRvIHdoYXQgdGhpcyBzaGFyZCBuZWVkcyBiZWZvcmUgdGhlIG1haW4gdHJhY2VzIGFyZSBhcHBlbmRlZDogYSBiaWdnZXIKKyAgICAvLyBkZW5zZSBidWZmZXIgYW5kIGNvbHVtbiBpbmRleCwgdGhlIHByZXByb2Nlc3NlZCByZWdpb24gY29waWVkIGRldmljZSB0byBkZXZpY2UsIHN3YXBwZWQgaW50byB0aGUga2V5LgorICAgIGdyb3dfZm9yX21haW4oJm11dCBqYWdnZWRfdHJhY2VzLnByZXByb2Nlc3NlZF90cmFjZXMsICZ0cmFjZXMsIGxvZ19zdGFja2luZ19oZWlnaHQsIGJhY2tlbmQpOworCiAgICAgY29weV9tYWluX2phZ2dlZF90cmFjZXMoCiAgICAgICAgIHRyYWNlcywKICAgICAgICAgJm11dCBqYWdnZWRfdHJhY2VzLnByZXByb2Nlc3NlZF90cmFjZXMsCkBAIC05MTgsNiArOTYwLDYxIEBAIHB1YiBhc3luYyBmbiBtYWluX3RyYWNlZ2VuPEdDOiBJb3BDdHg8RiA9IEZlbHQ+LCBBOiBDdWRhVHJhY2VnZW5BaXI8RmVsdD4+KAogICAgIChwdWJsaWNfdmFsdWVzLCBjaGlwX3NldCwgcGVybWl0KQogfQogCisvLy8gSWduZXVtIHByb3Zlci1mbG9vciBwYXRjaDogc2VlIGBtYWluX3RyYWNlZ2VuYC4gVGhlIG5lZWQgaXMgdGhlIHByZXByb2Nlc3NlZCBwaGFzZSBhcyBsYWlkIG91dCAoaXRzIHBhZGRlZAorLy8vIGVuZCwgYHByZXByb2Nlc3NlZF9vZmZzZXRgKSBwbHVzIHRoZSBtYWluIHRyYWNlcyBwYWRkZWQgdG8gdGhlIHN0YWNraW5nIGhlaWdodCBwbHVzIG9uZSBzdGFja2luZyBoZWlnaHQgb2YKKy8vLyBzbGFjazsgYSBidWZmZXIgYXQgbGVhc3QgdGhhdCBiaWcgaXMgbGVmdCBhbG9uZS4gVGhlIHByb2Nlc3MgYWJvcnRzLCBsb3VkbHksIGlmIHRoZSBjb3B5IGNhbm5vdCBiZSBtYWRlLAorLy8vIGJlY2F1c2UgYSBwYW5pYyBpbnNpZGUgYSBwcm92ZXIgdGFzayBpcyB3aGF0IGxlZnQgc3dlZXAgMiBoYW5naW5nIG9uIHRoZSBjbGllbnQncyBzb2NrZXQuCitmbiBncm93X2Zvcl9tYWluKAorICAgIGphZ2dlZDogJm11dCBKYWdnZWRUcmFjZU1sZTxGZWx0LCBUYXNrU2NvcGU+LAorICAgIG1haW5fdHJhY2VzOiAmQlRyZWVNYXA8U3RyaW5nLCBUcmFjZTxUYXNrU2NvcGU+PiwKKyAgICBsb2dfc3RhY2tpbmdfaGVpZ2h0OiB1MzIsCisgICAgYmFja2VuZDogJlRhc2tTY29wZSwKKykgeworICAgIGxldCBwcmVfZW5kID0gamFnZ2VkLmRlbnNlKCkucHJlcHJvY2Vzc2VkX29mZnNldDsKKyAgICBsZXQgbmVlZGVkID0gcHJlX2VuZAorICAgICAgICArIHBhZGRlZF90cmFjZV9lbGVtZW50cyhtYWluX3RyYWNlcywgbG9nX3N0YWNraW5nX2hlaWdodCkKKyAgICAgICAgKyAoMSA8PCBsb2dfc3RhY2tpbmdfaGVpZ2h0KTsKKyAgICBsZXQgaGF2ZSA9IGphZ2dlZC5kZW5zZSgpLmRlbnNlLmNhcGFjaXR5KCk7CisgICAgaWYgaGF2ZSA+PSBuZWVkZWQgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxldCBtdXQgbmV3X2RlbnNlOiBCdWZmZXI8RmVsdCwgVGFza1Njb3BlPiA9IEJ1ZmZlcjo6d2l0aF9jYXBhY2l0eV9pbihuZWVkZWQsIGJhY2tlbmQuY2xvbmUoKSk7CisgICAgbGV0IG11dCBuZXdfY29sX2luZGV4OiBCdWZmZXI8dTMyLCBUYXNrU2NvcGU+ID0KKyAgICAgICAgQnVmZmVyOjp3aXRoX2NhcGFjaXR5X2luKG5lZWRlZCA+PiAxLCBiYWNrZW5kLmNsb25lKCkpOworICAgIHVuc2FmZSB7CisgICAgICAgIG5ld19kZW5zZS5hc3N1bWVfaW5pdCgpOworICAgICAgICBuZXdfY29sX2luZGV4LmFzc3VtZV9pbml0KCk7CisgICAgfQorICAgIHsKKyAgICAgICAgbGV0IEphZ2dlZE1sZSB7IGRlbnNlX2RhdGEsIGNvbF9pbmRleCwgLi4gfSA9ICZtdXQgKipqYWdnZWQ7CisgICAgICAgIGxldCBzcmNfZGVuc2U6ICZTbGljZTxfLCBfPiA9ICZkZW5zZV9kYXRhLmRlbnNlWy4ucHJlX2VuZF07CisgICAgICAgIGxldCBkc3RfZGVuc2U6ICZtdXQgU2xpY2U8XywgXz4gPSAmbXV0IG5ld19kZW5zZVsuLnByZV9lbmRdOworICAgICAgICBsZXQgc3JjX2NvbDogJlNsaWNlPF8sIF8+ID0gJmNvbF9pbmRleFsuLnByZV9lbmQgPj4gMV07CisgICAgICAgIGxldCBkc3RfY29sOiAmbXV0IFNsaWNlPF8sIF8+ID0gJm11dCBuZXdfY29sX2luZGV4Wy4ucHJlX2VuZCA+PiAxXTsKKyAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgIGlmIGRzdF9kZW5zZS5jb3B5X2Zyb21fc2xpY2Uoc3JjX2RlbnNlLCBiYWNrZW5kKS5pc19lcnIoKQorICAgICAgICAgICAgICAgIHx8IGRzdF9jb2wuY29weV9mcm9tX3NsaWNlKHNyY19jb2wsIGJhY2tlbmQpLmlzX2VycigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXByaW50bG4hKCJGTE9PUiBncm93IEZBSUxFRDogY291bGQgbm90IGNvcHkgdGhlIHByZXByb2Nlc3NlZCByZWdpb24gKHtwcmVfZW5kfSBlbGVtZW50cykgaW50byB0aGUgZ3Jvd24gYnVmZmVyICh7bmVlZGVkfSBlbGVtZW50cyk7IGFib3J0aW5nIGluc3RlYWQgb2YgaGFuZ2luZyIpOworICAgICAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6YWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiBzdGQ6OmVudjo6dmFyKCJTUDFfR1BVX0ZMT09SX0xPRyIpLmlzX29rKCkgeworICAgICAgICBlcHJpbnRsbiEoCisgICAgICAgICAgICAiRkxPT1IgZ3JvdyBrZXkgYnVmZmVyIHtoYXZlfSAtPiB7bmVlZGVkfSBlbGVtZW50cyAocHJlcHJvY2Vzc2VkIHtwcmVfZW5kfSwge30gYnl0ZXMpIiwKKyAgICAgICAgICAgIG5lZWRlZCAqIDYKKyAgICAgICAgKTsKKyAgICB9CisgICAgbGV0IEphZ2dlZE1sZSB7IGRlbnNlX2RhdGEsIGNvbF9pbmRleCwgLi4gfSA9ICZtdXQgKipqYWdnZWQ7CisgICAgZGVuc2VfZGF0YS5kZW5zZSA9IG5ld19kZW5zZTsKKyAgICAqY29sX2luZGV4ID0gbmV3X2NvbF9pbmRleDsKKyAgICB1bnNhZmUgeworICAgICAgICBkZW5zZV9kYXRhLmRlbnNlLnNldF9sZW4ocHJlX2VuZCk7CisgICAgICAgIGNvbF9pbmRleC5zZXRfbGVuKHByZV9lbmQgPj4gMSk7CisgICAgfQorfQorCiAjW2FsbG93KGNsaXBweTo6dG9vX21hbnlfYXJndW1lbnRzKV0KIHB1YiBhc3luYyBmbiBtYWluX3RyYWNlZ2VuX3Blcm1pdDxHQzogSW9wQ3R4PEYgPSBGZWx0PiwgQTogQ3VkYVRyYWNlZ2VuQWlyPEZlbHQ+PigKICAgICBtYWNoaW5lOiAmTWFjaGluZTxGZWx0LCBBPiwKQEAgLTk4NCw5ICsxMDgxLDE1IEBAIHB1YiBhc3luYyBmbiBmdWxsX3RyYWNlZ2VuPEE6IEN1ZGFUcmFjZWdlbkFpcjxGZWx0Pj4oCiAKICAgICBsb2dfY2hpcF9zdGF0cyhtYWNoaW5lLCAmY2hpcF9zZXQsICZtYWluX3RyYWNlcyk7CiAKKyAgICBsZXQgY2FwYWNpdHkgPSBmbG9vcl9jYXBhY2l0eSgKKyAgICAgICAgbWF4X3RyYWNlX3NpemUsCisgICAgICAgIHBhZGRlZF90cmFjZV9lbGVtZW50cygmcHJlcHJvY2Vzc2VkX3RyYWNlcywgbG9nX3N0YWNraW5nX2hlaWdodCkKKyAgICAgICAgICAgICsgcGFkZGVkX3RyYWNlX2VsZW1lbnRzKCZtYWluX3RyYWNlcywgbG9nX3N0YWNraW5nX2hlaWdodCksCisgICAgICAgIGxvZ19zdGFja2luZ19oZWlnaHQsCisgICAgKTsKICAgICBsZXQgbXV0IGphZ2dlZF9tbGUgPSBhbGxvY2F0ZV9hbmRfaW5pdGlhbGl6ZV90cmFjZXMoCiAgICAgICAgIHByZXByb2Nlc3NlZF90cmFjZXMsCi0gICAgICAgIG1heF90cmFjZV9zaXplLAorICAgICAgICBjYXBhY2l0eSwKICAgICAgICAgbG9nX3N0YWNraW5nX2hlaWdodCwKICAgICAgICAgbWF4X2xvZ19yb3dfY291bnQsCiAgICAgICAgIGJhY2tlbmQsCkBAIC0xMDAyLDYgKzExMDUsMTggQEAgcHViIGFzeW5jIGZuIGZ1bGxfdHJhY2VnZW48QTogQ3VkYVRyYWNlZ2VuQWlyPEZlbHQ+PigKICAgICApCiAgICAgLmF3YWl0OwogCisgICAgaWYgc3RkOjplbnY6OnZhcigiU1AxX0dQVV9GTE9PUl9MT0ciKS5pc19vaygpIHsKKyAgICAgICAgbGV0IGRlbnNlID0gamFnZ2VkX21sZS5kZW5zZSgpOworICAgICAgICBsZXQgKGZyZWUsIHRvdGFsKSA9IHNwMV9ncHVfY3VkYXJ0OjpjdWRhX21lbW9yeV9pbmZvKCkudW53cmFwX29yKCgwLCAwKSk7CisgICAgICAgIGVwcmludGxuISgKKyAgICAgICAgICAgICJGTE9PUiB0cmFjZWdlbiB1c2VkIHByZXByb2Nlc3NlZF9lbGVtZW50cz17fSBtYWluX2VsZW1lbnRzPXt9IGRlbnNlX2xlbj17fSBjYXBhY2l0eV9lbGVtZW50cz17Y2FwYWNpdHl9IG1heF90cmFjZV9zaXplPXttYXhfdHJhY2Vfc2l6ZX0gZGV2aWNlX3VzZWRfbWliPXt9IiwKKyAgICAgICAgICAgIGRlbnNlLnByZXByb2Nlc3NlZF9vZmZzZXQsCisgICAgICAgICAgICBkZW5zZS5tYWluX3NpemUoKSwKKyAgICAgICAgICAgIGRlbnNlLmRlbnNlLmxlbigpLAorICAgICAgICAgICAgKHRvdGFsIC0gZnJlZSkgPj4gMjAKKyAgICAgICAgKTsKKyAgICB9CisKICAgICAocHVibGljX3ZhbHVlcywgamFnZ2VkX21sZSwgY2hpcF9zZXQsIHBlcm1pdCkKIH0KIApkaWZmIC0tZ2l0IGEvc3AxLWdwdS9jcmF0ZXMvcHJvdmVyX2NvbXBvbmVudHMvc3JjL2J1aWxkZXIucnMgYi9zcDEtZ3B1L2NyYXRlcy9wcm92ZXJfY29tcG9uZW50cy9zcmMvYnVpbGRlci5ycwppbmRleCA1ZGNjZDlkLi41NzRkNGZhIDEwMDY0NAotLS0gYS9zcDEtZ3B1L2NyYXRlcy9wcm92ZXJfY29tcG9uZW50cy9zcmMvYnVpbGRlci5ycworKysgYi9zcDEtZ3B1L2NyYXRlcy9wcm92ZXJfY29tcG9uZW50cy9zcmMvYnVpbGRlci5ycwpAQCAtMjMsMjggKzIzLDc1IEBAIHVzZSBjcmF0ZTo6ewogICAgIFNQMUN1ZGFQcm92ZXJDb21wb25lbnRzLAogfTsKIAorLy8vIElnbmV1bSBwcm92ZXItZmxvb3IgcGF0Y2ggKDUgT2N0b2JlciAyMDI2KS4gVXBzdHJlYW0gc2l6ZXMgZXZlcnkgZGV2aWNlIGJ1ZmZlciBmb3IgYSAyNCBHQiBjYXJkIG9yIGxhcmdlcgorLy8vIGFuZCBwYW5pY3MgYmVsb3cgdGhhdCwgd2hhdGV2ZXIgdGhlIHNoYXJkLiBIZXJlIHRoZSBjYXJkJ3MgbWVtb3J5IChvciBgU1AxX0dQVV9NRU1PUllfQlVER0VUX0dCYCkgcGlja3MgYQorLy8vIHRpZXIsIGFuZCBgU1AxX0dQVV9FTEVNRU5UX1RIUkVTSE9MRGAgLyBgU1AxX0dQVV9SRUNVUlNJT05fVFJBQ0VfQUxMT0NBVElPTmAgc2V0IHRoZSB0d28gYnVmZmVycyBkaXJlY3RseS4KKy8vLyBUaGUgcHJvb2YgZm9ybWF0LCB0aGUgdmVyaWZpZXIgYW5kIHRoZSBwcm9ncmFtIGlkcyBkbyBub3QgY2hhbmdlOiB0aGUgZWxlbWVudCB0aHJlc2hvbGQgb25seSBkZWNpZGVzIHdoZXJlCisvLy8gdGhlIGV4ZWN1dG9yIHNwbGl0cyBzaGFyZHMsIGFzIHVwc3RyZWFtJ3Mgb3duIDI0IEdCIHRpZXIgYWxyZWFkeSBkb2VzLgorZm4gZW52X3VzaXplKG5hbWU6ICZzdHIpIC0+IE9wdGlvbjx1c2l6ZT4geworICAgIHN0ZDo6ZW52Ojp2YXIobmFtZSkub2soKS5hbmRfdGhlbih8c3wgcy5wYXJzZTo6PHVzaXplPigpLm9rKCkpCit9CisKK2ZuIGVudl9mNjQobmFtZTogJnN0cikgLT4gT3B0aW9uPGY2ND4geworICAgIHN0ZDo6ZW52Ojp2YXIobmFtZSkub2soKS5hbmRfdGhlbih8c3wgcy5wYXJzZTo6PGY2ND4oKS5vaygpKQorfQorCisvLy8gVGhlIGNvcmUgZWxlbWVudCB0aHJlc2hvbGQgZm9yIGEgbWVtb3J5IGJ1ZGdldCBpbiBHQiAodXBzdHJlYW0ncyBvd24gZmlndXJlIGZvciB0aGUgYnVkZ2V0LCArNCwgYXMgaXQKKy8vLyBjb21wdXRlZCBpdDogYSAzMiBHQiBjYXJkIGlzIDM2LCBhIDI0IEdCIGNhcmQgMjgsIGEgMTYgR0IgY2FyZCAyMCwgYSAxMiBHQiBjYXJkIDE2KS4KK3B1YiBmbiBlbGVtZW50X3RocmVzaG9sZF9mb3JfYnVkZ2V0KGdwdV9tZW1vcnlfZ2I6IHVzaXplLCBmdWxsX3NpemVfc2hhcmRzOiBib29sKSAtPiB1NjQgeworICAgIGlmIGdwdV9tZW1vcnlfZ2IgPiAzMCB8fCAoZnVsbF9zaXplX3NoYXJkcyAmJiBncHVfbWVtb3J5X2diID49IDI0KSB7CisgICAgICAgIEVMRU1FTlRfVEhSRVNIT0xECisgICAgfSBlbHNlIGlmIGdwdV9tZW1vcnlfZ2IgPj0gMjQgeworICAgICAgICBFTEVNRU5UX1RIUkVTSE9MRCAtICgxIDw8IDI2KSAtICgxIDw8IDI1KSAtICgxIDw8IDI0KQorICAgIH0gZWxzZSBpZiBncHVfbWVtb3J5X2diID49IDE4IHsKKyAgICAgICAgKDEgPDwgMjcpICsgKDEgPDwgMjYpCisgICAgfSBlbHNlIHsKKyAgICAgICAgMSA8PCAyNworICAgIH0KK30KKworLy8vIFRoZSByZWN1cnNpb24gdHJhY2UgYWxsb2NhdGlvbiAoZWxlbWVudHMpIGZvciBhIG1lbW9yeSBidWRnZXQuCitwdWIgZm4gcmVjdXJzaW9uX3RyYWNlX2FsbG9jYXRpb25fZm9yX2J1ZGdldChncHVfbWVtb3J5X2diOiB1c2l6ZSkgLT4gdXNpemUgeworICAgIGlmIGdwdV9tZW1vcnlfZ2IgPj0gMjQgeworICAgICAgICBSRUNVUlNJT05fVFJBQ0VfQUxMT0NBVElPTgorICAgIH0gZWxzZSB7CisgICAgICAgIFJFQ1VSU0lPTl9UUkFDRV9BTExPQ0FUSU9OCisgICAgfQorfQorCitwdWIgZm4gZ3B1X21lbW9yeV9nYigpIC0+IHVzaXplIHsKKyAgICBsZXQgZ2IgPSAxMDI0LjAgKiAxMDI0LjAgKiAxMDI0LjA7CisgICAgbWF0Y2ggZW52X2Y2NCgiU1AxX0dQVV9NRU1PUllfQlVER0VUX0dCIikgeworICAgICAgICBTb21lKGIpID0+IChiLmNlaWwoKSBhcyB1c2l6ZSkgKyA0LAorICAgICAgICBOb25lID0+ICgoKGN1ZGFfbWVtb3J5X2luZm8oKS51bndyYXAoKS4xIGFzIGY2NCkgLyBnYikuY2VpbCgpIGFzIHVzaXplKSArIDQsCisgICAgfQorfQorCitwdWIgZm4gcmVjdXJzaW9uX3RyYWNlX2FsbG9jYXRpb24oKSAtPiB1c2l6ZSB7CisgICAgZW52X3VzaXplKCJTUDFfR1BVX1JFQ1VSU0lPTl9UUkFDRV9BTExPQ0FUSU9OIikKKyAgICAgICAgLnVud3JhcF9vcl9lbHNlKHx8IHJlY3Vyc2lvbl90cmFjZV9hbGxvY2F0aW9uX2Zvcl9idWRnZXQoZ3B1X21lbW9yeV9nYigpKSkKK30KKwogcHViIGZuIGxvY2FsX2dwdV9vcHRzKCkgLT4gU1AxQ29yZU9wdHMgewogICAgIGxldCBtdXQgb3B0cyA9IFNQMUNvcmVPcHRzOjpkZWZhdWx0KCk7CiAKICAgICBsZXQgbG9nMl9zaGFyZF9zaXplID0gMjQ7CiAgICAgb3B0cy5zaGFyZF9zaXplID0gMSA8PCBsb2cyX3NoYXJkX3NpemU7CiAKLSAgICBsZXQgZ2IgPSAxMDI0LjAgKiAxMDI0LjAgKiAxMDI0LjA7Ci0KLSAgICAvLyBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgb24gdGhlIEdQVS4KLSAgICBsZXQgZ3B1X21lbW9yeV9nYjogdXNpemUgPSAoKChjdWRhX21lbW9yeV9pbmZvKCkudW53cmFwKCkuMSBhcyBmNjQpIC8gZ2IpLmNlaWwoKSBhcyB1c2l6ZSkgKyA0OwotCi0gICAgaWYgZ3B1X21lbW9yeV9nYiA8IDI0IHsKLSAgICAgICAgcGFuaWMhKCJVbnN1cHBvcnRlZCBHUFUgbWVtb3J5OiB7Z3B1X21lbW9yeV9nYn0sIG11c3QgYmUgYXQgbGVhc3QgMjRHQiIpOwotICAgIH0KKyAgICAvLyBUaGUgY2FyZCdzIG1lbW9yeSBwbHVzIDQsIGFzIHVwc3RyZWFtIGNvbXB1dGVkIGl0IChhIDMyIEdCIGNhcmQgcmVhZHMgMzYpLCBvciB0aGUgYnVkZ2V0IGdpdmVuLgorICAgIGxldCBncHVfbWVtb3J5X2diID0gZ3B1X21lbW9yeV9nYigpOwogCi0gICAgbGV0IHNoYXJkX3RocmVzaG9sZCA9IGlmICFvcHRzLmZ1bGxfc2l6ZV9zaGFyZHMgJiYgZ3B1X21lbW9yeV9nYiA8PSAzMCB7Ci0gICAgICAgIEVMRU1FTlRfVEhSRVNIT0xEIC0gKDEgPDwgMjYpIC0gKDEgPDwgMjUpIC0gKDEgPDwgMjQpCi0gICAgfSBlbHNlIHsKLSAgICAgICAgRUxFTUVOVF9USFJFU0hPTEQKKyAgICBsZXQgc2hhcmRfdGhyZXNob2xkID0gbWF0Y2ggZW52X3VzaXplKCJTUDFfR1BVX0VMRU1FTlRfVEhSRVNIT0xEIikgeworICAgICAgICBTb21lKHQpID0+IHQgYXMgdTY0LAorICAgICAgICBOb25lID0+IGVsZW1lbnRfdGhyZXNob2xkX2Zvcl9idWRnZXQoZ3B1X21lbW9yeV9nYiwgb3B0cy5mdWxsX3NpemVfc2hhcmRzKSwKICAgICB9OworICAgIGxldCBoZWlnaHRfdGhyZXNob2xkID0gb3B0cy5zaGFyZGluZ190aHJlc2hvbGQuaGVpZ2h0X3RocmVzaG9sZDsKIAotICAgIHRyYWNpbmc6OmRlYnVnISgiU2hhcmQgdGhyZXNob2xkOiB7c2hhcmRfdGhyZXNob2xkfSIpOworICAgIGVwcmludGxuISgKKyAgICAgICAgIkZMT09SIG9wdHMgZ3B1X21lbW9yeV9nYj17Z3B1X21lbW9yeV9nYn0gZWxlbWVudF90aHJlc2hvbGQ9e3NoYXJkX3RocmVzaG9sZH0gaGVpZ2h0X3RocmVzaG9sZD17aGVpZ2h0X3RocmVzaG9sZH0gcmVjdXJzaW9uX3RyYWNlX2FsbG9jYXRpb249e30gZnVsbF9zaXplX3NoYXJkcz17fSIsCisgICAgICAgIHJlY3Vyc2lvbl90cmFjZV9hbGxvY2F0aW9uKCksCisgICAgICAgIG9wdHMuZnVsbF9zaXplX3NoYXJkcworICAgICk7CiAgICAgb3B0cy5zaGFyZGluZ190aHJlc2hvbGQuZWxlbWVudF90aHJlc2hvbGQgPSBzaGFyZF90aHJlc2hvbGQ7CiAKICAgICBvcHRzLmdsb2JhbF9kZXBlbmRlbmNpZXNfb3B0ID0gdHJ1ZTsKQEAgLTkyLDcgKzEzOSw3IEBAIHB1YiBhc3luYyBmbiByZWN1cnNpb25fcHJvdmVyX2FuZF92ZXJpZmllcigKICkgewogICAgIGxldCByZWN1cnNpb25fdmVyaWZpZXIgPSBTUDFDdWRhUHJvdmVyQ29tcG9uZW50czo6Y29tcHJlc3NfdmVyaWZpZXIoKTsKICAgICAoCi0gICAgICAgIG5ld19jdWRhX3Byb3ZlcigmcmVjdXJzaW9uX3ZlcmlmaWVyLCBSRUNVUlNJT05fVFJBQ0VfQUxMT0NBVElPTiwgNCwgZmFsc2UsIGZhbHNlLCBzY29wZSkKKyAgICAgICAgbmV3X2N1ZGFfcHJvdmVyKCZyZWN1cnNpb25fdmVyaWZpZXIsIHJlY3Vyc2lvbl90cmFjZV9hbGxvY2F0aW9uKCksIDQsIGZhbHNlLCBmYWxzZSwgc2NvcGUpCiAgICAgICAgICAgICAuYXdhaXQsCiAgICAgICAgIHJlY3Vyc2lvbl92ZXJpZmllciwKICAgICApCmRpZmYgLS1naXQgYS9zcDEtZ3B1L2NyYXRlcy9zZXJ2ZXIvc3JjL3NlcnZlci5ycyBiL3NwMS1ncHUvY3JhdGVzL3NlcnZlci9zcmMvc2VydmVyLnJzCmluZGV4IDQwMzVmMWYuLjBkMGQ5MDcgMTAwNjQ0Ci0tLSBhL3NwMS1ncHUvY3JhdGVzL3NlcnZlci9zcmMvc2VydmVyLnJzCisrKyBiL3NwMS1ncHUvY3JhdGVzL3NlcnZlci9zcmMvc2VydmVyLnJzCkBAIC0xNTcsNiArMTU3LDcgQEAgaW1wbCBTZXJ2ZXIgewogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgbGV0IHBrID0gQ2FjaGVkUHJvZ3JhbSB7IGVsZjogQXJjOjpuZXcoRWxmOjpEeW5hbWljKGVsZi5pbnRvKCkpKSwgdms6IHZrLmNsb25lKCkgfTsKICAgICAgICAgICAgICAgICBjdHgucGtfY2FjaGUuaW5zZXJ0KGVsZl9oYXNoLCBwayk7CisgICAgICAgICAgICAgICAgZmxvb3JfbWVtb3J5X2xpbmUoImFmdGVyIHNldHVwIik7CiAgICAgICAgICAgICAgICAgUmVzcG9uc2U6OlNldHVwIHsgaWQ6IGVsZl9oYXNoLCB2ayB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBSZXF1ZXN0OjpEZXN0cm95IHsga2V5IH0gPT4gewpAQCAtMTc3LDE1ICsxNzgsMzEgQEAgaW1wbCBTZXJ2ZXIgewogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgbGV0IGNvbnRleHQgPSBTUDFDb250ZXh0OjpidWlsZGVyKCkucHJvb2Zfbm9uY2UocHJvb2Zfbm9uY2UpLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgbWF0Y2ggcHJvdmVyLnByb3ZlX3dpdGhfbW9kZSgmY2FjaGVkLmVsZiwgc3RkaW4sIGNvbnRleHQsIG1vZGUpLmF3YWl0IHsKKyAgICAgICAgICAgICAgICBsZXQgc3RhcnRlZCA9IHN0ZDo6dGltZTo6SW5zdGFudDo6bm93KCk7CisgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gbWF0Y2ggcHJvdmVyLnByb3ZlX3dpdGhfbW9kZSgmY2FjaGVkLmVsZiwgc3RkaW4sIGNvbnRleHQsIG1vZGUpLmF3YWl0IHsKICAgICAgICAgICAgICAgICAgICAgT2socHJvb2YpID0+IFJlc3BvbnNlOjpQcm9vZiB7IHByb29mIH0sCiAgICAgICAgICAgICAgICAgICAgIEVycihlKSA9PiBSZXNwb25zZTo6UHJvdmVyRXJyb3IoZS50b19zdHJpbmcoKSksCi0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgZmxvb3JfbWVtb3J5X2xpbmUoJmZvcm1hdCEoImFmdGVyIHByb3ZlIHs6P30gaW4gezouMX0gcyIsIG1vZGUsIHN0YXJ0ZWQuZWxhcHNlZCgpLmFzX3NlY3NfZjY0KCkpKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCisvLy8gSWduZXVtIHByb3Zlci1mbG9vciBwYXRjaDogdGhlIGRldmljZSBtZW1vcnkgaW4gdXNlICh0b3RhbCBtaW51cyBmcmVlLCBhcyB0aGUgZHJpdmVyIHJlcG9ydHMgaXQpIGF0IHRoZQorLy8vIHBvaW50cyB0aGF0IGJvdW5kIGEgcHJvb2YsIHNvIGEgcnVuJ3MgbG9nIGNhcnJpZXMgdGhlIHRlcm1zIG9mIHRoZSBwZWFrIHdpdGhvdXQgYSBzYW1wbGVyLgorZm4gZmxvb3JfbWVtb3J5X2xpbmUod2hhdDogJnN0cikgeworICAgIGlmIGxldCBPaygoZnJlZSwgdG90YWwpKSA9IHNwMV9ncHVfY3VkYXJ0OjpjdWRhX21lbW9yeV9pbmZvKCkgeworICAgICAgICBlcHJpbnRsbiEoCisgICAgICAgICAgICAiRkxPT1IgbWVtb3J5IHt3aGF0fTogZGV2aWNlX3VzZWRfbWliPXt9IGZyZWVfbWliPXt9IHRvdGFsX21pYj17fSIsCisgICAgICAgICAgICAodG90YWwgLSBmcmVlKSA+PiAyMCwKKyAgICAgICAgICAgIGZyZWUgPj4gMjAsCisgICAgICAgICAgICB0b3RhbCA+PiAyMAorICAgICAgICApOworICAgIH0KK30KKwogZm4gc2hhMjU2KGRhdGE6ICZbdThdKSAtPiBbdTg7IDMyXSB7CiAgICAgdXNlIHNoYTI6OntEaWdlc3QsIFNoYTI1Nn07CiAgICAgbGV0IG11dCBoYXNoZXIgPSBTaGEyNTY6Om5ldygpOwo=' +$patchB64 = 'ZGlmZiAtLWdpdCBhL3NwMS1ncHUvY3JhdGVzL2N1ZGEvc3JjL3Rhc2sucnMgYi9zcDEtZ3B1L2NyYXRlcy9jdWRhL3NyYy90YXNrLnJzCmluZGV4IGE1MDNhODYuLjgxMzAxNmIgMTAwNjQ0Ci0tLSBhL3NwMS1ncHUvY3JhdGVzL2N1ZGEvc3JjL3Rhc2sucnMKKysrIGIvc3AxLWdwdS9jcmF0ZXMvY3VkYS9zcmMvdGFzay5ycwpAQCAtMTQ5LDcgKzE0OSwxNSBAQCBwdWIgZW51bSBHbG9iYWxUYXNrUG9vbEJ1aWxkRXJyb3IgewogCiBpbXBsIFRhc2tQb29sQnVpbGRlciB7CiAgICAgcHViIGZuIG5ldygpIC0+IFNlbGYgewotICAgICAgICBTZWxmIHsgY2FwYWNpdHk6IE5vbmUsIGRldmljZTogQ3VkYURldmljZSgwKSwgbWVtX3JlbGVhc2VfdGhyZXNob2xkOiB1NjQ6Ok1BWCB9CisgICAgICAgIC8vIElnbmV1bSBwcm92ZXItZmxvb3IgcGF0Y2g6IHVwc3RyZWFtIGtlZXBzIGV2ZXJ5IGZyZWVkIGRldmljZSBhbGxvY2F0aW9uIGluIHRoZSBwb29sIGZvciB0aGUgcHJvY2VzcydzCisgICAgICAgIC8vIGxpZmUgKHRocmVzaG9sZCB1NjQ6Ok1BWCksIHNvIHRoZSBwcm92ZXIgaG9sZHMgaXRzIGhpZ2gtd2F0ZXIgbWFyayBiZXR3ZWVuIHNoYXJkcyBvbiBhIGNhcmQgaXQgc2hhcmVzCisgICAgICAgIC8vIHdpdGggYSBtaW5lci4gYFNQMV9HUFVfTUVNX1JFTEVBU0VfVEhSRVNIT0xEPTxieXRlcz5gIHNldHMgdGhlIHBvb2wncyByZWxlYXNlIHRocmVzaG9sZCAoMCByZXR1cm5zCisgICAgICAgIC8vIGZyZWVkIG1lbW9yeSB0byB0aGUgZHJpdmVyIGF0IG9uY2UpOyB1bnNldCwgdXBzdHJlYW0ncyBiZWhhdmlvdXIuCisgICAgICAgIGxldCBtZW1fcmVsZWFzZV90aHJlc2hvbGQgPSBzdGQ6OmVudjo6dmFyKCJTUDFfR1BVX01FTV9SRUxFQVNFX1RIUkVTSE9MRCIpCisgICAgICAgICAgICAub2soKQorICAgICAgICAgICAgLmFuZF90aGVuKHxzfCBzLnBhcnNlOjo8dTY0PigpLm9rKCkpCisgICAgICAgICAgICAudW53cmFwX29yKHU2NDo6TUFYKTsKKyAgICAgICAgU2VsZiB7IGNhcGFjaXR5OiBOb25lLCBkZXZpY2U6IEN1ZGFEZXZpY2UoMCksIG1lbV9yZWxlYXNlX3RocmVzaG9sZCB9CiAgICAgfQogCiAgICAgcHViIGZuIG51bV90YXNrcyhtdXQgc2VsZiwgbnVtX3Rhc2tzOiB1c2l6ZSkgLT4gU2VsZiB7CmRpZmYgLS1naXQgYS9zcDEtZ3B1L2NyYXRlcy9qYWdnZWRfdHJhY2VnZW4vc3JjL2xpYi5ycyBiL3NwMS1ncHUvY3JhdGVzL2phZ2dlZF90cmFjZWdlbi9zcmMvbGliLnJzCmluZGV4IDU3OWY3MGEuLjIyNjQwNDQgMTAwNjQ0Ci0tLSBhL3NwMS1ncHUvY3JhdGVzL2phZ2dlZF90cmFjZWdlbi9zcmMvbGliLnJzCisrKyBiL3NwMS1ncHUvY3JhdGVzL2phZ2dlZF90cmFjZWdlbi9zcmMvbGliLnJzCkBAIC00ODEsNiArNDgxLDMzIEBAIGFzeW5jIGZuIGRldmljZV9wcmVwcm9jZXNzZWRfdHJhY2VnZW48QTogQ3VkYVRyYWNlZ2VuQWlyPEZlbHQ+PigKICAgICBuYW1lZF90cmFjZXMKIH0KIAorLy8vIElnbmV1bSBwcm92ZXItZmxvb3IgcGF0Y2g6IHRoZSBkZW5zZSBlbGVtZW50cyBhIHNldCBvZiB0cmFjZXMgd2lsbCBvY2N1cHkgb25jZSBgZ2VuZXJhdGVfamFnZ2VkX3RyYWNlc2AKKy8vLyBoYXMgbGFpZCB0aGVtIG91dCwgdGhhdCBpcyB0aGUgc3VtIG9mIHRoZWlyIGJ1ZmZlcnMgcGFkZGVkIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIDJebG9nX3N0YWNraW5nX2hlaWdodAorLy8vICh0aGUgImZpbmFsIHBhZGRpbmciIHN0ZXAgYmVsb3cpLiBFYWNoIHBoYXNlIChwcmVwcm9jZXNzZWQsIHRoZW4gbWFpbikgaXMgcGFkZGVkIG9uIGl0cyBvd24uCitwdWIgZm4gcGFkZGVkX3RyYWNlX2VsZW1lbnRzKAorICAgIHRyYWNlczogJkJUcmVlTWFwPFN0cmluZywgVHJhY2U8VGFza1Njb3BlPj4sCisgICAgbG9nX3N0YWNraW5nX2hlaWdodDogdTMyLAorKSAtPiB1c2l6ZSB7CisgICAgbGV0IHRvdGFsOiB1c2l6ZSA9IHRyYWNlcworICAgICAgICAudmFsdWVzKCkKKyAgICAgICAgLm1hcCh8dHwgbWF0Y2ggdCB7CisgICAgICAgICAgICBUcmFjZTo6UmVhbCh0cmFjZSkgPT4gdHJhY2UuZ3V0cygpLmFzX2J1ZmZlcigpLmxlbigpLAorICAgICAgICAgICAgVHJhY2U6OlBhZGRpbmcoXykgPT4gMCwKKyAgICAgICAgfSkKKyAgICAgICAgLnN1bSgpOworICAgIHRvdGFsLm5leHRfbXVsdGlwbGVfb2YoMSA8PCBsb2dfc3RhY2tpbmdfaGVpZ2h0KQorfQorCisvLy8gSWduZXVtIHByb3Zlci1mbG9vciBwYXRjaDogdGhlIGNhcGFjaXR5IHRvIGFsbG9jYXRlIGZvciBhIHRyYWNlIHNldDogdGhlIGV4YWN0IHBhZGRlZCBzaXplIHBsdXMgb25lCisvLy8gc3RhY2tpbmcgaGVpZ2h0IG9mIHNsYWNrLCBuZXZlciBtb3JlIHRoYW4gdGhlIHByb3ZlcidzIGBtYXhfdHJhY2Vfc2l6ZWAuIGBTUDFfR1BVX0ZMT09SX0VYQUNUPTBgIHJlc3RvcmVzCisvLy8gdXBzdHJlYW0ncyBmdWxsLWNhcGFjaXR5IGFsbG9jYXRpb24uCitmbiBmbG9vcl9jYXBhY2l0eShtYXhfdHJhY2Vfc2l6ZTogdXNpemUsIG5lZWRlZDogdXNpemUsIGxvZ19zdGFja2luZ19oZWlnaHQ6IHUzMikgLT4gdXNpemUgeworICAgIGlmIHN0ZDo6ZW52Ojp2YXIoIlNQMV9HUFVfRkxPT1JfRVhBQ1QiKS5tYXAofHZ8IHYgPT0gIjAiKS51bndyYXBfb3IoZmFsc2UpIHsKKyAgICAgICAgcmV0dXJuIG1heF90cmFjZV9zaXplOworICAgIH0KKyAgICBtYXhfdHJhY2Vfc2l6ZS5taW4obmVlZGVkICsgKDEgPDwgbG9nX3N0YWNraW5nX2hlaWdodCkpCit9CisKIGFzeW5jIGZuIGFsbG9jYXRlX2FuZF9pbml0aWFsaXplX3RyYWNlcygKICAgICBwcmVwcm9jZXNzZWRfdHJhY2VzOiBCVHJlZU1hcDxTdHJpbmcsIFRyYWNlPFRhc2tTY29wZT4+LAogICAgIG1heF90cmFjZV9zaXplOiB1c2l6ZSwKQEAgLTQ5NCw2ICs1MjEsMTEgQEAgYXN5bmMgZm4gYWxsb2NhdGVfYW5kX2luaXRpYWxpemVfdHJhY2VzKAogCiAgICAgbGV0IHRvdGFsX2diID0gdG90YWxfYnl0ZXMgYXMgZjY0IC8gKDEgPDwgMzApIGFzIGY2NDsKICAgICB0cmFjaW5nOjpkZWJ1ZyEoIkFsbG9jYXRpbmcgezo/fSBHQiBvZiB0cmFjZXMiLCB0b3RhbF9nYik7CisgICAgaWYgc3RkOjplbnY6OnZhcigiU1AxX0dQVV9GTE9PUl9MT0ciKS5pc19vaygpIHsKKyAgICAgICAgZXByaW50bG4hKAorICAgICAgICAgICAgIkZMT09SIHRyYWNlZ2VuIGFsbG9jIGNhcGFjaXR5X2VsZW1lbnRzPXttYXhfdHJhY2Vfc2l6ZX0gYnl0ZXM9e3RvdGFsX2J5dGVzfSAoe3RvdGFsX2diOi4zfSBHQikiCisgICAgICAgICk7CisgICAgfQogICAgIGxldCBtdXQgZGVuc2VfZGF0YTogQnVmZmVyPEZlbHQsIFRhc2tTY29wZT4gPQogICAgICAgICBCdWZmZXI6OndpdGhfY2FwYWNpdHlfaW4obWF4X3RyYWNlX3NpemUsIGJhY2tlbmQuY2xvbmUoKSk7CiAgICAgbGV0IG11dCBjb2xfaW5kZXg6IEJ1ZmZlcjx1MzIsIFRhc2tTY29wZT4gPQpAQCAtNjc3LDkgKzcwOSwxNCBAQCBwdWIgYXN5bmMgZm4gc2V0dXBfdHJhY2VnZW48QTogQ3VkYVRyYWNlZ2VuQWlyPEZlbHQ+PigKICAgICBsZXQgcHJlcHJvY2Vzc2VkX3RyYWNlcyA9CiAgICAgICAgIGRldmljZV9wcmVwcm9jZXNzZWRfdHJhY2VnZW4ocHJvZ3JhbSwgaG9zdF9waGFzZV90cmFjZWdlbiwgYmFja2VuZCkuYXdhaXQ7CiAKKyAgICBsZXQgY2FwYWNpdHkgPSBmbG9vcl9jYXBhY2l0eSgKKyAgICAgICAgbWF4X3RyYWNlX3NpemUsCisgICAgICAgIHBhZGRlZF90cmFjZV9lbGVtZW50cygmcHJlcHJvY2Vzc2VkX3RyYWNlcywgbG9nX3N0YWNraW5nX2hlaWdodCksCisgICAgICAgIGxvZ19zdGFja2luZ19oZWlnaHQsCisgICAgKTsKICAgICBsZXQgamFnZ2VkX3RyYWNlcyA9IGFsbG9jYXRlX2FuZF9pbml0aWFsaXplX3RyYWNlcygKICAgICAgICAgcHJlcHJvY2Vzc2VkX3RyYWNlcywKLSAgICAgICAgbWF4X3RyYWNlX3NpemUsCisgICAgICAgIGNhcGFjaXR5LAogICAgICAgICBsb2dfc3RhY2tpbmdfaGVpZ2h0LAogICAgICAgICBtYXhfbG9nX3Jvd19jb3VudCwKICAgICAgICAgYmFja2VuZCwKQEAgLTkwNiw2ICs5NDMsMTEgQEAgcHViIGFzeW5jIGZuIG1haW5fdHJhY2VnZW48R0M6IElvcEN0eDxGID0gRmVsdD4sIEE6IEN1ZGFUcmFjZWdlbkFpcjxGZWx0Pj4oCiAKICAgICBsb2dfY2hpcF9zdGF0cyhtYWNoaW5lLCAmY2hpcF9zZXQsICZ0cmFjZXMpOwogCisgICAgLy8gSWduZXVtIHByb3Zlci1mbG9vciBwYXRjaDogdGhlIGtleSdzIGJ1ZmZlciBpcyBzaXplZCB0byBpdHMgcHJlcHJvY2Vzc2VkIHRyYWNlcyBhdCBzZXR1cCAodXBzdHJlYW0gc2l6ZWQgaXQKKyAgICAvLyBmb3IgYSB3aG9sZSBzaGFyZCksIHNvIGdyb3cgaXQgaGVyZSB0byB3aGF0IHRoaXMgc2hhcmQgbmVlZHMgYmVmb3JlIHRoZSBtYWluIHRyYWNlcyBhcmUgYXBwZW5kZWQ6IGEgYmlnZ2VyCisgICAgLy8gZGVuc2UgYnVmZmVyIGFuZCBjb2x1bW4gaW5kZXgsIHRoZSBwcmVwcm9jZXNzZWQgcmVnaW9uIGNvcGllZCBkZXZpY2UgdG8gZGV2aWNlLCBzd2FwcGVkIGludG8gdGhlIGtleS4KKyAgICBncm93X2Zvcl9tYWluKCZtdXQgamFnZ2VkX3RyYWNlcy5wcmVwcm9jZXNzZWRfdHJhY2VzLCAmdHJhY2VzLCBsb2dfc3RhY2tpbmdfaGVpZ2h0LCBiYWNrZW5kKTsKKwogICAgIGNvcHlfbWFpbl9qYWdnZWRfdHJhY2VzKAogICAgICAgICB0cmFjZXMsCiAgICAgICAgICZtdXQgamFnZ2VkX3RyYWNlcy5wcmVwcm9jZXNzZWRfdHJhY2VzLApAQCAtOTE4LDYgKzk2MCw2MSBAQCBwdWIgYXN5bmMgZm4gbWFpbl90cmFjZWdlbjxHQzogSW9wQ3R4PEYgPSBGZWx0PiwgQTogQ3VkYVRyYWNlZ2VuQWlyPEZlbHQ+PigKICAgICAocHVibGljX3ZhbHVlcywgY2hpcF9zZXQsIHBlcm1pdCkKIH0KIAorLy8vIElnbmV1bSBwcm92ZXItZmxvb3IgcGF0Y2g6IHNlZSBgbWFpbl90cmFjZWdlbmAuIFRoZSBuZWVkIGlzIHRoZSBwcmVwcm9jZXNzZWQgcGhhc2UgYXMgbGFpZCBvdXQgKGl0cyBwYWRkZWQKKy8vLyBlbmQsIGBwcmVwcm9jZXNzZWRfb2Zmc2V0YCkgcGx1cyB0aGUgbWFpbiB0cmFjZXMgcGFkZGVkIHRvIHRoZSBzdGFja2luZyBoZWlnaHQgcGx1cyBvbmUgc3RhY2tpbmcgaGVpZ2h0IG9mCisvLy8gc2xhY2s7IGEgYnVmZmVyIGF0IGxlYXN0IHRoYXQgYmlnIGlzIGxlZnQgYWxvbmUuIFRoZSBwcm9jZXNzIGFib3J0cywgbG91ZGx5LCBpZiB0aGUgY29weSBjYW5ub3QgYmUgbWFkZSwKKy8vLyBiZWNhdXNlIGEgcGFuaWMgaW5zaWRlIGEgcHJvdmVyIHRhc2sgaXMgd2hhdCBsZWZ0IHN3ZWVwIDIgaGFuZ2luZyBvbiB0aGUgY2xpZW50J3Mgc29ja2V0LgorZm4gZ3Jvd19mb3JfbWFpbigKKyAgICBqYWdnZWQ6ICZtdXQgSmFnZ2VkVHJhY2VNbGU8RmVsdCwgVGFza1Njb3BlPiwKKyAgICBtYWluX3RyYWNlczogJkJUcmVlTWFwPFN0cmluZywgVHJhY2U8VGFza1Njb3BlPj4sCisgICAgbG9nX3N0YWNraW5nX2hlaWdodDogdTMyLAorICAgIGJhY2tlbmQ6ICZUYXNrU2NvcGUsCispIHsKKyAgICBsZXQgcHJlX2VuZCA9IGphZ2dlZC5kZW5zZSgpLnByZXByb2Nlc3NlZF9vZmZzZXQ7CisgICAgbGV0IG5lZWRlZCA9IHByZV9lbmQKKyAgICAgICAgKyBwYWRkZWRfdHJhY2VfZWxlbWVudHMobWFpbl90cmFjZXMsIGxvZ19zdGFja2luZ19oZWlnaHQpCisgICAgICAgICsgKDEgPDwgbG9nX3N0YWNraW5nX2hlaWdodCk7CisgICAgbGV0IGhhdmUgPSBqYWdnZWQuZGVuc2UoKS5kZW5zZS5jYXBhY2l0eSgpOworICAgIGlmIGhhdmUgPj0gbmVlZGVkIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsZXQgbXV0IG5ld19kZW5zZTogQnVmZmVyPEZlbHQsIFRhc2tTY29wZT4gPSBCdWZmZXI6OndpdGhfY2FwYWNpdHlfaW4obmVlZGVkLCBiYWNrZW5kLmNsb25lKCkpOworICAgIGxldCBtdXQgbmV3X2NvbF9pbmRleDogQnVmZmVyPHUzMiwgVGFza1Njb3BlPiA9CisgICAgICAgIEJ1ZmZlcjo6d2l0aF9jYXBhY2l0eV9pbihuZWVkZWQgPj4gMSwgYmFja2VuZC5jbG9uZSgpKTsKKyAgICB1bnNhZmUgeworICAgICAgICBuZXdfZGVuc2UuYXNzdW1lX2luaXQoKTsKKyAgICAgICAgbmV3X2NvbF9pbmRleC5hc3N1bWVfaW5pdCgpOworICAgIH0KKyAgICB7CisgICAgICAgIGxldCBKYWdnZWRNbGUgeyBkZW5zZV9kYXRhLCBjb2xfaW5kZXgsIC4uIH0gPSAmbXV0ICoqamFnZ2VkOworICAgICAgICBsZXQgc3JjX2RlbnNlOiAmU2xpY2U8XywgXz4gPSAmZGVuc2VfZGF0YS5kZW5zZVsuLnByZV9lbmRdOworICAgICAgICBsZXQgZHN0X2RlbnNlOiAmbXV0IFNsaWNlPF8sIF8+ID0gJm11dCBuZXdfZGVuc2VbLi5wcmVfZW5kXTsKKyAgICAgICAgbGV0IHNyY19jb2w6ICZTbGljZTxfLCBfPiA9ICZjb2xfaW5kZXhbLi5wcmVfZW5kID4+IDFdOworICAgICAgICBsZXQgZHN0X2NvbDogJm11dCBTbGljZTxfLCBfPiA9ICZtdXQgbmV3X2NvbF9pbmRleFsuLnByZV9lbmQgPj4gMV07CisgICAgICAgIHVuc2FmZSB7CisgICAgICAgICAgICBpZiBkc3RfZGVuc2UuY29weV9mcm9tX3NsaWNlKHNyY19kZW5zZSwgYmFja2VuZCkuaXNfZXJyKCkKKyAgICAgICAgICAgICAgICB8fCBkc3RfY29sLmNvcHlfZnJvbV9zbGljZShzcmNfY29sLCBiYWNrZW5kKS5pc19lcnIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVwcmludGxuISgiRkxPT1IgZ3JvdyBGQUlMRUQ6IGNvdWxkIG5vdCBjb3B5IHRoZSBwcmVwcm9jZXNzZWQgcmVnaW9uICh7cHJlX2VuZH0gZWxlbWVudHMpIGludG8gdGhlIGdyb3duIGJ1ZmZlciAoe25lZWRlZH0gZWxlbWVudHMpOyBhYm9ydGluZyBpbnN0ZWFkIG9mIGhhbmdpbmciKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmFib3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgc3RkOjplbnY6OnZhcigiU1AxX0dQVV9GTE9PUl9MT0ciKS5pc19vaygpIHsKKyAgICAgICAgZXByaW50bG4hKAorICAgICAgICAgICAgIkZMT09SIGdyb3cga2V5IGJ1ZmZlciB7aGF2ZX0gLT4ge25lZWRlZH0gZWxlbWVudHMgKHByZXByb2Nlc3NlZCB7cHJlX2VuZH0sIHt9IGJ5dGVzKSIsCisgICAgICAgICAgICBuZWVkZWQgKiA2CisgICAgICAgICk7CisgICAgfQorICAgIGxldCBKYWdnZWRNbGUgeyBkZW5zZV9kYXRhLCBjb2xfaW5kZXgsIC4uIH0gPSAmbXV0ICoqamFnZ2VkOworICAgIGRlbnNlX2RhdGEuZGVuc2UgPSBuZXdfZGVuc2U7CisgICAgKmNvbF9pbmRleCA9IG5ld19jb2xfaW5kZXg7CisgICAgdW5zYWZlIHsKKyAgICAgICAgZGVuc2VfZGF0YS5kZW5zZS5zZXRfbGVuKHByZV9lbmQpOworICAgICAgICBjb2xfaW5kZXguc2V0X2xlbihwcmVfZW5kID4+IDEpOworICAgIH0KK30KKwogI1thbGxvdyhjbGlwcHk6OnRvb19tYW55X2FyZ3VtZW50cyldCiBwdWIgYXN5bmMgZm4gbWFpbl90cmFjZWdlbl9wZXJtaXQ8R0M6IElvcEN0eDxGID0gRmVsdD4sIEE6IEN1ZGFUcmFjZWdlbkFpcjxGZWx0Pj4oCiAgICAgbWFjaGluZTogJk1hY2hpbmU8RmVsdCwgQT4sCkBAIC05ODQsOSArMTA4MSwxNSBAQCBwdWIgYXN5bmMgZm4gZnVsbF90cmFjZWdlbjxBOiBDdWRhVHJhY2VnZW5BaXI8RmVsdD4+KAogCiAgICAgbG9nX2NoaXBfc3RhdHMobWFjaGluZSwgJmNoaXBfc2V0LCAmbWFpbl90cmFjZXMpOwogCisgICAgbGV0IGNhcGFjaXR5ID0gZmxvb3JfY2FwYWNpdHkoCisgICAgICAgIG1heF90cmFjZV9zaXplLAorICAgICAgICBwYWRkZWRfdHJhY2VfZWxlbWVudHMoJnByZXByb2Nlc3NlZF90cmFjZXMsIGxvZ19zdGFja2luZ19oZWlnaHQpCisgICAgICAgICAgICArIHBhZGRlZF90cmFjZV9lbGVtZW50cygmbWFpbl90cmFjZXMsIGxvZ19zdGFja2luZ19oZWlnaHQpLAorICAgICAgICBsb2dfc3RhY2tpbmdfaGVpZ2h0LAorICAgICk7CiAgICAgbGV0IG11dCBqYWdnZWRfbWxlID0gYWxsb2NhdGVfYW5kX2luaXRpYWxpemVfdHJhY2VzKAogICAgICAgICBwcmVwcm9jZXNzZWRfdHJhY2VzLAotICAgICAgICBtYXhfdHJhY2Vfc2l6ZSwKKyAgICAgICAgY2FwYWNpdHksCiAgICAgICAgIGxvZ19zdGFja2luZ19oZWlnaHQsCiAgICAgICAgIG1heF9sb2dfcm93X2NvdW50LAogICAgICAgICBiYWNrZW5kLApAQCAtMTAwMiw2ICsxMTA1LDE4IEBAIHB1YiBhc3luYyBmbiBmdWxsX3RyYWNlZ2VuPEE6IEN1ZGFUcmFjZWdlbkFpcjxGZWx0Pj4oCiAgICAgKQogICAgIC5hd2FpdDsKIAorICAgIGlmIHN0ZDo6ZW52Ojp2YXIoIlNQMV9HUFVfRkxPT1JfTE9HIikuaXNfb2soKSB7CisgICAgICAgIGxldCBkZW5zZSA9IGphZ2dlZF9tbGUuZGVuc2UoKTsKKyAgICAgICAgbGV0IChmcmVlLCB0b3RhbCkgPSBzcDFfZ3B1X2N1ZGFydDo6Y3VkYV9tZW1vcnlfaW5mbygpLnVud3JhcF9vcigoMCwgMCkpOworICAgICAgICBlcHJpbnRsbiEoCisgICAgICAgICAgICAiRkxPT1IgdHJhY2VnZW4gdXNlZCBwcmVwcm9jZXNzZWRfZWxlbWVudHM9e30gbWFpbl9lbGVtZW50cz17fSBkZW5zZV9sZW49e30gY2FwYWNpdHlfZWxlbWVudHM9e2NhcGFjaXR5fSBtYXhfdHJhY2Vfc2l6ZT17bWF4X3RyYWNlX3NpemV9IGRldmljZV91c2VkX21pYj17fSIsCisgICAgICAgICAgICBkZW5zZS5wcmVwcm9jZXNzZWRfb2Zmc2V0LAorICAgICAgICAgICAgZGVuc2UubWFpbl9zaXplKCksCisgICAgICAgICAgICBkZW5zZS5kZW5zZS5sZW4oKSwKKyAgICAgICAgICAgICh0b3RhbCAtIGZyZWUpID4+IDIwCisgICAgICAgICk7CisgICAgfQorCiAgICAgKHB1YmxpY192YWx1ZXMsIGphZ2dlZF9tbGUsIGNoaXBfc2V0LCBwZXJtaXQpCiB9CiAKZGlmZiAtLWdpdCBhL3NwMS1ncHUvY3JhdGVzL3Byb3Zlcl9jb21wb25lbnRzL3NyYy9idWlsZGVyLnJzIGIvc3AxLWdwdS9jcmF0ZXMvcHJvdmVyX2NvbXBvbmVudHMvc3JjL2J1aWxkZXIucnMKaW5kZXggNWRjY2Q5ZC4uNTc0ZDRmYSAxMDA2NDQKLS0tIGEvc3AxLWdwdS9jcmF0ZXMvcHJvdmVyX2NvbXBvbmVudHMvc3JjL2J1aWxkZXIucnMKKysrIGIvc3AxLWdwdS9jcmF0ZXMvcHJvdmVyX2NvbXBvbmVudHMvc3JjL2J1aWxkZXIucnMKQEAgLTIzLDI4ICsyMyw3NSBAQCB1c2UgY3JhdGU6OnsKICAgICBTUDFDdWRhUHJvdmVyQ29tcG9uZW50cywKIH07CiAKKy8vLyBJZ25ldW0gcHJvdmVyLWZsb29yIHBhdGNoICg1IE9jdG9iZXIgMjAyNikuIFVwc3RyZWFtIHNpemVzIGV2ZXJ5IGRldmljZSBidWZmZXIgZm9yIGEgMjQgR0IgY2FyZCBvciBsYXJnZXIKKy8vLyBhbmQgcGFuaWNzIGJlbG93IHRoYXQsIHdoYXRldmVyIHRoZSBzaGFyZC4gSGVyZSB0aGUgY2FyZCdzIG1lbW9yeSAob3IgYFNQMV9HUFVfTUVNT1JZX0JVREdFVF9HQmApIHBpY2tzIGEKKy8vLyB0aWVyLCBhbmQgYFNQMV9HUFVfRUxFTUVOVF9USFJFU0hPTERgIC8gYFNQMV9HUFVfUkVDVVJTSU9OX1RSQUNFX0FMTE9DQVRJT05gIHNldCB0aGUgdHdvIGJ1ZmZlcnMgZGlyZWN0bHkuCisvLy8gVGhlIHByb29mIGZvcm1hdCwgdGhlIHZlcmlmaWVyIGFuZCB0aGUgcHJvZ3JhbSBpZHMgZG8gbm90IGNoYW5nZTogdGhlIGVsZW1lbnQgdGhyZXNob2xkIG9ubHkgZGVjaWRlcyB3aGVyZQorLy8vIHRoZSBleGVjdXRvciBzcGxpdHMgc2hhcmRzLCBhcyB1cHN0cmVhbSdzIG93biAyNCBHQiB0aWVyIGFscmVhZHkgZG9lcy4KK2ZuIGVudl91c2l6ZShuYW1lOiAmc3RyKSAtPiBPcHRpb248dXNpemU+IHsKKyAgICBzdGQ6OmVudjo6dmFyKG5hbWUpLm9rKCkuYW5kX3RoZW4ofHN8IHMucGFyc2U6Ojx1c2l6ZT4oKS5vaygpKQorfQorCitmbiBlbnZfZjY0KG5hbWU6ICZzdHIpIC0+IE9wdGlvbjxmNjQ+IHsKKyAgICBzdGQ6OmVudjo6dmFyKG5hbWUpLm9rKCkuYW5kX3RoZW4ofHN8IHMucGFyc2U6OjxmNjQ+KCkub2soKSkKK30KKworLy8vIFRoZSBjb3JlIGVsZW1lbnQgdGhyZXNob2xkIGZvciBhIG1lbW9yeSBidWRnZXQgaW4gR0IgKHVwc3RyZWFtJ3Mgb3duIGZpZ3VyZSBmb3IgdGhlIGJ1ZGdldCwgKzQsIGFzIGl0CisvLy8gY29tcHV0ZWQgaXQ6IGEgMzIgR0IgY2FyZCBpcyAzNiwgYSAyNCBHQiBjYXJkIDI4LCBhIDE2IEdCIGNhcmQgMjAsIGEgMTIgR0IgY2FyZCAxNikuCitwdWIgZm4gZWxlbWVudF90aHJlc2hvbGRfZm9yX2J1ZGdldChncHVfbWVtb3J5X2diOiB1c2l6ZSwgZnVsbF9zaXplX3NoYXJkczogYm9vbCkgLT4gdTY0IHsKKyAgICBpZiBncHVfbWVtb3J5X2diID4gMzAgfHwgKGZ1bGxfc2l6ZV9zaGFyZHMgJiYgZ3B1X21lbW9yeV9nYiA+PSAyNCkgeworICAgICAgICBFTEVNRU5UX1RIUkVTSE9MRAorICAgIH0gZWxzZSBpZiBncHVfbWVtb3J5X2diID49IDI0IHsKKyAgICAgICAgRUxFTUVOVF9USFJFU0hPTEQgLSAoMSA8PCAyNikgLSAoMSA8PCAyNSkgLSAoMSA8PCAyNCkKKyAgICB9IGVsc2UgaWYgZ3B1X21lbW9yeV9nYiA+PSAxOCB7CisgICAgICAgICgxIDw8IDI3KSArICgxIDw8IDI2KQorICAgIH0gZWxzZSB7CisgICAgICAgIDEgPDwgMjcKKyAgICB9Cit9CisKKy8vLyBUaGUgcmVjdXJzaW9uIHRyYWNlIGFsbG9jYXRpb24gKGVsZW1lbnRzKSBmb3IgYSBtZW1vcnkgYnVkZ2V0LgorcHViIGZuIHJlY3Vyc2lvbl90cmFjZV9hbGxvY2F0aW9uX2Zvcl9idWRnZXQoZ3B1X21lbW9yeV9nYjogdXNpemUpIC0+IHVzaXplIHsKKyAgICBpZiBncHVfbWVtb3J5X2diID49IDI0IHsKKyAgICAgICAgUkVDVVJTSU9OX1RSQUNFX0FMTE9DQVRJT04KKyAgICB9IGVsc2UgeworICAgICAgICBSRUNVUlNJT05fVFJBQ0VfQUxMT0NBVElPTgorICAgIH0KK30KKworcHViIGZuIGdwdV9tZW1vcnlfZ2IoKSAtPiB1c2l6ZSB7CisgICAgbGV0IGdiID0gMTAyNC4wICogMTAyNC4wICogMTAyNC4wOworICAgIG1hdGNoIGVudl9mNjQoIlNQMV9HUFVfTUVNT1JZX0JVREdFVF9HQiIpIHsKKyAgICAgICAgU29tZShiKSA9PiAoYi5jZWlsKCkgYXMgdXNpemUpICsgNCwKKyAgICAgICAgTm9uZSA9PiAoKChjdWRhX21lbW9yeV9pbmZvKCkudW53cmFwKCkuMSBhcyBmNjQpIC8gZ2IpLmNlaWwoKSBhcyB1c2l6ZSkgKyA0LAorICAgIH0KK30KKworcHViIGZuIHJlY3Vyc2lvbl90cmFjZV9hbGxvY2F0aW9uKCkgLT4gdXNpemUgeworICAgIGVudl91c2l6ZSgiU1AxX0dQVV9SRUNVUlNJT05fVFJBQ0VfQUxMT0NBVElPTiIpCisgICAgICAgIC51bndyYXBfb3JfZWxzZSh8fCByZWN1cnNpb25fdHJhY2VfYWxsb2NhdGlvbl9mb3JfYnVkZ2V0KGdwdV9tZW1vcnlfZ2IoKSkpCit9CisKIHB1YiBmbiBsb2NhbF9ncHVfb3B0cygpIC0+IFNQMUNvcmVPcHRzIHsKICAgICBsZXQgbXV0IG9wdHMgPSBTUDFDb3JlT3B0czo6ZGVmYXVsdCgpOwogCiAgICAgbGV0IGxvZzJfc2hhcmRfc2l6ZSA9IDI0OwogICAgIG9wdHMuc2hhcmRfc2l6ZSA9IDEgPDwgbG9nMl9zaGFyZF9zaXplOwogCi0gICAgbGV0IGdiID0gMTAyNC4wICogMTAyNC4wICogMTAyNC4wOwotCi0gICAgLy8gR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IG9uIHRoZSBHUFUuCi0gICAgbGV0IGdwdV9tZW1vcnlfZ2I6IHVzaXplID0gKCgoY3VkYV9tZW1vcnlfaW5mbygpLnVud3JhcCgpLjEgYXMgZjY0KSAvIGdiKS5jZWlsKCkgYXMgdXNpemUpICsgNDsKLQotICAgIGlmIGdwdV9tZW1vcnlfZ2IgPCAyNCB7Ci0gICAgICAgIHBhbmljISgiVW5zdXBwb3J0ZWQgR1BVIG1lbW9yeToge2dwdV9tZW1vcnlfZ2J9LCBtdXN0IGJlIGF0IGxlYXN0IDI0R0IiKTsKLSAgICB9CisgICAgLy8gVGhlIGNhcmQncyBtZW1vcnkgcGx1cyA0LCBhcyB1cHN0cmVhbSBjb21wdXRlZCBpdCAoYSAzMiBHQiBjYXJkIHJlYWRzIDM2KSwgb3IgdGhlIGJ1ZGdldCBnaXZlbi4KKyAgICBsZXQgZ3B1X21lbW9yeV9nYiA9IGdwdV9tZW1vcnlfZ2IoKTsKIAotICAgIGxldCBzaGFyZF90aHJlc2hvbGQgPSBpZiAhb3B0cy5mdWxsX3NpemVfc2hhcmRzICYmIGdwdV9tZW1vcnlfZ2IgPD0gMzAgewotICAgICAgICBFTEVNRU5UX1RIUkVTSE9MRCAtICgxIDw8IDI2KSAtICgxIDw8IDI1KSAtICgxIDw8IDI0KQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEVMRU1FTlRfVEhSRVNIT0xECisgICAgbGV0IHNoYXJkX3RocmVzaG9sZCA9IG1hdGNoIGVudl91c2l6ZSgiU1AxX0dQVV9FTEVNRU5UX1RIUkVTSE9MRCIpIHsKKyAgICAgICAgU29tZSh0KSA9PiB0IGFzIHU2NCwKKyAgICAgICAgTm9uZSA9PiBlbGVtZW50X3RocmVzaG9sZF9mb3JfYnVkZ2V0KGdwdV9tZW1vcnlfZ2IsIG9wdHMuZnVsbF9zaXplX3NoYXJkcyksCiAgICAgfTsKKyAgICBsZXQgaGVpZ2h0X3RocmVzaG9sZCA9IG9wdHMuc2hhcmRpbmdfdGhyZXNob2xkLmhlaWdodF90aHJlc2hvbGQ7CiAKLSAgICB0cmFjaW5nOjpkZWJ1ZyEoIlNoYXJkIHRocmVzaG9sZDoge3NoYXJkX3RocmVzaG9sZH0iKTsKKyAgICBlcHJpbnRsbiEoCisgICAgICAgICJGTE9PUiBvcHRzIGdwdV9tZW1vcnlfZ2I9e2dwdV9tZW1vcnlfZ2J9IGVsZW1lbnRfdGhyZXNob2xkPXtzaGFyZF90aHJlc2hvbGR9IGhlaWdodF90aHJlc2hvbGQ9e2hlaWdodF90aHJlc2hvbGR9IHJlY3Vyc2lvbl90cmFjZV9hbGxvY2F0aW9uPXt9IGZ1bGxfc2l6ZV9zaGFyZHM9e30iLAorICAgICAgICByZWN1cnNpb25fdHJhY2VfYWxsb2NhdGlvbigpLAorICAgICAgICBvcHRzLmZ1bGxfc2l6ZV9zaGFyZHMKKyAgICApOwogICAgIG9wdHMuc2hhcmRpbmdfdGhyZXNob2xkLmVsZW1lbnRfdGhyZXNob2xkID0gc2hhcmRfdGhyZXNob2xkOwogCiAgICAgb3B0cy5nbG9iYWxfZGVwZW5kZW5jaWVzX29wdCA9IHRydWU7CkBAIC05Miw3ICsxMzksNyBAQCBwdWIgYXN5bmMgZm4gcmVjdXJzaW9uX3Byb3Zlcl9hbmRfdmVyaWZpZXIoCiApIHsKICAgICBsZXQgcmVjdXJzaW9uX3ZlcmlmaWVyID0gU1AxQ3VkYVByb3ZlckNvbXBvbmVudHM6OmNvbXByZXNzX3ZlcmlmaWVyKCk7CiAgICAgKAotICAgICAgICBuZXdfY3VkYV9wcm92ZXIoJnJlY3Vyc2lvbl92ZXJpZmllciwgUkVDVVJTSU9OX1RSQUNFX0FMTE9DQVRJT04sIDQsIGZhbHNlLCBmYWxzZSwgc2NvcGUpCisgICAgICAgIG5ld19jdWRhX3Byb3ZlcigmcmVjdXJzaW9uX3ZlcmlmaWVyLCByZWN1cnNpb25fdHJhY2VfYWxsb2NhdGlvbigpLCA0LCBmYWxzZSwgZmFsc2UsIHNjb3BlKQogICAgICAgICAgICAgLmF3YWl0LAogICAgICAgICByZWN1cnNpb25fdmVyaWZpZXIsCiAgICAgKQpkaWZmIC0tZ2l0IGEvc3AxLWdwdS9jcmF0ZXMvc2VydmVyL3NyYy9zZXJ2ZXIucnMgYi9zcDEtZ3B1L2NyYXRlcy9zZXJ2ZXIvc3JjL3NlcnZlci5ycwppbmRleCA0MDM1ZjFmLi4wZDBkOTA3IDEwMDY0NAotLS0gYS9zcDEtZ3B1L2NyYXRlcy9zZXJ2ZXIvc3JjL3NlcnZlci5ycworKysgYi9zcDEtZ3B1L2NyYXRlcy9zZXJ2ZXIvc3JjL3NlcnZlci5ycwpAQCAtMTU3LDYgKzE1Nyw3IEBAIGltcGwgU2VydmVyIHsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIGxldCBwayA9IENhY2hlZFByb2dyYW0geyBlbGY6IEFyYzo6bmV3KEVsZjo6RHluYW1pYyhlbGYuaW50bygpKSksIHZrOiB2ay5jbG9uZSgpIH07CiAgICAgICAgICAgICAgICAgY3R4LnBrX2NhY2hlLmluc2VydChlbGZfaGFzaCwgcGspOworICAgICAgICAgICAgICAgIGZsb29yX21lbW9yeV9saW5lKCJhZnRlciBzZXR1cCIpOwogICAgICAgICAgICAgICAgIFJlc3BvbnNlOjpTZXR1cCB7IGlkOiBlbGZfaGFzaCwgdmsgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgUmVxdWVzdDo6RGVzdHJveSB7IGtleSB9ID0+IHsKQEAgLTE3NywxNSArMTc4LDMxIEBAIGltcGwgU2VydmVyIHsKICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIGxldCBjb250ZXh0ID0gU1AxQ29udGV4dDo6YnVpbGRlcigpLnByb29mX25vbmNlKHByb29mX25vbmNlKS5idWlsZCgpOwotICAgICAgICAgICAgICAgIG1hdGNoIHByb3Zlci5wcm92ZV93aXRoX21vZGUoJmNhY2hlZC5lbGYsIHN0ZGluLCBjb250ZXh0LCBtb2RlKS5hd2FpdCB7CisgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ZWQgPSBzdGQ6OnRpbWU6Okluc3RhbnQ6Om5vdygpOworICAgICAgICAgICAgICAgIGxldCByZXNwb25zZSA9IG1hdGNoIHByb3Zlci5wcm92ZV93aXRoX21vZGUoJmNhY2hlZC5lbGYsIHN0ZGluLCBjb250ZXh0LCBtb2RlKS5hd2FpdCB7CiAgICAgICAgICAgICAgICAgICAgIE9rKHByb29mKSA9PiBSZXNwb25zZTo6UHJvb2YgeyBwcm9vZiB9LAogICAgICAgICAgICAgICAgICAgICBFcnIoZSkgPT4gUmVzcG9uc2U6OlByb3ZlckVycm9yKGUudG9fc3RyaW5nKCkpLAotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGZsb29yX21lbW9yeV9saW5lKCZmb3JtYXQhKCJhZnRlciBwcm92ZSB7Oj99IGluIHs6LjF9IHMiLCBtb2RlLCBzdGFydGVkLmVsYXBzZWQoKS5hc19zZWNzX2Y2NCgpKSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAorLy8vIElnbmV1bSBwcm92ZXItZmxvb3IgcGF0Y2g6IHRoZSBkZXZpY2UgbWVtb3J5IGluIHVzZSAodG90YWwgbWludXMgZnJlZSwgYXMgdGhlIGRyaXZlciByZXBvcnRzIGl0KSBhdCB0aGUKKy8vLyBwb2ludHMgdGhhdCBib3VuZCBhIHByb29mLCBzbyBhIHJ1bidzIGxvZyBjYXJyaWVzIHRoZSB0ZXJtcyBvZiB0aGUgcGVhayB3aXRob3V0IGEgc2FtcGxlci4KK2ZuIGZsb29yX21lbW9yeV9saW5lKHdoYXQ6ICZzdHIpIHsKKyAgICBpZiBsZXQgT2soKGZyZWUsIHRvdGFsKSkgPSBzcDFfZ3B1X2N1ZGFydDo6Y3VkYV9tZW1vcnlfaW5mbygpIHsKKyAgICAgICAgZXByaW50bG4hKAorICAgICAgICAgICAgIkZMT09SIG1lbW9yeSB7d2hhdH06IGRldmljZV91c2VkX21pYj17fSBmcmVlX21pYj17fSB0b3RhbF9taWI9e30iLAorICAgICAgICAgICAgKHRvdGFsIC0gZnJlZSkgPj4gMjAsCisgICAgICAgICAgICBmcmVlID4+IDIwLAorICAgICAgICAgICAgdG90YWwgPj4gMjAKKyAgICAgICAgKTsKKyAgICB9Cit9CisKIGZuIHNoYTI1NihkYXRhOiAmW3U4XSkgLT4gW3U4OyAzMl0gewogICAgIHVzZSBzaGEyOjp7RGlnZXN0LCBTaGEyNTZ9OwogICAgIGxldCBtdXQgaGFzaGVyID0gU2hhMjU2OjpuZXcoKTsK' [IO.File]::WriteAllBytes((Join-Path $job 'floor.patch'), [Convert]::FromBase64String($patchB64)) $patchW = WslPath (Join-Path $job 'floor.patch') $bash = @' @@ -19,7 +19,7 @@ export CUDA_PATH="$CUDA_DIR" CUDACXX="$CUDA_DIR/bin/nvcc" PATH="$CUDA_DIR/bin:$P stamp() { date -u +%Y-%m-%dT%H:%M:%SZ; } FLOOR=/opt/igneum-floor; SRC=$FLOOR/sp1; mkdir -p $FLOOR/bin $FLOOR/home/.sp1/bin $FLOOR/logs PATCH="PATCH_PATH_PLACEHOLDER" -echo "RESULT patch_sha256 $(sha256sum "$PATCH" | cut -c1-64) expected 3f9d3ab0845b08c01683038765db07a9293aeb03360c45dc5cba5a8c607bed8a" +echo "RESULT patch_sha256 $(sha256sum "$PATCH" | cut -c1-64) expected e81cb0d03b291f9fd4bf0a109d6da2d7c897795c9ffd7f797c0ddce723eee2b1" echo "RESULT toolchain nvcc=$(nvcc --version | grep -o 'release [0-9.]*') cargo=$(cargo --version) go=$(go version 2>/dev/null || echo MISSING) protoc=$(protoc --version 2>/dev/null || echo MISSING) cmake=$(cmake --version 2>/dev/null | head -1 || echo MISSING) nproc=$(nproc) disk_avail=$(df -BG /opt | awk 'NR==2 {print $4}')" if [ ! -d "$SRC/.git" ]; then echo "STAGE clone $(stamp)" diff --git a/tools/prover-floor/pc2-floor-core2-miner.ps1 b/tools/prover-floor/pc2-floor-core2-miner.ps1 new file mode 100644 index 000000000..69f9221b0 --- /dev/null +++ b/tools/prover-floor/pc2-floor-core2-miner.ps1 @@ -0,0 +1,95 @@ +# Route 2, second round, beside the miner (publish WITHOUT --stop-miners): core-only at 2^25 and 2^24, and the pool release threshold 0 (v4 server). +# Prover floor (5 October 2026): the peak GPU memory and the time of one compressed shard proof through the PATCHED +# sp1-gpu-server (/opt/igneum-floor/home/.sp1/bin, reached by HOME=/opt/igneum-floor/home: the SDK spawns the +# server it finds under $HOME/.sp1/bin, sp1-cuda-6.8.1/src/server.rs) on PC 2's RTX 5090, the miners STOPPED by the +# job (--stop-miners) and the live prover switched off for the run (its server would otherwise own the socket). +# Every point: every server killed and its socket unlinked, a 1-s nvidia-smi sampler, one `--mode compressed +# --shard 0` of the pv1 host (/opt/igneum-pv1, the UNPATCHED SDK and verifier: its VERIFIED is the unpatched +# verifier's word on the patched server's proof), the peak, the time, the FLOOR lines the server prints. +# The point list comes from the FLOOR_POINTS environment the job carries, else the default sweep below. +$ErrorActionPreference = 'Continue' +$urlFile = if ($env:IGNEUM_APP_DIR) { Join-Path $env:IGNEUM_APP_DIR 'app.url' } else { Join-Path $env:LOCALAPPDATA 'igneum\app\app.url' } +if (-not (Test-Path $urlFile)) { $urlFile = Join-Path $env:LOCALAPPDATA 'igneum\app\app.url' } +$base = (Get-Content $urlFile -Raw).Trim().TrimEnd('/') +function Stamp { (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ') } +function Prove($on) { try { (Invoke-RestMethod -Method Post -Uri "$base/api/prove" -ContentType 'application/json' -Body (@{on=$on} | ConvertTo-Json -Compress) -TimeoutSec 10) | ConvertTo-Json -Compress } catch { "error: $_" } } +"RESULT start $(Stamp) prover off for the run: $(Prove $false)" +Start-Sleep -Seconds 45 +"RESULT gpus $(Stamp) $((& nvidia-smi --query-gpu=index,name,memory.used,memory.total,utilization.gpu,power.draw --format=csv,noheader,nounits 2>$null) -join ' | ')" +$job = $env:IGNEUM_JOB_DIR; if (-not $job) { $job = Join-Path $env:TEMP 'igneum-floor-measure' }; New-Item -ItemType Directory -Force -Path $job | Out-Null +function WslPath($p) { $w = (& wsl.exe -d Ubuntu-24.04 -u root -- wslpath -a ($p -replace '\\', '/') 2>$null); if ($w) { ($w -replace "`0", '').Trim() } else { '/mnt/c' + ($p.Substring(2) -replace '\\', '/') } } +$jobW = WslPath $job +# The empty live shard is a kit left by the chain job (the wiped-jobs-folder class: an app update may clear it), so +# its presence is tested first; when it is gone the EMPTY points report measure_failed rows instead of killing the run. +$emptyPath = Join-Path $env:LOCALAPPDATA 'igneum\app\jobs\chain-pc2-pv1c\block-83616.json' +if (Test-Path $emptyPath) { $emptyW = WslPath $emptyPath; "RESULT empty_fixture present $emptyPath" } else { $emptyW = '/nonexistent/block-83616.json'; "RESULT empty_fixture MISSING (kit wiped): the EMPTY points will report measure_failed" } +$points = if ($env:FLOOR_POINTS) { $env:FLOOR_POINTS } else { 'runshard ce25 "$V1" SP1_GPU_ELEMENT_THRESHOLD=33554432;runshard ce25 "$EMPTY" SP1_GPU_ELEMENT_THRESHOLD=33554432;runshard ce24 "$V1" SP1_GPU_ELEMENT_THRESHOLD=16777216;runshard ce26r0 "$V1" SP1_GPU_ELEMENT_THRESHOLD=67108864 SP1_GPU_MEM_RELEASE_THRESHOLD=0;runshard ce25r0 "$V1" SP1_GPU_ELEMENT_THRESHOLD=33554432 SP1_GPU_MEM_RELEASE_THRESHOLD=0' } +$bash = @' +set -uo pipefail +export PATH="$HOME/.cargo/bin:$PATH" +CUDA_DIR="$(ls -d /usr/local/cuda-12.* 2>/dev/null | sort -V | tail -1 || true)"; [ -n "$CUDA_DIR" ] && export PATH="$CUDA_DIR/bin:$PATH" && export LD_LIBRARY_PATH="$CUDA_DIR/lib64:/usr/lib/wsl/lib:${LD_LIBRARY_PATH:-}" +stamp() { date -u +%Y-%m-%dT%H:%M:%SZ; } +JOB='JOBW_PLACEHOLDER'; H=/opt/igneum-pv1/igneum-prove-host; FX="/root/igneum-prove-pv1/proving/fixtures" +FLOORHOME=/opt/igneum-floor/home; SRV=$FLOORHOME/.sp1/bin/sp1-gpu-server +EMPTY='EMPTY_PLACEHOLDER'; V1="$FX/fees-v1-shards2.json"; FULL="$FX/block-338-shard1.json"; ONE="$FX/block-56-transfers.json" +[ -x "$SRV" ] || { echo "RESULT measure_failed no patched server at $SRV"; exit 2; } +[ -x "$H" ] || { echo "RESULT measure_failed no pv1 host at $H"; exit 2; } +echo "RESULT patched_server sha256=$(sha256sum $SRV | cut -c1-64) version=$($SRV --version 2>/dev/null) host=$(sha256sum $H | cut -c1-16)" +echo "RESULT live_server sha256=$(sha256sum /root/.sp1/bin/sp1-gpu-server | cut -c1-16) untouched" +pkill -f sp1-gpu-server 2>/dev/null; sleep 2; rm -f /tmp/sp1-cuda-*.sock +echo "RESULT idle_mib $(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits | head -1)" +run() { # name fixture env... + local name="$1" fx="$2"; shift 2 + local tag="$name-$(basename $fx .json)" + pkill -f sp1-gpu-server 2>/dev/null; sleep 2; rm -f /tmp/sp1-cuda-*.sock + local csv="$JOB/smi-$tag.csv" log="$JOB/log-$tag.txt" + nvidia-smi --query-gpu=timestamp,memory.used,utilization.gpu --format=csv,noheader,nounits -l 1 > "$csv" 2>/dev/null & + local SMI=$! + local t0=$(date +%s) + env HOME=$FLOORHOME SP1_PROVER=cuda RUST_LOG=off SP1_GPU_FLOOR_LOG=1 "$@" $H "$fx" --mode compressed --shard 0 --out "$JOB/res-$tag.json" > "$log" 2>&1 + local rc=$? + local wall=$(( $(date +%s) - t0 )) + pkill -f sp1-gpu-server 2>/dev/null; sleep 1; kill $SMI 2>/dev/null; sleep 1; rm -f /tmp/sp1-cuda-*.sock + local peak=$(awk -F', *' '{ if ($2+0 > m) m=$2+0 } END { print m+0 }' "$csv") + local n=$(wc -l < "$csv") + local line=$(grep -E "^RESULT compressed shard" "$log" | tail -1 | sed -E 's/.*prove ([0-9.]+) s, proof ([0-9]+) bytes, verify ([0-9.]+) s, ([A-Z ]+);.*/prove_s=\1 bytes=\2 verify_s=\3 \4/') + local cyc=$(grep -E "^RESULT execute shard" "$log" | tail -1 | sed -E 's/.*: ([0-9]+) cycles.*/\1/') + local err=$(grep -iE "error|panick|out of memory|OOM|unsupported" "$log" | grep -v "^FLOOR" | head -1 | cut -c1-200) + echo "RESULT floor cfg=$name fixture=$(basename $fx .json) peak_mib=$peak samples=$n wall_s=$wall cycles=${cyc:-na} ${line:-no_result} exit=$rc env='$*' ${err:+err=$err}" + grep -E "^FLOOR" "$log" | sed "s/^/RESULT floorline cfg=$name fixture=$(basename $fx .json) /" | head -40 +} +runshard() { # name fixture env... (--mode shard: core then compressed; the core-phase peak read from the sampler by time) + local name="$1" fx="$2"; shift 2 + local tag="$name-$(basename $fx .json)" + pkill -f sp1-gpu-server 2>/dev/null; sleep 2; rm -f /tmp/sp1-cuda-*.sock + local csv="$JOB/smi-$tag.csv" log="$JOB/log-$tag.txt" + nvidia-smi --query-gpu=timestamp,memory.used,utilization.gpu --format=csv,noheader,nounits -l 1 > "$csv" 2>/dev/null & + local SMI=$! + local t0=$(date +%s) + env HOME=$FLOORHOME SP1_PROVER=cuda RUST_LOG=off SP1_GPU_FLOOR_LOG=1 "$@" $H "$fx" --mode shard --shard 0 --out "$JOB/res-$tag.json" > "$log" 2>&1 + local rc=$? + local wall=$(( $(date +%s) - t0 )) + pkill -f sp1-gpu-server 2>/dev/null; sleep 1; kill $SMI 2>/dev/null; sleep 1; rm -f /tmp/sp1-cuda-*.sock + local n=$(wc -l < "$csv") + local core=$(grep -E "^RESULT core shard" "$log" | tail -1) + local comp=$(grep -E "^RESULT compressed shard" "$log" | tail -1) + local cyc=$(grep -E "^RESULT execute shard" "$log" | tail -1 | sed -E 's/.*: ([0-9]+) cycles.*/\1/') + local core_at=$(echo "$core" | sed -E 's/.* at ([0-9T:.-]+Z?)$/\1/'); local core_epoch=$(date -u -d "${core_at}" +%s 2>/dev/null || echo 0) + local split=$(( core_epoch - t0 )); [ $split -lt 1 ] && split=$n + local corepeak=$(awk -F', *' -v s=$split 'NR<=s+1 { if ($2+0 > m) m=$2+0 } END { print m+0 }' "$csv") + local peak=$(awk -F', *' '{ if ($2+0 > m) m=$2+0 } END { print m+0 }' "$csv") + local cl=$(echo "$core" | sed -E 's/.*prove ([0-9.]+) s, proof ([0-9]+) bytes, verify ([0-9.]+) s, ([A-Z ]+);.*/core_s=\1 core_bytes=\2 core_verify_s=\3 core_\4/') + local pl=$(echo "$comp" | sed -E 's/.*prove ([0-9.]+) s, proof ([0-9]+) bytes, verify ([0-9.]+) s, ([A-Z ]+);.*/compressed_s=\1 compressed_bytes=\2 compressed_verify_s=\3 compressed_\4/') + local err=$(grep -iE "error|panick|out of memory|OOM|unsupported" "$log" | grep -v "^FLOOR" | head -1 | cut -c1-200) + echo "RESULT core cfg=$name fixture=$(basename $fx .json) core_peak_mib=$corepeak full_peak_mib=$peak split_s=$split samples=$n wall_s=$wall cycles=${cyc:-na} ${cl:-no_core_result} ${pl:-no_compressed_result} exit=$rc env='$*' ${err:+err=$err}" + grep -E "^FLOOR (memory|opts|grow)" "$log" | sed "s/^/RESULT floorline cfg=$name fixture=$(basename $fx .json) /" | head -12 +} +POINTS_PLACEHOLDER_BASH +pkill -f sp1-gpu-server 2>/dev/null; sleep 1; rm -f /tmp/sp1-cuda-*.sock +echo "RESULT measure_end $(stamp)" +'@ +$bash = $bash.Replace('JOBW_PLACEHOLDER', $jobW).Replace('EMPTY_PLACEHOLDER', $emptyW).Replace('POINTS_PLACEHOLDER_BASH', ($points -replace ';', "`n")) +$bashFile = Join-Path $job 'measure.sh' +[IO.File]::WriteAllText($bashFile, ($bash -replace "`r`n", "`n"), (New-Object System.Text.UTF8Encoding $false)) +& wsl.exe -d Ubuntu-24.04 -u root -- bash (WslPath $bashFile) 2>&1 | ForEach-Object { ($_ -replace "`0", '') } +"RESULT end $(Stamp) prover back on: $(Prove $true)" diff --git a/tools/prover-floor/points-core2.txt b/tools/prover-floor/points-core2.txt new file mode 100644 index 000000000..15b435639 --- /dev/null +++ b/tools/prover-floor/points-core2.txt @@ -0,0 +1,5 @@ +runshard ce25 "$V1" SP1_GPU_ELEMENT_THRESHOLD=33554432 +runshard ce25 "$EMPTY" SP1_GPU_ELEMENT_THRESHOLD=33554432 +runshard ce24 "$V1" SP1_GPU_ELEMENT_THRESHOLD=16777216 +runshard ce26r0 "$V1" SP1_GPU_ELEMENT_THRESHOLD=67108864 SP1_GPU_MEM_RELEASE_THRESHOLD=0 +runshard ce25r0 "$V1" SP1_GPU_ELEMENT_THRESHOLD=33554432 SP1_GPU_MEM_RELEASE_THRESHOLD=0