From cef527a03a6150f41ce1c65d6ef6c356689b4bd5 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Fri, 2 Feb 2024 18:16:58 -0800 Subject: [PATCH 001/135] Remove pre-commit artifacts --- .pre-commit.stashsIsbN1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .pre-commit.stashsIsbN1 diff --git a/.pre-commit.stashsIsbN1 b/.pre-commit.stashsIsbN1 deleted file mode 100644 index e69de29bb..000000000 From 1cb66038c7fa74890aa0f28bf67cd72ba5013520 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Sun, 4 Feb 2024 14:53:23 -0800 Subject: [PATCH 002/135] Kill Arc inside Context::Inner Turns out we don't need it --- ipa-core/src/protocol/context/mod.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/ipa-core/src/protocol/context/mod.rs b/ipa-core/src/protocol/context/mod.rs index 48b1efec9..1fa7ffd0f 100644 --- a/ipa-core/src/protocol/context/mod.rs +++ b/ipa-core/src/protocol/context/mod.rs @@ -4,7 +4,7 @@ pub mod semi_honest; pub mod upgrade; pub mod validator; -use std::{num::NonZeroUsize, sync::Arc}; +use std::num::NonZeroUsize; use async_trait::async_trait; pub use malicious::{Context as MaliciousContext, Upgraded as UpgradedMaliciousContext}; @@ -152,9 +152,7 @@ pub trait SpecialAccessToUpgradedContext: UpgradedContext /// honest-but-curious adversary parties. #[derive(Clone)] pub struct Base<'a> { - /// TODO (alex): Arc is required here because of the `TestWorld` structure. Real world - /// may operate with raw references and be more efficient - inner: Arc>, + inner: Inner<'a>, gate: Gate, total_records: TotalRecords, } @@ -197,7 +195,7 @@ impl<'a> Context for Base<'a> { Gate: StepNarrow, { Self { - inner: Arc::clone(&self.inner), + inner: self.inner.clone(), gate: self.gate.narrow(step), total_records: self.total_records, } @@ -205,7 +203,7 @@ impl<'a> Context for Base<'a> { fn set_total_records>(&self, total_records: T) -> Self { Self { - inner: Arc::clone(&self.inner), + inner: self.inner.clone(), gate: self.gate.clone(), total_records: self.total_records.overwrite(total_records), } @@ -253,14 +251,15 @@ impl<'a> SeqJoin for Base<'a> { } } +#[derive(Clone)] struct Inner<'a> { pub prss: &'a PrssEndpoint, pub gateway: &'a Gateway, } impl<'a> Inner<'a> { - fn new(prss: &'a PrssEndpoint, gateway: &'a Gateway) -> Arc { - Arc::new(Self { prss, gateway }) + fn new(prss: &'a PrssEndpoint, gateway: &'a Gateway) -> Self { + Self { prss, gateway } } } From 0ae70398556870ede992c5b348e2efcd6c365067 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Sun, 4 Feb 2024 15:43:31 -0800 Subject: [PATCH 003/135] Fix Arc imports --- ipa-core/src/helpers/transport/in_memory/transport.rs | 2 +- ipa-core/src/net/server/handlers/query/prepare.rs | 3 +-- ipa-core/src/net/server/handlers/query/results.rs | 3 +-- ipa-core/src/net/server/handlers/query/status.rs | 3 +-- ipa-core/src/protocol/context/mod.rs | 3 ++- ipa-core/src/query/executor.rs | 2 +- ipa-core/src/query/processor.rs | 2 +- 7 files changed, 8 insertions(+), 10 deletions(-) diff --git a/ipa-core/src/helpers/transport/in_memory/transport.rs b/ipa-core/src/helpers/transport/in_memory/transport.rs index 72b5f3782..a0fffa0f1 100644 --- a/ipa-core/src/helpers/transport/in_memory/transport.rs +++ b/ipa-core/src/helpers/transport/in_memory/transport.rs @@ -5,7 +5,6 @@ use std::{ fmt::{Debug, Formatter}, io, pin::Pin, - sync::{Arc, Weak}, task::{Context, Poll}, }; @@ -29,6 +28,7 @@ use crate::{ StepBinding, StreamCollection, Transport, TransportCallbacks, }, protocol::{step::Gate, QueryId}, + sync::{Arc, Weak}, }; type Packet = (Addr, InMemoryStream, oneshot::Sender>); diff --git a/ipa-core/src/net/server/handlers/query/prepare.rs b/ipa-core/src/net/server/handlers/query/prepare.rs index 7e3ee711a..32a71a662 100644 --- a/ipa-core/src/net/server/handlers/query/prepare.rs +++ b/ipa-core/src/net/server/handlers/query/prepare.rs @@ -1,11 +1,10 @@ -use std::sync::Arc; - use axum::{response::IntoResponse, routing::post, Extension, Router}; use hyper::StatusCode; use crate::{ net::{http_serde, server::ClientIdentity, HttpTransport}, query::PrepareQueryError, + sync::Arc, }; /// Called by whichever peer helper is the leader for an individual query, to initiatialize diff --git a/ipa-core/src/net/server/handlers/query/results.rs b/ipa-core/src/net/server/handlers/query/results.rs index 9773fa9c9..b974b8383 100644 --- a/ipa-core/src/net/server/handlers/query/results.rs +++ b/ipa-core/src/net/server/handlers/query/results.rs @@ -1,11 +1,10 @@ -use std::sync::Arc; - use axum::{routing::get, Extension, Router}; use hyper::StatusCode; use crate::{ helpers::Transport, net::{http_serde, server::Error, HttpTransport}, + sync::Arc, }; /// Handles the completion of the query by blocking the sender until query is completed. diff --git a/ipa-core/src/net/server/handlers/query/status.rs b/ipa-core/src/net/server/handlers/query/status.rs index 7c067e0cb..43608644e 100644 --- a/ipa-core/src/net/server/handlers/query/status.rs +++ b/ipa-core/src/net/server/handlers/query/status.rs @@ -1,11 +1,10 @@ -use std::sync::Arc; - use axum::{routing::get, Extension, Json, Router}; use hyper::StatusCode; use crate::{ helpers::Transport, net::{http_serde::query::status, server::Error, HttpTransport}, + sync::Arc, }; async fn handler( diff --git a/ipa-core/src/protocol/context/mod.rs b/ipa-core/src/protocol/context/mod.rs index 48b1efec9..09fa60ccc 100644 --- a/ipa-core/src/protocol/context/mod.rs +++ b/ipa-core/src/protocol/context/mod.rs @@ -4,7 +4,7 @@ pub mod semi_honest; pub mod upgrade; pub mod validator; -use std::{num::NonZeroUsize, sync::Arc}; +use std::num::NonZeroUsize; use async_trait::async_trait; pub use malicious::{Context as MaliciousContext, Upgraded as UpgradedMaliciousContext}; @@ -27,6 +27,7 @@ use crate::{ SecretSharing, }, seq_join::SeqJoin, + sync::Arc, }; /// Context used by each helper to perform secure computation. Provides access to shared randomness diff --git a/ipa-core/src/query/executor.rs b/ipa-core/src/query/executor.rs index ee7552c69..5244c6c22 100644 --- a/ipa-core/src/query/executor.rs +++ b/ipa-core/src/query/executor.rs @@ -2,7 +2,6 @@ use std::{ fmt::Debug, future::{ready, Future}, pin::Pin, - sync::Arc, }; use ::tokio::sync::oneshot; @@ -33,6 +32,7 @@ use crate::{ runner::{IpaQuery, OprfIpaQuery, QueryResult, SparseAggregateQuery}, state::RunningQuery, }, + sync::Arc, }; pub trait Result: Send + Debug { diff --git a/ipa-core/src/query/processor.rs b/ipa-core/src/query/processor.rs index aff339676..18b46efa3 100644 --- a/ipa-core/src/query/processor.rs +++ b/ipa-core/src/query/processor.rs @@ -1,7 +1,6 @@ use std::{ collections::hash_map::Entry, fmt::{Debug, Formatter}, - sync::Arc, }; use futures::{future::try_join, stream}; @@ -19,6 +18,7 @@ use crate::{ state::{QueryState, QueryStatus, RemoveQuery, RunningQueries, StateError}, CompletionHandle, ProtocolResult, }, + sync::Arc, }; /// `Processor` accepts and tracks requests to initiate new queries on this helper party From 3b336df9bc0b5b7da48d938d35b64987f718df96 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Sun, 4 Feb 2024 16:00:21 -0800 Subject: [PATCH 004/135] Clean up GH runners for CodeCov and Sanitize actions We've started getting "no space left on device" [errors](https://github.com/private-attribution/ipa/actions/runs/7777348395/job/21205786323?pr=939) for these actions --- .github/workflows/check.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 6cc659bd0..ebe1a358e 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -156,6 +156,7 @@ jobs: TARGET: x86_64-unknown-linux-gnu steps: - uses: actions/checkout@v3 + - uses: ./.github/actions/rm - uses: dtolnay/rust-toolchain@nightly - name: Add Rust sources run: rustup component add rust-src @@ -168,6 +169,7 @@ jobs: TARGET: x86_64-unknown-linux-gnu steps: - uses: actions/checkout@v3 + - uses: ./.github/actions/rm - uses: dtolnay/rust-toolchain@nightly - name: Add Miri run: rustup component add miri @@ -184,6 +186,7 @@ jobs: uses: actions/checkout@v4 with: persist-credentials: false + - uses: ./.github/actions/rm - name: Install rust toolchain uses: dtolnay/rust-toolchain@stable From 8c073f7fb2cb981a98fc824de5da214dcc33fe6d Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Tue, 6 Feb 2024 12:43:48 -0800 Subject: [PATCH 005/135] Fix unused imports --- ipa-core/src/protocol/context/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/ipa-core/src/protocol/context/mod.rs b/ipa-core/src/protocol/context/mod.rs index 3cc0b2d49..1fa7ffd0f 100644 --- a/ipa-core/src/protocol/context/mod.rs +++ b/ipa-core/src/protocol/context/mod.rs @@ -27,7 +27,6 @@ use crate::{ SecretSharing, }, seq_join::SeqJoin, - sync::Arc, }; /// Context used by each helper to perform secure computation. Provides access to shared randomness From 4d25ab4bff2225ae5c42e84012c6ff5204a088f0 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Tue, 6 Feb 2024 16:24:48 -0800 Subject: [PATCH 006/135] Use checkout@v4 action in CI consistently checkout@v3 triggers a warning: https://github.com/private-attribution/ipa/actions/runs/7777716103 --- .github/workflows/check.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index ebe1a358e..292e0d89f 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -31,7 +31,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/rm - uses: dtolnay/rust-toolchain@stable @@ -78,7 +78,7 @@ jobs: env: RUSTFLAGS: -C target-cpu=native steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/rm - uses: dtolnay/rust-toolchain@stable @@ -112,7 +112,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/rm - uses: dtolnay/rust-toolchain@stable @@ -155,7 +155,7 @@ jobs: env: TARGET: x86_64-unknown-linux-gnu steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/rm - uses: dtolnay/rust-toolchain@nightly - name: Add Rust sources @@ -168,7 +168,7 @@ jobs: env: TARGET: x86_64-unknown-linux-gnu steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/rm - uses: dtolnay/rust-toolchain@nightly - name: Add Miri From b7ff81ff097b39c202f2d38f5c48dc79301170ba Mon Sep 17 00:00:00 2001 From: Richa Jain Date: Wed, 7 Feb 2024 14:04:47 +0800 Subject: [PATCH 007/135] Fix collect_steps DEPTH_DYNAMIC_STEPS string --- ipa-core/src/protocol/step/steps.txt | 1210 ++++++++++++++++++++++++++ scripts/collect_steps.py | 2 +- 2 files changed, 1211 insertions(+), 1 deletion(-) diff --git a/ipa-core/src/protocol/step/steps.txt b/ipa-core/src/protocol/step/steps.txt index ab8e9a427..19dc96b52 100644 --- a/ipa-core/src/protocol/step/steps.txt +++ b/ipa-core/src/protocol/step/steps.txt @@ -6,12 +6,78 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attrib ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit @@ -21,6 +87,15 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attrib ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::accumulate_credit::Step::active_bit_times_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth0 @@ -29,12 +104,78 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attrib ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit @@ -44,6 +185,15 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attrib ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::compare_bit_times_trigger_value ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::initialize_time_delta ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition @@ -430,14 +580,102 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attrib ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit @@ -450,6 +688,18 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attrib ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_current_exceeds_cap_or_else ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_next_event_has_same_match_key_or_else ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_next_exceeds_cap_or_else @@ -535,14 +785,102 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attrib ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit @@ -555,6 +893,18 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attrib ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_times_helper_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::random_bits_generator::FallbackStep::fallback @@ -1317,6 +1667,76 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply @@ -1324,6 +1744,76 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply @@ -1331,6 +1821,20 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply @@ -1350,6 +1854,29 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::accumulate_credit::Step::active_bit_times_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::accumulate_credit::Step::active_bit_times_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::accumulate_credit::Step::active_bit_times_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation @@ -1368,6 +1895,76 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply @@ -1375,6 +1972,76 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply @@ -1382,6 +2049,20 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply @@ -1401,6 +2082,29 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::compare_bit_times_trigger_value ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::compare_bit_times_trigger_value/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::compare_bit_times_trigger_value/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation @@ -2208,6 +2912,8 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation @@ -2224,6 +2930,106 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply @@ -2234,6 +3040,106 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply @@ -2244,6 +3150,26 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply @@ -2272,6 +3198,38 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_current_exceeds_cap_or_else ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_current_exceeds_cap_or_else/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_current_exceeds_cap_or_else/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation @@ -2509,6 +3467,106 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply @@ -2519,6 +3577,106 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply @@ -2529,6 +3687,26 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4 ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply @@ -2557,6 +3735,38 @@ ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::contex ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9 +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply +ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_times_helper_bit ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_times_helper_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_times_helper_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation diff --git a/scripts/collect_steps.py b/scripts/collect_steps.py index 116cf7c86..648b0c71e 100755 --- a/scripts/collect_steps.py +++ b/scripts/collect_steps.py @@ -48,7 +48,7 @@ # It's impossible to generate the exact set of steps that are executed in the actual # protocol without executing the protocol or analyzing the code statically. DEPTH_DYNAMIC_STEPS = [ - "ipa::protocol::attribution::InteractionPatternStep", + "ipa_core::protocol::attribution::InteractionPatternStep", ] MAXIMUM_DEPTH = 32 From 345b7a6e8bef50245cc9e44dd0d89f9c0e9953be Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Wed, 7 Feb 2024 13:58:59 -0800 Subject: [PATCH 008/135] Bump config dependency This should help with https://github.com/private-attribution/ipa/actions/runs/7806487945/job/21292951289?pr=898 --- ipa-core/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipa-core/Cargo.toml b/ipa-core/Cargo.toml index a28752559..9d8718fce 100644 --- a/ipa-core/Cargo.toml +++ b/ipa-core/Cargo.toml @@ -87,7 +87,7 @@ bitvec = "1.0" bytes = "1.4" clap = { version = "4.3.2", optional = true, features = ["derive"] } comfy-table = { version = "7.0", optional = true } -config = "0.13.2" +config = "0.14" criterion = { version = "0.5.1", optional = true, default-features = false, features = [ "async_tokio", "plotters", From 9ec756bfbe457d871ad158d638bd28c397966184 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Thu, 8 Feb 2024 09:25:18 -0800 Subject: [PATCH 009/135] Fix clippy lints --- ipa-core/src/net/server/handlers/query/prepare.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipa-core/src/net/server/handlers/query/prepare.rs b/ipa-core/src/net/server/handlers/query/prepare.rs index 32a71a662..ec22b026e 100644 --- a/ipa-core/src/net/server/handlers/query/prepare.rs +++ b/ipa-core/src/net/server/handlers/query/prepare.rs @@ -11,7 +11,7 @@ use crate::{ /// processing of that query. async fn handler( transport: Extension>, - _from: Extension, // require that client is an authenticated helper + _: Extension, // require that client is an authenticated helper req: http_serde::query::prepare::Request, ) -> Result<(), PrepareQueryError> { Arc::clone(&transport).prepare_query(req.data).await From 0cc0922d4cb2f0dbbd0235a0f3213c09b75798cd Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Thu, 8 Feb 2024 10:27:20 -0800 Subject: [PATCH 010/135] Fix nightly test build (for miri) --- ipa-core/src/protocol/context/mod.rs | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/ipa-core/src/protocol/context/mod.rs b/ipa-core/src/protocol/context/mod.rs index 1fa7ffd0f..3231cf0d9 100644 --- a/ipa-core/src/protocol/context/mod.rs +++ b/ipa-core/src/protocol/context/mod.rs @@ -290,33 +290,24 @@ mod tests { test_fixture::{Reconstruct, Runner, TestWorld, TestWorldConfig}, }; - trait AsReplicatedTestOnly { + trait ReplicatedLeftValue { fn l(&self) -> F; - fn r(&self) -> F; } - impl AsReplicatedTestOnly for Replicated { + impl ReplicatedLeftValue for Replicated { fn l(&self) -> F { (self as &Replicated).left() } - - fn r(&self) -> F { - (self as &Replicated).right() - } } /// This looks weird because it uses `MaliciousReplicated::rx()` value instead of `x`. /// Malicious context intentionally disallows access to `x` without validating first and /// here it does not matter at all. It needs just some value to send (any value would do just /// fine) - impl AsReplicatedTestOnly for MaliciousReplicated { + impl ReplicatedLeftValue for MaliciousReplicated { fn l(&self) -> F::ExtendedField { (self as &MaliciousReplicated).rx().left() } - - fn r(&self) -> F::ExtendedField { - (self as &MaliciousReplicated).rx().right() - } } /// Toy protocol to execute PRSS generation and send/receive logic @@ -325,7 +316,7 @@ mod tests { F: Field, Standard: Distribution, C: Context, - S: AsReplicatedTestOnly, + S: ReplicatedLeftValue, { let ctx = ctx.narrow("metrics"); let (left_peer, right_peer) = ( From 9d45b520001306bf236c1a4068c91cdbe4fbdc67 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Wed, 3 Jan 2024 16:48:06 -0800 Subject: [PATCH 011/135] Vectorization for prime fields Semi-honest AdditiveShare can hold a vector of sharings instead of just one sharing. The semi-honest multiply can operate on these vectors. --- ipa-core/benches/ct/arithmetic_circuit.rs | 57 +++- ipa-core/benches/iai/arithmetic_circuit.rs | 4 +- .../benches/oneshot/arithmetic_circuit.rs | 4 +- ipa-core/src/ff/boolean.rs | 15 +- ipa-core/src/ff/boolean_array.rs | 20 +- ipa-core/src/ff/curve_points.rs | 6 +- ipa-core/src/ff/ec_prime_field.rs | 12 +- ipa-core/src/ff/field.rs | 7 +- ipa-core/src/ff/galois_field.rs | 38 ++- ipa-core/src/ff/mod.rs | 2 +- ipa-core/src/ff/prime_field.rs | 20 +- .../src/helpers/buffers/ordering_sender.rs | 21 +- ipa-core/src/helpers/gateway/send.rs | 9 +- .../src/helpers/gateway/stall_detection.rs | 3 +- ipa-core/src/protocol/basics/mul/mod.rs | 15 +- .../src/protocol/basics/mul/semi_honest.rs | 200 +++++++++-- ipa-core/src/protocol/basics/mul/sparse.rs | 24 +- .../modulus_conversion/convert_shares.rs | 2 +- ipa-core/src/secret_sharing/array.rs | 315 ++++++++++++++++++ ipa-core/src/secret_sharing/mod.rs | 208 +++++++++++- .../replicated/semi_honest/additive_share.rs | 257 +++++++++----- ipa-core/src/test_fixture/circuit.rs | 48 ++- ipa-core/src/test_fixture/mod.rs | 2 +- ipa-core/src/test_fixture/sharing.rs | 38 ++- 24 files changed, 1148 insertions(+), 179 deletions(-) create mode 100644 ipa-core/src/secret_sharing/array.rs diff --git a/ipa-core/benches/ct/arithmetic_circuit.rs b/ipa-core/benches/ct/arithmetic_circuit.rs index 1c11e8dd2..fac67dca9 100644 --- a/ipa-core/benches/ct/arithmetic_circuit.rs +++ b/ipa-core/benches/ct/arithmetic_circuit.rs @@ -1,8 +1,38 @@ use criterion::{ - black_box, criterion_group, criterion_main, BenchmarkId, Criterion, SamplingMode, Throughput, + black_box, criterion_group, criterion_main, measurement::Measurement, BenchmarkGroup, + BenchmarkId, Criterion, SamplingMode, Throughput, }; -use ipa_core::{ff::Fp31, test_fixture::circuit}; -use tokio::runtime::Builder; +use ipa_core::{ + ff::{Field, Fp31, Fp32BitPrime}, + protocol::{basics::SecureMul, context::SemiHonestContext}, + secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, FieldSimd, IntoShares}, + test_fixture::circuit, +}; +use rand::distributions::{Distribution, Standard}; +use tokio::runtime::{Builder, Runtime}; + +fn do_benchmark( + rt: &Runtime, + group: &mut BenchmarkGroup, + width: u32, + depth: u16, +) where + M: Measurement, + F: Field + FieldSimd, + for<'a> Replicated: SecureMul>, + [F; N]: IntoShares>, + Standard: Distribution, +{ + group.throughput(Throughput::Elements((width * depth as u32) as u64)); + group.bench_with_input( + BenchmarkId::new("circuit", format!("{width}:{depth}:{}x{}", F::NAME, N)), + &(width, depth), + |b, &(width, depth)| { + b.to_async(rt) + .iter(|| circuit::arithmetic::(black_box(width), black_box(depth))); + }, + ); +} pub fn criterion_benchmark(c: &mut Criterion) { let rt = Builder::new_multi_thread() @@ -16,19 +46,14 @@ pub fn criterion_benchmark(c: &mut Criterion) { group.sample_size(10); group.sampling_mode(SamplingMode::Flat); - for width in [5_000u32, 50_000, 500_000, 1_000_000] { - for depth in [1u8, 10, 64] { - group.throughput(Throughput::Elements((width * depth as u32) as u64)); - group.bench_with_input( - BenchmarkId::new("circuit", format!("{width}:{depth}")), - &(width, depth), - |b, &(width, depth)| { - b.to_async(&rt) - .iter(|| circuit::arithmetic::(black_box(width), black_box(depth))); - }, - ); - } - } + do_benchmark::<_, Fp31, 1>(&rt, &mut group, 512_000, 1); + do_benchmark::<_, Fp31, 1>(&rt, &mut group, 51_200, 10); + do_benchmark::<_, Fp31, 1>(&rt, &mut group, 8_000, 64); + + do_benchmark::<_, Fp32BitPrime, 1>(&rt, &mut group, 25_600, 10); + do_benchmark::<_, Fp32BitPrime, 1>(&rt, &mut group, 2_560, 100); + do_benchmark::<_, Fp32BitPrime, 32>(&rt, &mut group, 4_000, 64); + do_benchmark::<_, Fp32BitPrime, 32>(&rt, &mut group, 250, 1_024); } criterion_group!(benches, criterion_benchmark); diff --git a/ipa-core/benches/iai/arithmetic_circuit.rs b/ipa-core/benches/iai/arithmetic_circuit.rs index af4cc3c2c..ef43e70a0 100644 --- a/ipa-core/benches/iai/arithmetic_circuit.rs +++ b/ipa-core/benches/iai/arithmetic_circuit.rs @@ -10,10 +10,10 @@ pub fn iai_benchmark() { .expect("Creating runtime failed"); const CIRCUIT_WIDTH: u32 = 500_000; - const CIRCUIT_DEPTH: u8 = 1; + const CIRCUIT_DEPTH: u16 = 1; rt.block_on(async { - circuit::arithmetic::(black_box(CIRCUIT_WIDTH), black_box(CIRCUIT_DEPTH)).await; + circuit::arithmetic::(black_box(CIRCUIT_WIDTH), black_box(CIRCUIT_DEPTH)).await; }) } diff --git a/ipa-core/benches/oneshot/arithmetic_circuit.rs b/ipa-core/benches/oneshot/arithmetic_circuit.rs index e4fdeceab..c78a409ea 100644 --- a/ipa-core/benches/oneshot/arithmetic_circuit.rs +++ b/ipa-core/benches/oneshot/arithmetic_circuit.rs @@ -14,7 +14,7 @@ pub struct CircuitArgs { pub width: u32, #[arg(short, long, help = "depth of the circuit", default_value_t = 10)] - pub depth: u8, + pub depth: u16, /// Cargo passes the bench argument /// https://doc.rust-lang.org/cargo/commands/cargo-bench.html @@ -34,7 +34,7 @@ pub async fn main() { } let start = Instant::now(); - circuit::arithmetic::(args.width, args.depth).await; + circuit::arithmetic::(args.width, args.depth).await; let duration = start.elapsed().as_secs_f32(); println!("benchmark complete after {duration}s"); diff --git a/ipa-core/src/ff/boolean.rs b/ipa-core/src/ff/boolean.rs index 6937dd1a9..f577c5ac1 100644 --- a/ipa-core/src/ff/boolean.rs +++ b/ipa-core/src/ff/boolean.rs @@ -5,7 +5,10 @@ use super::Gf32Bit; use crate::{ ff::{Field, Serializable}, protocol::prss::FromRandomU128, - secret_sharing::{replicated::malicious::ExtendableField, Block, SharedValue}, + secret_sharing::{ + replicated::malicious::ExtendableField, Block, FieldVectorizable, SharedValue, StdArray, + Vectorizable, + }, }; impl Block for bool { @@ -40,6 +43,14 @@ impl SharedValue for Boolean { const ZERO: Self = Self(false); } +impl Vectorizable<1> for Boolean { + type Array = StdArray; +} + +impl FieldVectorizable<1> for Boolean { + type ArrayAlias = StdArray; +} + ///conversion to Scalar struct of `curve25519_dalek` impl From for bool { fn from(s: Boolean) -> Self { @@ -146,6 +157,8 @@ impl From for Boolean { ///implement Field because required by PRSS impl Field for Boolean { + const NAME: &'static str = "Boolean"; + const ONE: Boolean = Boolean(true); fn as_u128(&self) -> u128 { diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index 9d83b1286..e733264f7 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -8,7 +8,7 @@ use typenum::{U14, U2, U32, U8}; use crate::{ ff::{boolean::Boolean, ArrayAccess, Field, Serializable}, protocol::prss::{FromRandom, FromRandomU128}, - secret_sharing::{Block, SharedValue}, + secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, }; /// The implementation below cannot be constrained without breaking Rust's @@ -42,6 +42,12 @@ impl<'a> Iterator for BAIterator<'a> { } } +impl<'a> ExactSizeIterator for BAIterator<'a> { + fn len(&self) -> usize { + self.iterator.len() + } +} + /// A value of ONE has a one in the first element of the bit array, followed by `$bits-1` zeros. /// This macro uses a bit of recursive repetition to produce those zeros. /// @@ -95,6 +101,8 @@ macro_rules! boolean_array_impl_small { // TODO(812): remove this impl; BAs are not field elements. impl Field for $name { + const NAME: &'static str = stringify!($name); + const ONE: Self = Self(bitarr_one!($bits)); fn as_u128(&self) -> u128 { @@ -153,6 +161,10 @@ macro_rules! boolean_array_impl_small { Field::truncate_from(src) } } + + impl FieldVectorizable<1> for $name { + type ArrayAlias = StdArray<$name, 1>; + } }; } @@ -358,6 +370,10 @@ macro_rules! boolean_array_impl { } } + impl Vectorizable<1> for $name { + type Array = StdArray<$name, 1>; + } + impl std::ops::Mul for $name { type Output = Self; fn mul(self, rhs: Self) -> Self::Output { @@ -394,7 +410,7 @@ macro_rules! boolean_array_impl { #[allow(clippy::into_iter_without_iter)] impl<'a> IntoIterator for &'a AdditiveShare<$name> { type Item = AdditiveShare; - type IntoIter = ASIterator>; + type IntoIter = ASIterator<'a, $name>; fn into_iter(self) -> Self::IntoIter { self.iter() diff --git a/ipa-core/src/ff/curve_points.rs b/ipa-core/src/ff/curve_points.rs index 499845f7b..f0db75b49 100644 --- a/ipa-core/src/ff/curve_points.rs +++ b/ipa-core/src/ff/curve_points.rs @@ -7,7 +7,7 @@ use typenum::U32; use crate::{ ff::{ec_prime_field::Fp25519, Serializable}, - secret_sharing::{Block, SharedValue}, + secret_sharing::{Block, SharedValue, StdArray, Vectorizable}, }; impl Block for CompressedRistretto { @@ -35,6 +35,10 @@ impl SharedValue for RP25519 { const ZERO: Self = Self(CompressedRistretto([0_u8; 32])); } +impl Vectorizable<1> for RP25519 { + type Array = StdArray; +} + #[derive(thiserror::Error, Debug)] #[error("{0:?} is not the canonical encoding of a Ristretto point.")] pub struct NonCanonicalEncoding(CompressedRistretto); diff --git a/ipa-core/src/ff/ec_prime_field.rs b/ipa-core/src/ff/ec_prime_field.rs index 0e72024ab..4c03a6a6f 100644 --- a/ipa-core/src/ff/ec_prime_field.rs +++ b/ipa-core/src/ff/ec_prime_field.rs @@ -9,7 +9,7 @@ use typenum::U32; use crate::{ ff::{boolean_array::BA256, Field, Serializable}, protocol::prss::FromRandomU128, - secret_sharing::{Block, SharedValue}, + secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, }; impl Block for Scalar { @@ -176,8 +176,18 @@ macro_rules! sc_hash_impl { #[cfg(test)] sc_hash_impl!(u64); +impl Vectorizable<1> for Fp25519 { + type Array = StdArray; +} + +impl FieldVectorizable<1> for Fp25519 { + type ArrayAlias = StdArray; +} + ///implement Field because required by PRSS impl Field for Fp25519 { + const NAME: &'static str = "Fp25519"; + const ONE: Fp25519 = Fp25519::ONE; ///both following methods are based on hashing and do not allow to actually convert elements in Fp25519 diff --git a/ipa-core/src/ff/field.rs b/ipa-core/src/ff/field.rs index 5535ed833..4e098cfda 100644 --- a/ipa-core/src/ff/field.rs +++ b/ipa-core/src/ff/field.rs @@ -8,7 +8,7 @@ use typenum::{U1, U4}; use crate::{ error, protocol::prss::FromRandomU128, - secret_sharing::{Block, SharedValue}, + secret_sharing::{Block, FieldVectorizable, SharedValue, Vectorizable}, }; impl Block for u8 { @@ -29,7 +29,12 @@ pub trait Field: + FromRandomU128 + TryFrom + Into + + Vectorizable<1> + + FieldVectorizable<1, ArrayAlias = >::Array> { + // Name of the field + const NAME: &'static str; + /// Multiplicative identity element const ONE: Self; diff --git a/ipa-core/src/ff/galois_field.rs b/ipa-core/src/ff/galois_field.rs index fb7c9ae0a..64a345f6f 100644 --- a/ipa-core/src/ff/galois_field.rs +++ b/ipa-core/src/ff/galois_field.rs @@ -15,7 +15,7 @@ use crate::{ ff::{boolean_array::NonZeroPadding, Field, Serializable}, impl_serializable_trait, protocol::prss::FromRandomU128, - secret_sharing::{Block, SharedValue}, + secret_sharing::{Block, FieldVectorizable, SharedValue, Vectorizable}, }; /// Trait for data types storing arbitrary number of bits. @@ -148,6 +148,12 @@ impl<'a> Iterator for BoolIterator<'a> { } } +impl<'a> ExactSizeIterator for BoolIterator<'a> { + fn len(&self) -> usize { + self.0.len() + } +} + macro_rules! bit_array_impl { ( $modname:ident, $name:ident, $store:ty, $bits:expr, $one:expr, $polynomial:expr, $deser_type: tt, $({$($extra:item)*})? ) => { #[allow(clippy::suspicious_arithmetic_impl)] @@ -169,7 +175,17 @@ macro_rules! bit_array_impl { const ZERO: Self = Self(<$store>::ZERO); } + impl Vectorizable<1> for $name { + type Array = crate::secret_sharing::StdArray<$name, 1>; + } + + impl FieldVectorizable<1> for $name { + type ArrayAlias = crate::secret_sharing::StdArray<$name, 1>; + } + impl Field for $name { + const NAME: &'static str = stringify!($field); + const ONE: Self = Self($one); fn as_u128(&self) -> u128 { @@ -693,5 +709,25 @@ bit_array_impl!( value != Gf2::ZERO } } + + impl From for Gf2 { + fn from(value: crate::ff::boolean::Boolean) -> Self { + bool::from(value).into() + } + } + + impl From for crate::ff::boolean::Boolean { + fn from(value: Gf2) -> Self { + bool::from(value).into() + } + } + + impl std::ops::Not for Gf2 { + type Output = Self; + + fn not(self) -> Self { + (!bool::from(self)).into() + } + } } ); diff --git a/ipa-core/src/ff/mod.rs b/ipa-core/src/ff/mod.rs index 96aecca00..b831fd707 100644 --- a/ipa-core/src/ff/mod.rs +++ b/ipa-core/src/ff/mod.rs @@ -82,7 +82,7 @@ pub trait Serializable: Sized { pub trait ArrayAccess { type Output; - type Iter<'a>: Iterator + Send + type Iter<'a>: Iterator + ExactSizeIterator + Send where Self: 'a; diff --git a/ipa-core/src/ff/prime_field.rs b/ipa-core/src/ff/prime_field.rs index b7ac911b9..2f9694969 100644 --- a/ipa-core/src/ff/prime_field.rs +++ b/ipa-core/src/ff/prime_field.rs @@ -6,7 +6,7 @@ use super::Field; use crate::{ ff::Serializable, protocol::prss::FromRandomU128, - secret_sharing::{Block, SharedValue}, + secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, }; pub trait PrimeField: Field { @@ -33,7 +33,17 @@ macro_rules! field_impl { const ZERO: Self = $field(0); } + impl Vectorizable<1> for $field { + type Array = StdArray<$field, 1>; + } + + impl FieldVectorizable<1> for $field { + type ArrayAlias = StdArray<$field, 1>; + } + impl Field for $field { + const NAME: &'static str = stringify!($field); + const ONE: Self = $field(1); fn as_u128(&self) -> u128 { @@ -317,6 +327,14 @@ mod fp31 { mod fp32bit { field_impl! { Fp32BitPrime, u32, 32, 4_294_967_291 } + impl Vectorizable<32> for Fp32BitPrime { + type Array = StdArray; + } + + impl FieldVectorizable<32> for Fp32BitPrime { + type ArrayAlias = StdArray; + } + #[cfg(all(test, unit_test))] mod specialized_tests { use super::*; diff --git a/ipa-core/src/helpers/buffers/ordering_sender.rs b/ipa-core/src/helpers/buffers/ordering_sender.rs index 943ee07f5..d7e383036 100644 --- a/ipa-core/src/helpers/buffers/ordering_sender.rs +++ b/ipa-core/src/helpers/buffers/ordering_sender.rs @@ -3,6 +3,7 @@ use std::{ cmp::Ordering, collections::VecDeque, fmt::Debug, + marker::PhantomData, mem::drop, num::NonZeroUsize, pin::Pin, @@ -330,8 +331,13 @@ impl OrderingSender { /// * the same index is provided more than once. /// /// [capacity]: OrderingSender#spare-capacity-configuration - pub fn send(&self, i: usize, m: M) -> Send<'_, M> { - Send { i, m, sender: self } + pub fn send>(&self, i: usize, m: B) -> Send<'_, M, B> { + Send { + i, + m, + sender: self, + phantom_data: PhantomData, + } } /// Close the sender at index `i`. @@ -433,13 +439,14 @@ impl OrderingSender { } /// A future for writing item `i` into an `OrderingSender`. -pub struct Send<'s, M: Message> { +pub struct Send<'a, M: Message, B: Borrow + 'a> { i: usize, - m: M, - sender: &'s OrderingSender, + m: B, + sender: &'a OrderingSender, + phantom_data: PhantomData, } -impl<'s, M: Message> Future for Send<'s, M> { +impl<'a, M: Message, B: Borrow + 'a> Future for Send<'a, M, B> { type Output = (); fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { @@ -447,7 +454,7 @@ impl<'s, M: Message> Future for Send<'s, M> { let res = this.sender.next_op(this.i, cx, |b| { assert!(!b.closed, "writing on a closed stream"); - b.write(&this.m, cx) + b.write(this.m.borrow(), cx) }); // A successful write: wake the next in line. // But not while holding the lock on state. diff --git a/ipa-core/src/helpers/gateway/send.rs b/ipa-core/src/helpers/gateway/send.rs index bdc51a4da..00d8de096 100644 --- a/ipa-core/src/helpers/gateway/send.rs +++ b/ipa-core/src/helpers/gateway/send.rs @@ -1,4 +1,5 @@ use std::{ + borrow::Borrow, marker::PhantomData, num::NonZeroUsize, pin::Pin, @@ -52,7 +53,11 @@ impl GatewaySender { } } - pub async fn send(&self, record_id: RecordId, msg: M) -> Result<(), Error> { + pub async fn send>( + &self, + record_id: RecordId, + msg: B, + ) -> Result<(), Error> { debug_assert!( self.total_records.is_specified(), "total_records cannot be unspecified when sending" @@ -109,7 +114,7 @@ impl SendingEnd { /// /// [`set_total_records`]: crate::protocol::context::Context::set_total_records #[tracing::instrument(level = "trace", "send", skip_all, fields(i = %record_id, total = %self.inner.total_records, to = ?self.channel_id.role, gate = ?self.channel_id.gate.as_ref()))] - pub async fn send(&self, record_id: RecordId, msg: M) -> Result<(), Error> { + pub async fn send>(&self, record_id: RecordId, msg: B) -> Result<(), Error> { let r = self.inner.send(record_id, msg).await; metrics::increment_counter!(RECORDS_SENT, STEP => self.channel_id.gate.as_ref().to_string(), diff --git a/ipa-core/src/helpers/gateway/stall_detection.rs b/ipa-core/src/helpers/gateway/stall_detection.rs index c2e288572..9a1b28732 100644 --- a/ipa-core/src/helpers/gateway/stall_detection.rs +++ b/ipa-core/src/helpers/gateway/stall_detection.rs @@ -270,6 +270,7 @@ mod receive { mod send { use std::{ + borrow::Borrow, collections::BTreeMap, fmt::{Debug, Formatter}, }; @@ -288,7 +289,7 @@ mod send { delegate::delegate! { to { self.advance(); self.inner() } { #[inline] - pub async fn send(&self, record_id: RecordId, msg: M) -> Result<(), Error>; + pub async fn send>(&self, record_id: RecordId, msg: B) -> Result<(), Error>; } } } diff --git a/ipa-core/src/protocol/basics/mul/mod.rs b/ipa-core/src/protocol/basics/mul/mod.rs index ed98e9d0b..b8924343a 100644 --- a/ipa-core/src/protocol/basics/mul/mod.rs +++ b/ipa-core/src/protocol/basics/mul/mod.rs @@ -7,9 +7,12 @@ use crate::{ context::{Context, UpgradedMaliciousContext}, RecordId, }, - secret_sharing::replicated::{ - malicious::{AdditiveShare as MaliciousReplicated, ExtendableField}, - semi_honest::AdditiveShare as Replicated, + secret_sharing::{ + replicated::{ + malicious::{AdditiveShare as MaliciousReplicated, ExtendableField}, + semi_honest::AdditiveShare as Replicated, + }, + FieldSimd, }, }; @@ -52,7 +55,11 @@ use {malicious::multiply as malicious_mul, semi_honest::multiply as semi_honest_ /// Implement secure multiplication for semi-honest contexts with replicated secret sharing. #[async_trait] -impl SecureMul for Replicated { +impl SecureMul for Replicated +where + C: Context, + F: Field + FieldSimd, +{ async fn multiply_sparse<'fut>( &self, rhs: &Self, diff --git a/ipa-core/src/protocol/basics/mul/semi_honest.rs b/ipa-core/src/protocol/basics/mul/semi_honest.rs index 25de86946..67171ff25 100644 --- a/ipa-core/src/protocol/basics/mul/semi_honest.rs +++ b/ipa-core/src/protocol/basics/mul/semi_honest.rs @@ -8,8 +8,9 @@ use crate::{ prss::SharedRandomness, RecordId, }, - secret_sharing::replicated::{ - semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing, + secret_sharing::{ + replicated::semi_honest::AdditiveShare as Replicated, FieldSimd, SharedValueArray, + Vectorizable, }, }; @@ -26,16 +27,16 @@ use crate::{ /// ## Errors /// Lots of things may go wrong here, from timeouts to bad output. They will be signalled /// back via the error response -pub async fn multiply( +pub async fn multiply( ctx: C, record_id: RecordId, - a: &Replicated, - b: &Replicated, + a: &Replicated, + b: &Replicated, zeros: MultiplyZeroPositions, -) -> Result, Error> +) -> Result, Error> where C: Context, - F: Field, + F: Field + FieldSimd, { let role = ctx.role(); let [need_to_recv, need_to_send, need_random_right] = zeros.work_for(role); @@ -43,19 +44,26 @@ where zeros.1.check(role, "b", b); // Shared randomness used to mask the values that are sent. - let (s0, s1) = ctx.prss().generate(record_id); + let (s0, s1) = ctx + .prss() + .generate::<(>::Array, _), _>(record_id); + + let mut rhs = a.right_arr().clone() * b.right_arr(); - let mut rhs = a.right() * b.right(); if need_to_send { // Compute the value (d_i) we want to send to the right helper (i+1). - let right_d = a.left() * b.right() + a.right() * b.left() - s0; + let right_d = + a.left_arr().clone() * b.right_arr() + a.right_arr().clone() * b.left_arr() - &s0; - ctx.send_channel(role.peer(Direction::Right)) - .send(record_id, right_d) + ctx.send_channel::<>::Array>(role.peer(Direction::Right)) + .send(record_id, &right_d) .await?; rhs += right_d; } else { - debug_assert_eq!(a.left() * b.right() + a.right() * b.left(), F::ZERO); + debug_assert_eq!( + a.left_arr().clone() * b.right_arr() + a.right_arr().clone() * b.left_arr(), + <>::Array as SharedValueArray>::ZERO + ); } // Add randomness to this value whether we sent or not, depending on whether the // peer to the right needed to send. If they send, they subtract randomness, @@ -65,9 +73,9 @@ where } // Sleep until helper on the left sends us their (d_i-1) value. - let mut lhs = a.left() * b.left(); + let mut lhs = a.left_arr().clone() * b.left_arr(); if need_to_recv { - let left_d = ctx + let left_d: >::Array = ctx .recv_channel(role.peer(Direction::Left)) .receive(record_id) .await?; @@ -78,21 +86,32 @@ where lhs += s0; } - Ok(Replicated::new(lhs, rhs)) + Ok(Replicated::new_arr(lhs, rhs)) } #[cfg(all(test, unit_test))] mod test { - use std::iter::{repeat, zip}; + use std::{ + array, + iter::{repeat, zip}, + time::Instant, + }; use rand::distributions::{Distribution, Standard}; + use super::multiply; use crate::{ - ff::{Field, Fp31}, - protocol::{basics::SecureMul, context::Context, RecordId}, + ff::{Field, Fp31, Fp32BitPrime}, + helpers::TotalRecords, + protocol::{ + basics::{SecureMul, ZeroPositions}, + context::Context, + RecordId, + }, rand::{thread_rng, Rng}, + secret_sharing::replicated::semi_honest::AdditiveShare, seq_join::SeqJoin, - test_fixture::{Reconstruct, Runner, TestWorld}, + test_fixture::{Reconstruct, ReconstructArr, Runner, TestWorld}, }; #[tokio::test] @@ -182,4 +201,145 @@ mod test { result.reconstruct().as_u128() } + + #[tokio::test] + pub async fn wide_mul() { + const COUNT: usize = 32; + let world = TestWorld::default(); + + let mut rng = thread_rng(); + let a: [Fp32BitPrime; COUNT] = (0..COUNT) + .map(|_| rng.gen::()) + .collect::>() + .try_into() + .unwrap(); + let b: [Fp32BitPrime; COUNT] = (0..COUNT) + .map(|_| rng.gen::()) + .collect::>() + .try_into() + .unwrap(); + let expected: [Fp32BitPrime; COUNT] = zip(a.iter(), b.iter()) + .map(|(&a, &b)| a * b) + .collect::>() + .try_into() + .unwrap(); + let results = world + .semi_honest((a, b), |ctx, (a_shares, b_shares)| async move { + multiply( + ctx.set_total_records(1), + RecordId::from(0), + &a_shares, + &b_shares, + ZeroPositions::NONE, + ) + .await + .unwrap() + }) + .await; + assert_eq!(expected, results.reconstruct_arr()); + } + + // The manymult test is a microbenchmark. The test generates a DxW matrix of field elements. The + // matrix is reduced to a single W-element row vector by taking the element-wise product of the + // D values in each column. The non-vectorized implementation (manymult_novec) simply does a + // parallel_join of W semi-honest multiplies. The vectorized implementation (manymult_vec) + // processes a row at a time. For manymult_vec, MANYMULT_WIDTH must match a supported + // vectorization width. + const MANYMULT_ITERS: usize = 512; + const MANYMULT_WIDTH: usize = 32; + + #[tokio::test] + pub async fn manymult_novec() { + let world = TestWorld::default(); + let mut rng = thread_rng(); + let mut inputs = Vec::>::new(); + for _ in 0..MANYMULT_ITERS { + inputs.push( + (0..MANYMULT_WIDTH) + .map(|_| Fp32BitPrime::try_from(u128::from(rng.gen_range(0u32..100))).unwrap()) + .collect::>(), + ); + } + let expected = inputs + .iter() + .fold(None, |acc: Option>, b| match acc { + Some(a) => Some(a.iter().zip(b.iter()).map(|(&a, &b)| a * b).collect()), + None => Some(b.clone()), + }) + .unwrap(); + + let begin = Instant::now(); + let result = world + .semi_honest( + inputs.into_iter().map(IntoIterator::into_iter), + |ctx, share: Vec>>| async move { + let ctx = ctx.set_total_records(MANYMULT_ITERS * MANYMULT_WIDTH); + let mut iter = share.iter(); + let mut val = iter.next().unwrap().clone(); + for i in 1..MANYMULT_ITERS { + let cur = iter.next().unwrap(); + let mut res = Vec::with_capacity(MANYMULT_WIDTH); + for j in 0..MANYMULT_WIDTH { + res.push(val[j].multiply( + &cur[j], + ctx.clone(), + RecordId::from(MANYMULT_WIDTH * (i - 1) + j), + )); + } + val = ctx.parallel_join(res).await.unwrap(); + } + val + }, + ) + .await; + tracing::debug!("Protocol execution time: {:?}", begin.elapsed()); + assert_eq!(expected, result.reconstruct()); + } + + #[tokio::test] + pub async fn manymult_vec() { + let world = TestWorld::default(); + let mut rng = thread_rng(); + let mut inputs = Vec::<[Fp32BitPrime; MANYMULT_WIDTH]>::new(); + for _ in 0..MANYMULT_ITERS { + inputs.push(array::from_fn(|_| rng.gen())); + } + let expected = inputs + .iter() + .fold(None, |acc: Option>, b| match acc { + Some(a) => Some(a.iter().zip(b.iter()).map(|(&a, &b)| a * b).collect()), + None => Some(b.to_vec()), + }) + .unwrap(); + + let begin = Instant::now(); + let result = world + .semi_honest( + inputs.into_iter(), + |ctx, share: Vec>| async move { + // The output of each row is input to the next row, so no parallelization + // across rows is possible. Thus we set TotalRecords::Indeterminate, which + // flushes after every record. If a row were larger than one record, we could + // instead configure the active work in TestWorld to match the row size. + let ctx = ctx.set_total_records(TotalRecords::Indeterminate); + let mut iter = share.iter(); + let mut val = iter.next().unwrap().clone(); + for i in 1..MANYMULT_ITERS { + val = multiply( + ctx.clone(), + RecordId::from(i - 1), + &val, + iter.next().unwrap(), + ZeroPositions::NONE, + ) + .await + .unwrap(); + } + val + }, + ) + .await; + tracing::debug!("Protocol execution time: {:?}", begin.elapsed()); + assert_eq!(expected, result.reconstruct_arr()); + } } diff --git a/ipa-core/src/protocol/basics/mul/sparse.rs b/ipa-core/src/protocol/basics/mul/sparse.rs index 9f1ad9943..878199b23 100644 --- a/ipa-core/src/protocol/basics/mul/sparse.rs +++ b/ipa-core/src/protocol/basics/mul/sparse.rs @@ -1,5 +1,8 @@ +#[cfg_attr(not(debug_assertions), allow(unused_variables))] +use crate::secret_sharing::Vectorizable; use crate::{ - ff::Field, helpers::Role, secret_sharing::replicated::semi_honest::AdditiveShare as Replicated, + helpers::Role, + secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, SharedValue}, }; /// A description of a replicated secret sharing, with zero values at known positions. @@ -105,25 +108,28 @@ impl ZeroPositions { /// # Panics /// When the input value includes a non-zero value in a position marked as having a zero. #[cfg_attr(not(debug_assertions), allow(unused_variables))] - pub fn check(self, role: Role, which: &str, v: &Replicated) { + pub fn check, const N: usize>( + self, + role: Role, + which: &str, + v: &Replicated, + ) { #[cfg(debug_assertions)] { - use crate::{ - helpers::Direction::Right, secret_sharing::replicated::ReplicatedSecretSharing, - }; + use crate::{helpers::Direction::Right, secret_sharing::SharedValueArray}; let flags = <[bool; 3]>::from(self); if flags[role as usize] { assert_eq!( - F::ZERO, - v.left(), + &>::Array::ZERO, + v.left_arr(), "expected a zero on the left for input {which}" ); } if flags[role.peer(Right) as usize] { assert_eq!( - F::ZERO, - v.right(), + &>::Array::ZERO, + v.right_arr(), "expected a zero on the right for input {which}" ); } diff --git a/ipa-core/src/protocol/modulus_conversion/convert_shares.rs b/ipa-core/src/protocol/modulus_conversion/convert_shares.rs index ac6aabf33..ab3581e96 100644 --- a/ipa-core/src/protocol/modulus_conversion/convert_shares.rs +++ b/ipa-core/src/protocol/modulus_conversion/convert_shares.rs @@ -70,7 +70,7 @@ impl BitConversionTriple> { /// /// # Panics /// If any bits in the bitwise shared input cannot be converted into the given field `F` - /// without truncation or if the bit index is out of range for `B`. + /// without truncation. #[must_use] pub fn new(helper_role: Role, left: bool, right: bool) -> Self { let left = F::try_from(u128::from(left)).unwrap(); diff --git a/ipa-core/src/secret_sharing/array.rs b/ipa-core/src/secret_sharing/array.rs new file mode 100644 index 000000000..f05cc30dc --- /dev/null +++ b/ipa-core/src/secret_sharing/array.rs @@ -0,0 +1,315 @@ +use std::{ + array, + borrow::Borrow, + fmt::Debug, + ops::{Add, AddAssign, Mul, Neg, Not, Sub, SubAssign}, +}; + +use generic_array::{ArrayLength, GenericArray}; +use typenum::{U1, U32}; + +use crate::{ + ff::{Field, Fp32BitPrime, Serializable}, + helpers::Message, + protocol::prss::{FromRandom, FromRandomU128}, + secret_sharing::{FieldArray, SharedValue, SharedValueArray}, +}; + +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct StdArray([V; N]); + +impl PartialEq for StdArray +where + V: SharedValue, + T: Borrow<[V]>, +{ + fn eq(&self, other: &T) -> bool { + self.0.as_slice() == other.borrow() + } +} + +impl PartialEq> for Vec { + fn eq(&self, other: &StdArray) -> bool { + other.eq(self) + } +} + +impl PartialEq> for [V; N] { + fn eq(&self, other: &StdArray) -> bool { + other.eq(self) + } +} + +impl SharedValueArray for StdArray +where + Self: Serializable, +{ + const ZERO: Self = Self([V::ZERO; N]); + + fn from_fn V>(f: F) -> Self { + Self(array::from_fn(f)) + } + + fn get(&self, index: usize) -> V { + self.0[index] + } + + fn get_mut(&mut self, index: usize) -> &mut V { + &mut self.0[index] + } + + fn set(&mut self, index: usize, value: V) { + self.0[index] = value; + } +} + +impl FieldArray for StdArray where Self: FromRandom + Serializable +{} + +impl TryFrom> for StdArray { + type Error = (); + fn try_from(value: Vec) -> Result { + value.try_into().map(Self).map_err(|_| ()) + } +} + +// Panics if the iterator terminates before producing N items. +impl FromIterator for StdArray +where + Self: Serializable, +{ + fn from_iter>(iter: T) -> Self { + let mut res = Self::ZERO; + let mut iter = iter.into_iter(); + + for i in 0..N { + res.0[i] = iter.next().unwrap(); + } + + res + } +} + +impl IntoIterator for StdArray { + type Item = V; + type IntoIter = std::array::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl<'a, 'b, V: SharedValue, const N: usize> Add<&'b StdArray> for &'a StdArray { + type Output = StdArray; + + fn add(self, rhs: &'b StdArray) -> Self::Output { + StdArray(array::from_fn(|i| self.0[i] + rhs.0[i])) + } +} + +impl Add for StdArray { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + Add::add(&self, &rhs) + } +} + +// add(owned, ref) should be preferred over this. +impl Add> for &StdArray { + type Output = StdArray; + + fn add(self, rhs: StdArray) -> Self::Output { + Add::add(self, &rhs) + } +} + +impl Add<&StdArray> for StdArray { + type Output = Self; + + fn add(self, rhs: &Self) -> Self::Output { + Add::add(&self, rhs) + } +} + +impl AddAssign<&Self> for StdArray { + fn add_assign(&mut self, rhs: &Self) { + for (a, b) in self.0.iter_mut().zip(rhs.0.iter()) { + *a += *b; + } + } +} + +impl AddAssign for StdArray { + fn add_assign(&mut self, rhs: Self) { + AddAssign::add_assign(self, &rhs); + } +} + +impl Neg for &StdArray { + type Output = StdArray; + + fn neg(self) -> Self::Output { + StdArray(array::from_fn(|i| -self.0[i])) + } +} + +impl Neg for StdArray { + type Output = Self; + + fn neg(self) -> Self::Output { + Neg::neg(&self) + } +} + +impl Sub for &StdArray { + type Output = StdArray; + + fn sub(self, rhs: Self) -> Self::Output { + StdArray(array::from_fn(|i| self.0[i] - rhs.0[i])) + } +} + +impl Sub for StdArray { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + Sub::sub(&self, &rhs) + } +} + +impl Sub<&Self> for StdArray { + type Output = Self; + + fn sub(self, rhs: &Self) -> Self::Output { + Sub::sub(&self, rhs) + } +} + +impl Sub> for &StdArray { + type Output = StdArray; + + fn sub(self, rhs: StdArray) -> Self::Output { + Sub::sub(self, &rhs) + } +} + +impl SubAssign<&Self> for StdArray { + fn sub_assign(&mut self, rhs: &Self) { + for (a, b) in self.0.iter_mut().zip(rhs.0.iter()) { + *a -= *b; + } + } +} + +impl SubAssign for StdArray { + fn sub_assign(&mut self, rhs: Self) { + SubAssign::sub_assign(self, &rhs); + } +} + +impl<'a, 'b, F: Field, const N: usize> Mul<&'b F> for &'a StdArray { + type Output = StdArray; + + fn mul(self, rhs: &'b F) -> Self::Output { + StdArray(array::from_fn(|i| self.0[i] * *rhs)) + } +} + +impl Mul for StdArray { + type Output = Self; + + fn mul(self, rhs: F) -> Self::Output { + Mul::mul(&self, &rhs) + } +} + +impl Mul<&F> for StdArray { + type Output = Self; + + fn mul(self, rhs: &F) -> Self::Output { + Mul::mul(&self, rhs) + } +} + +impl Mul for &StdArray { + type Output = StdArray; + + fn mul(self, rhs: F) -> Self::Output { + Mul::mul(self, &rhs) + } +} + +impl<'a, F: Field, const N: usize> Mul<&'a StdArray> for StdArray { + type Output = StdArray; + + fn mul(self, rhs: &'a StdArray) -> Self::Output { + StdArray(array::from_fn(|i| self.0[i] * rhs.0[i])) + } +} + +impl, const N: usize> Not for StdArray { + type Output = StdArray; + + fn not(self) -> Self::Output { + StdArray(array::from_fn(|i| !self.0[i])) + } +} + +impl> FromRandom for StdArray { + type SourceLength = U1; + fn from_random(src: GenericArray) -> Self { + Self([F::from_random(src)]) + } +} + +impl FromRandom for StdArray { + type SourceLength = U32; + + fn from_random(src: GenericArray) -> Self { + Self(array::from_fn(|i| Fp32BitPrime::from_random_u128(src[i]))) + } +} + +impl Serializable for StdArray { + type Size = ::Size; + type DeserializationError = ::DeserializationError; + + fn serialize(&self, buf: &mut GenericArray) { + self.0[0].serialize(buf); + } + + fn deserialize(buf: &GenericArray) -> Result { + Ok(StdArray([V::deserialize(buf)?])) + } +} + +impl Serializable for StdArray +where + V: SharedValue, + ::Size: Mul, + <::Size as Mul>::Output: ArrayLength, +{ + type Size = <::Size as Mul>::Output; + type DeserializationError = ::DeserializationError; + + fn serialize(&self, buf: &mut GenericArray) { + let sz: usize = (::BITS / 8).try_into().unwrap(); + for i in 0..32 { + self.0[i].serialize( + GenericArray::try_from_mut_slice(&mut buf[sz * i..sz * (i + 1)]).unwrap(), + ); + } + } + + fn deserialize(buf: &GenericArray) -> Result { + let sz: usize = (::BITS / 8).try_into().unwrap(); + let mut res = [V::ZERO; 32]; + for i in 0..32 { + res[i] = V::deserialize(GenericArray::from_slice(&buf[sz * i..sz * (i + 1)]))?; + } + Ok(StdArray(res)) + } +} + +impl Message for StdArray where Self: Serializable {} diff --git a/ipa-core/src/secret_sharing/mod.rs b/ipa-core/src/secret_sharing/mod.rs index 42a62ca55..3b4923854 100644 --- a/ipa-core/src/secret_sharing/mod.rs +++ b/ipa-core/src/secret_sharing/mod.rs @@ -1,14 +1,62 @@ +//! # Vectorization +//! +//! Vectorization refers to adapting an implementation that previously operated on one value at a +//! time, to instead operate on `N` values at a time. Vectorization improves performance in two ways: +//! +//! 1. Vectorized code can make use of special CPU instructions (Intel AVX, ARM NEON) that operate +//! on multiple values at a time. This reduces the CPU time required to perform computations. +//! We also use vectorization to refer to "bit packing" of boolean values, i.e., packing +//! 64 boolean values into a single u64 rather than using a byte (or even a word) for each +//! value. +//! 2. Aside from the core arithmetic operations that are involved in our MPC, a substantial +//! amount of other code is needed to send values between helpers, schedule futures for +//! execution, etc. Vectorization can result in a greater amount of arithmetic work being +//! performed for a given amount of overhead work, thus increasing the efficiency of the +//! implementation. +//! +//! ## Vectorization traits +//! +//! There are two sets of traits related to vectorization. +//! +//! If you are writing protocols, the trait of interest is `FieldSimd`, which can be specified in +//! a trait bound, something like `F: Field + FieldSimd`. +//! +//! The other traits are `Vectorizable` (for `SharedValue`s) and `FieldVectorizable`. These traits +//! are needed to work around a limitation in the rust type system. See the `FieldVectorizable` +//! documentation for details. +//! +//! We require that each supported vectorization configuration (i.e. combination of data type and +//! width) be explicitly identified, by implementing the `Vectorizable` and/or `FieldVectorizable` +//! traits for base data type (e.g. `Fp32BitPrime`). This is for two reasons: +//! 1. Rust doesn't yet support evaluating expressions involving const parameters at compile time, +//! which makes it difficult or impossible to write generic serialization routines for +//! arbitrary widths. +//! 2. As a measure of protection against inadvertently using a configuration that will not be +//! efficient (i.e. an excessive vector width). +//! +//! ## Adding a new supported vectorization +//! +//! To add a new supported vectorization: +//! +//! 1. Add `FieldSimd` impl (in `secret_sharing/mod.rs`) +//! 2. Add `FromRandom` impl (in `array.rs` or `boolean_array.rs`) +//! 3. Add `Serializable` impl (in `array.rs` or `boolean_array.rs`) +//! 4. Add `Vectorizable` and `FieldVectorizable` impls (with the primitive type def in e.g. `galois_field.rs` + pub mod replicated; +mod array; mod decomposed; mod into_shares; mod scheme; use std::{ fmt::Debug, - ops::{Mul, MulAssign, Neg}, + iter::once, + ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign}, }; +pub use array::StdArray; pub use decomposed::BitDecomposed; use generic_array::ArrayLength; pub use into_shares::IntoShares; @@ -21,7 +69,11 @@ use rand::{ use replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}; pub use scheme::{Bitwise, Linear, LinearRefOps, SecretSharing}; -use crate::ff::{AddSub, AddSubAssign, Serializable}; +use crate::{ + ff::{AddSub, AddSubAssign, Field, Fp32BitPrime, Serializable}, + helpers::Message, + protocol::prss::FromRandom, +}; /// Operations supported for weak shared values. pub trait Additive: @@ -57,13 +109,140 @@ pub trait Block: Sized + Copy + Debug { /// (capable of supporting addition and multiplication) is desired, the `Field` trait extends /// `SharedValue` to require multiplication. pub trait SharedValue: - Clone + Copy + Eq + Debug + Send + Sync + Sized + Additive + Serializable + 'static + Clone + + Copy + + Eq + + Debug + + Send + + Sync + + Sized + + Additive + + Serializable + + Vectorizable<1> + + 'static { type Storage: Block; const BITS: u32; const ZERO: Self; + + // Note the trait bound of `Vectorizable<1>` here, i.e., these + // helpers only apply to arrays of a single element. + fn into_array(self) -> A + where + Self: Vectorizable<1, Array = A>, + A: SharedValueArray, + { + once(self).collect::() + } + + fn from_array(array: &A) -> Self + where + Self: Vectorizable<1, Array = A>, + A: SharedValueArray, + { + array.get(0) + } + + fn from_array_mut(array: &mut A) -> &mut Self + where + Self: Vectorizable<1, Array = A>, + A: SharedValueArray, + { + array.get_mut(0) + } +} + +// Note that we can either make `trait Vectorizable: SharedValue`, or we can make `trait +// SharedValue: Vectorizable<1>`, but doing both creates a cycle. (Similarly for +// `FieldVectorizable` / `Field`.) +// +// Although it is somewhat unnatural, we choose to do the latter, because it allows existing +// high-level protocols unaware of vectorization to call vectorized versions of core protocols (with +// width of 1) without updating all of the trait bounds. This does mean that the trait definitions +// do not prevent implementing `Vectorizable` for something that is not a `SharedValue`, but please +// don't do that. + +/// Trait for `SharedValue`s supporting operations on `N`-wide vectors. +pub trait Vectorizable: Sized { + type Array: SharedValueArray; +} + +/// Trait for `Field`s supporting operations on `N`-wide vectors. +/// +/// We would like `F` to be `FieldVectorizable` if it satisfies all of the following: +/// 1. `F: Field`. +/// 2. `>::Array: FieldArray`. Rust does not support expressing a +/// constraint on a super-trait's associated type directly. Instead, this effect is achieved +/// by constraining the `ArrayAlias` associated type and then constraining that +/// `Vectorizable::Array == FieldVectorizable::ArrayAlias` where necessary (e.g. in the +/// definition and blanket impl of the `FieldSimd` trait. We call it `ArrayAlias` instead of +/// `Array` so that references to the `Array` associated type do not require qualification +/// with a trait name. +/// 3. `F: Vectorizable`. This is implied by the previous two, because `FieldArray` +/// is a sub-trait of `SharedValueArray`. +pub trait FieldVectorizable: SharedValue + Sized { + type ArrayAlias: FieldArray; +} + +// We could define a `SharedValueSimd` trait that is the analog of this for `SharedValue`s, but +// there are not currently any protocols that need it. +pub trait FieldSimd: + Field + Vectorizable>::ArrayAlias> + FieldVectorizable +{ +} + +// Portions of the implementation treat non-vectorized operations as a vector with `N = 1`. This +// blanket impl (and the fact that `F: Field` is the only trait bound) is important in allowing code +// that writes `F: Field` to continue working without modification. +impl FieldSimd<1> for F {} + +// Supported vectorizations + +impl FieldSimd<32> for Fp32BitPrime {} + +pub trait SharedValueArray: + Clone + + Eq + + Debug + + Send + + Sync + + Sized + + TryFrom, Error = ()> + + FromIterator + + IntoIterator + + Add + + for<'a> Add<&'a Self, Output = Self> + + AddAssign + + for<'a> AddAssign<&'a Self> + + Neg + + Sub + + for<'a> Sub<&'a Self, Output = Self> + + SubAssign + + for<'a> SubAssign<&'a Self> + + Message +{ + const ZERO: Self; + + fn from_fn V>(f: F) -> Self; + + fn get(&self, index: usize) -> V; + + fn get_mut(&mut self, index: usize) -> &mut V; + + fn set(&mut self, index: usize, value: V); +} + +// Some `SharedValue` types (and thus their arrays) implement `FromRandom`, but `RP25519` does not. +// We overload this distinction on `FieldArray` instead of creating a separate `ArrayFromRandom` trait, +// to avoid making the `Vectorizable` / `FieldVectorizable` situation that much more complicated. +pub trait FieldArray: + SharedValueArray + + FromRandom + + for<'a> Mul<&'a F, Output = Self> + + for<'a> Mul<&'a Self, Output = Self> +{ } #[cfg(any(test, feature = "test-fixture", feature = "cli"))] @@ -85,6 +264,29 @@ where } } +#[cfg(any(test, feature = "test-fixture", feature = "cli"))] +impl IntoShares> for [V; N] +where + V: SharedValue + Vectorizable, + Standard: Distribution, +{ + fn share_with(self, rng: &mut R) -> [AdditiveShare; 3] { + // For arrays large enough that the compiler doesn't just unroll everything, it might be + // more efficient to avoid the intermediate vector by implementing this as a specialized + // hybrid of the impls for `F as IntoShares>` and ` as + // IntoShares>`. Not bothering since this is test-support functionality. + let [v1, v2, v3] = self.into_iter().share_with(rng); + let (v1l, v1r): (Vec, Vec) = v1.iter().map(AdditiveShare::as_tuple).unzip(); + let (v2l, v2r): (Vec, Vec) = v2.iter().map(AdditiveShare::as_tuple).unzip(); + let (v3l, v3r): (Vec, Vec) = v3.iter().map(AdditiveShare::as_tuple).unzip(); + [ + AdditiveShare::new_arr(v1l.try_into().unwrap(), v1r.try_into().unwrap()), + AdditiveShare::new_arr(v2l.try_into().unwrap(), v2r.try_into().unwrap()), + AdditiveShare::new_arr(v3l.try_into().unwrap(), v3r.try_into().unwrap()), + ] + } +} + #[cfg(all(test, unit_test))] mod tests { use crate::{ diff --git a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs index a1011fce6..319a438c7 100644 --- a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs +++ b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs @@ -1,6 +1,6 @@ use std::{ fmt::{Debug, Formatter}, - ops::{Add, AddAssign, Mul, Neg, Sub, SubAssign}, + ops::{Add, AddAssign, Mul, Neg, Range, Sub, SubAssign}, }; use generic_array::{ArrayLength, GenericArray}; @@ -9,23 +9,37 @@ use typenum::Unsigned; use crate::{ ff::{ArrayAccess, Expand, Field, Serializable}, secret_sharing::{ - replicated::ReplicatedSecretSharing, Linear as LinearSecretSharing, SecretSharing, - SharedValue, + replicated::ReplicatedSecretSharing, FieldSimd, Linear as LinearSecretSharing, + SecretSharing, SharedValue, SharedValueArray, Vectorizable, }, }; +/// Additive secret sharing. +/// +/// `AdditiveShare` holds two out of three shares of an additive secret sharing, either of a single +/// value with type `V`, or a vector of such values. #[derive(Clone, PartialEq, Eq)] -pub struct AdditiveShare(V, V); +pub struct AdditiveShare, const N: usize = 1>( + >::Array, + >::Array, +); #[derive(Clone, PartialEq, Eq)] -pub struct ASIterator(pub T, pub T); +pub struct ASIterator<'a, S: SharedValue + ArrayAccess> { + range: Range, + share: &'a AdditiveShare, +} -impl SecretSharing for AdditiveShare { - const ZERO: Self = AdditiveShare::ZERO; +impl, const N: usize> SecretSharing for AdditiveShare { + const ZERO: Self = Self( + >::Array::ZERO, + >::Array::ZERO, + ); } -impl LinearSecretSharing for AdditiveShare {} -impl Debug for AdditiveShare { +impl LinearSecretSharing for AdditiveShare where F: Field + FieldSimd {} + +impl + Debug, const N: usize> Debug for AdditiveShare { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!(f, "({:?}, {:?})", self.0, self.1) } @@ -37,26 +51,48 @@ impl Default for AdditiveShare { } } -impl AdditiveShare { - /// Replicated secret share where both left and right values are `F::ZERO` - pub const ZERO: Self = Self(V::ZERO, V::ZERO); +impl, const N: usize> AdditiveShare { + /// Replicated secret share where both left and right values are `V::ZERO` + pub const ZERO: Self = Self( + >::Array::ZERO, + >::Array::ZERO, + ); +} +impl AdditiveShare { pub fn as_tuple(&self) -> (V, V) { - (self.0, self.1) + (V::from_array(&self.0), V::from_array(&self.1)) } } -impl ReplicatedSecretSharing for AdditiveShare { +impl ReplicatedSecretSharing for AdditiveShare +where + V: SharedValue + Vectorizable<1>, +{ fn new(a: V, b: V) -> Self { - Self(a, b) + Self(a.into_array(), b.into_array()) } fn left(&self) -> V { - self.0 + V::from_array(&self.0) } fn right(&self) -> V { - self.1 + V::from_array(&self.1) + } +} + +impl, const N: usize> AdditiveShare { + pub fn new_arr(a: >::Array, b: >::Array) -> Self { + Self(a, b) + } + + pub fn left_arr(&self) -> &>::Array { + &self.0 + } + + pub fn right_arr(&self) -> &>::Array { + &self.1 } } @@ -86,15 +122,20 @@ where } } -impl<'a, 'b, V: SharedValue> Add<&'b AdditiveShare> for &'a AdditiveShare { - type Output = AdditiveShare; +impl<'a, 'b, V: SharedValue + Vectorizable, const N: usize> Add<&'b AdditiveShare> + for &'a AdditiveShare +{ + type Output = AdditiveShare; - fn add(self, rhs: &'b AdditiveShare) -> Self::Output { - AdditiveShare(self.0 + rhs.0, self.1 + rhs.1) + fn add(self, rhs: &'b AdditiveShare) -> Self::Output { + AdditiveShare( + Add::add(self.0.clone(), &rhs.0), + Add::add(self.1.clone(), &rhs.1), + ) } } -impl Add for AdditiveShare { +impl, const N: usize> Add for AdditiveShare { type Output = Self; fn add(self, rhs: Self) -> Self::Output { @@ -102,15 +143,19 @@ impl Add for AdditiveShare { } } -impl Add> for &AdditiveShare { - type Output = AdditiveShare; +impl, const N: usize> Add> + for &AdditiveShare +{ + type Output = AdditiveShare; - fn add(self, rhs: AdditiveShare) -> Self::Output { + fn add(self, rhs: AdditiveShare) -> Self::Output { Add::add(self, &rhs) } } -impl Add<&AdditiveShare> for AdditiveShare { +impl, const N: usize> Add<&AdditiveShare> + for AdditiveShare +{ type Output = Self; fn add(self, rhs: &Self) -> Self::Output { @@ -118,28 +163,28 @@ impl Add<&AdditiveShare> for AdditiveShare { } } -impl AddAssign<&Self> for AdditiveShare { +impl, const N: usize> AddAssign<&Self> for AdditiveShare { fn add_assign(&mut self, rhs: &Self) { - self.0 += rhs.0; - self.1 += rhs.1; + self.0 += &rhs.0; + self.1 += &rhs.1; } } -impl AddAssign for AdditiveShare { +impl, const N: usize> AddAssign for AdditiveShare { fn add_assign(&mut self, rhs: Self) { AddAssign::add_assign(self, &rhs); } } -impl Neg for &AdditiveShare { - type Output = AdditiveShare; +impl, const N: usize> Neg for &AdditiveShare { + type Output = AdditiveShare; fn neg(self) -> Self::Output { - AdditiveShare(-self.0, -self.1) + AdditiveShare(-self.0.clone(), -self.1.clone()) } } -impl Neg for AdditiveShare { +impl, const N: usize> Neg for AdditiveShare { type Output = Self; fn neg(self) -> Self::Output { @@ -147,15 +192,18 @@ impl Neg for AdditiveShare { } } -impl Sub for &AdditiveShare { - type Output = AdditiveShare; +impl, const N: usize> Sub for &AdditiveShare { + type Output = AdditiveShare; fn sub(self, rhs: Self) -> Self::Output { - AdditiveShare(self.0 - rhs.0, self.1 - rhs.1) + AdditiveShare( + Sub::sub(self.0.clone(), &rhs.0), + Sub::sub(self.1.clone(), &rhs.1), + ) } } -impl Sub for AdditiveShare { +impl, const N: usize> Sub for AdditiveShare { type Output = Self; fn sub(self, rhs: Self) -> Self::Output { @@ -163,7 +211,7 @@ impl Sub for AdditiveShare { } } -impl Sub<&Self> for AdditiveShare { +impl, const N: usize> Sub<&Self> for AdditiveShare { type Output = Self; fn sub(self, rhs: &Self) -> Self::Output { @@ -171,53 +219,64 @@ impl Sub<&Self> for AdditiveShare { } } -impl Sub> for &AdditiveShare { - type Output = AdditiveShare; +impl, const N: usize> Sub> + for &AdditiveShare +{ + type Output = AdditiveShare; - fn sub(self, rhs: AdditiveShare) -> Self::Output { + fn sub(self, rhs: AdditiveShare) -> Self::Output { Sub::sub(self, &rhs) } } -impl SubAssign<&Self> for AdditiveShare { +impl, const N: usize> SubAssign<&Self> for AdditiveShare { fn sub_assign(&mut self, rhs: &Self) { - self.0 -= rhs.0; - self.1 -= rhs.1; + self.0 -= &rhs.0; + self.1 -= &rhs.1; } } -impl SubAssign for AdditiveShare { +impl, const N: usize> SubAssign for AdditiveShare { fn sub_assign(&mut self, rhs: Self) { SubAssign::sub_assign(self, &rhs); } } -impl<'a, 'b, F: Field> Mul<&'b F> for &'a AdditiveShare { - type Output = AdditiveShare; +impl<'a, 'b, F, const N: usize> Mul<&'b F> for &'a AdditiveShare +where + F: Field + FieldSimd, +{ + type Output = AdditiveShare; fn mul(self, rhs: &'b F) -> Self::Output { - AdditiveShare(self.0 * *rhs, self.1 * *rhs) + AdditiveShare(self.0.clone() * rhs, self.1.clone() * rhs) } } -impl Mul for AdditiveShare { +impl Mul for AdditiveShare +where + F: Field + FieldSimd, +{ type Output = Self; fn mul(self, rhs: F) -> Self::Output { - Mul::mul(&self, &rhs) + Mul::mul(&self, rhs) } } -impl Mul<&F> for AdditiveShare { +impl<'a, F: Field + FieldSimd, const N: usize> Mul<&'a F> for AdditiveShare { type Output = Self; fn mul(self, rhs: &F) -> Self::Output { - Mul::mul(&self, rhs) + Mul::mul(&self, *rhs) } } -impl Mul for &AdditiveShare { - type Output = AdditiveShare; +impl Mul for &AdditiveShare +where + F: Field + FieldSimd, +{ + type Output = AdditiveShare; fn mul(self, rhs: F) -> Self::Output { Mul::mul(self, &rhs) @@ -230,11 +289,15 @@ impl From<(V, V)> for AdditiveShare { } } -impl + SharedValue> std::ops::Not for AdditiveShare { +impl std::ops::Not for AdditiveShare +where + V: SharedValue + Vectorizable, + >::Array: std::ops::Not>::Array>, +{ type Output = Self; fn not(self) -> Self::Output { - AdditiveShare(!(self.0), !(self.1)) + AdditiveShare(!self.0, !self.1) } } @@ -261,55 +324,79 @@ where } /// Implement `ArrayAccess` for `AdditiveShare` over `SharedValue` that implements `ArrayAccess` -impl ArrayAccess for AdditiveShare +// You can think of S as a Boolean array type and V as Boolean. +impl ArrayAccess for AdditiveShare where - S: ArrayAccess + SharedValue, - ::Output: SharedValue, + S: SharedValue + ArrayAccess, + V: SharedValue + Vectorizable<1, Array = A>, + A: SharedValueArray, { - type Output = AdditiveShare<::Output>; - type Iter<'a> = ASIterator>; + type Output = AdditiveShare; + type Iter<'a> = ASIterator<'a, S>; fn get(&self, index: usize) -> Option { - self.0 + S::from_array(&self.0) .get(index) - .zip(self.1.get(index)) - .map(|v| AdditiveShare(v.0, v.1)) + .zip(S::from_array(&self.1).get(index)) + .map(|v| AdditiveShare(v.0.into_array(), v.1.into_array())) } fn set(&mut self, index: usize, e: Self::Output) { - self.0.set(index, e.0); - self.1.set(index, e.1); + S::from_array_mut(&mut self.0).set(index, V::from_array(&e.0)); + S::from_array_mut(&mut self.1).set(index, V::from_array(&e.1)); } fn iter(&self) -> Self::Iter<'_> { - ASIterator(self.0.iter(), self.1.iter()) + ASIterator { + range: Range { + start: 0, + end: S::from_array(&self.0).iter().len(), + }, + share: self, + } } } -impl Expand for AdditiveShare +impl Expand for AdditiveShare where - S: Expand + SharedValue, - ::Input: SharedValue, + S: Expand + SharedValue + Vectorizable<1, Array = A>, + A: SharedValueArray, + T: SharedValue, { type Input = AdditiveShare<::Input>; fn expand(v: &Self::Input) -> Self { - AdditiveShare(S::expand(&v.0), S::expand(&v.1)) + AdditiveShare( + S::expand(&T::from_array(&v.0)).into_array(), + S::expand(&T::from_array(&v.1)).into_array(), + ) } } -impl Iterator for ASIterator +impl<'a, S, T> Iterator for ASIterator<'a, S> where - T: Iterator, - T::Item: SharedValue, + S: SharedValue + ArrayAccess, + T: SharedValue, { - type Item = AdditiveShare; + type Item = AdditiveShare; fn next(&mut self) -> Option { - match (self.0.next(), self.1.next()) { - (Some(left), Some(right)) => Some(AdditiveShare(left, right)), - _ => None, - } + self.range.next().map(|i| { + AdditiveShare( + S::from_array(&self.share.0).get(i).unwrap().into_array(), + S::from_array(&self.share.1).get(i).unwrap().into_array(), + ) + }) + } +} + +impl<'a, S> ExactSizeIterator for ASIterator<'a, S> +where + S: SharedValue + ArrayAccess, + ::Output: SharedValue, +{ + fn len(&self) -> usize { + self.range.len() } } @@ -370,8 +457,14 @@ mod tests { a3: &AdditiveShare, expected_value: u128, ) { - assert_eq!(a1.0 + a2.0 + a3.0, Fp31::truncate_from(expected_value)); - assert_eq!(a1.1 + a2.1 + a3.1, Fp31::truncate_from(expected_value)); + assert_eq!( + a1.left() + a2.left() + a3.left(), + Fp31::truncate_from(expected_value) + ); + assert_eq!( + a1.right() + a2.right() + a3.right(), + Fp31::truncate_from(expected_value) + ); } fn addition_test_case(a: (u8, u8, u8), b: (u8, u8, u8), expected_output: u128) { diff --git a/ipa-core/src/test_fixture/circuit.rs b/ipa-core/src/test_fixture/circuit.rs index 8e8e4ac99..1fce74ead 100644 --- a/ipa-core/src/test_fixture/circuit.rs +++ b/ipa-core/src/test_fixture/circuit.rs @@ -1,4 +1,5 @@ use futures_util::future::join_all; +use rand::distributions::{Distribution, Standard}; use super::join3v; use crate::{ @@ -10,18 +11,20 @@ use crate::{ RecordId, }, rand::thread_rng, - secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, IntoShares}, - test_fixture::{narrow_contexts, Reconstruct, TestWorld}, + secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, FieldSimd, IntoShares}, + test_fixture::{narrow_contexts, ReconstructArr, TestWorld}, }; /// Creates an arithmetic circuit with the given width and depth. /// /// # Panics /// panics when circuits did not produce the expected value. -pub async fn arithmetic(width: u32, depth: u8) +pub async fn arithmetic(width: u32, depth: u16) where - F: Field + IntoShares>, - for<'a> Replicated: SecureMul>, + F: Field + FieldSimd, + for<'a> Replicated: SecureMul>, + [F; N]: IntoShares>, + Standard: Distribution, { let world = TestWorld::default(); // Re-use contexts for the entire execution because record identifiers are contiguous. @@ -35,31 +38,40 @@ where #[allow(clippy::disallowed_methods)] // Just for testing purposes. let results = join_all(multiplications).await; - let mut sum = 0; + let mut sum = [0u128; N]; for line in results { - sum += line.reconstruct().as_u128(); + for (this_sum, this_value) in sum.iter_mut().zip(line.reconstruct_arr()) { + *this_sum += this_value.as_u128(); + } } - assert_eq!(sum, u128::from(width)); + assert_eq!(sum, [u128::from(width); N]); } -async fn circuit<'a, F>( +async fn circuit<'a, F, const N: usize>( top_ctx: &[SemiHonestContext<'a>; 3], record_id: RecordId, - depth: u8, -) -> [Replicated; 3] + depth: u16, +) -> [Replicated; 3] where - F: Field + IntoShares>, - Replicated: SecureMul>, + F: Field + FieldSimd, + Replicated: SecureMul>, + [F; N]: IntoShares>, { - let mut a = F::ONE.share_with(&mut thread_rng()); + assert_eq!( + depth % u16::try_from(N).unwrap(), + 0, + "depth must be a multiple of vectorization factor" + ); + + let mut a = [F::ONE; N].share_with(&mut thread_rng()); - for bit in 0..depth { - let b = F::ONE.share_with(&mut thread_rng()); - let bit_ctx = narrow_contexts(top_ctx, &format!("b{bit}")); + for stripe in 0..(depth / u16::try_from(N).unwrap()) { + let b = [F::ONE; N].share_with(&mut thread_rng()); + let stripe_ctx = narrow_contexts(top_ctx, &format!("s{stripe}")); a = async move { let mut coll = Vec::new(); - for (i, ctx) in bit_ctx.iter().enumerate() { + for (i, ctx) in stripe_ctx.iter().enumerate() { let mul = a[i].multiply( &b[i], ctx.narrow("mult") diff --git a/ipa-core/src/test_fixture/mod.rs b/ipa-core/src/test_fixture/mod.rs index acfb8f853..e383d4db0 100644 --- a/ipa-core/src/test_fixture/mod.rs +++ b/ipa-core/src/test_fixture/mod.rs @@ -23,7 +23,7 @@ pub use event_gen::{Config as EventGeneratorConfig, EventGenerator}; use futures::TryFuture; use rand::{distributions::Standard, prelude::Distribution, rngs::mock::StepRng}; use rand_core::{CryptoRng, RngCore}; -pub use sharing::{get_bits, into_bits, Reconstruct}; +pub use sharing::{get_bits, into_bits, Reconstruct, ReconstructArr}; #[cfg(feature = "in-memory-infra")] pub use world::{Runner, TestWorld, TestWorldConfig}; diff --git a/ipa-core/src/test_fixture/sharing.rs b/ipa-core/src/test_fixture/sharing.rs index a9ac85cf3..95eba9902 100644 --- a/ipa-core/src/test_fixture/sharing.rs +++ b/ipa-core/src/test_fixture/sharing.rs @@ -9,7 +9,7 @@ use crate::{ semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing, }, - BitDecomposed, SecretSharing, + BitDecomposed, FieldSimd, SecretSharing, Vectorizable, }, }; @@ -20,7 +20,7 @@ pub fn into_bits(v: F) -> BitDecomposed { }) } -/// Deconstructs a value into N values, one for each bi3t. +/// Deconstructs a value into N values, one for each bit. /// # Panics /// It won't #[must_use] @@ -37,6 +37,19 @@ pub trait Reconstruct { fn reconstruct(&self) -> T; } +/// Alternate version of `Reconstruct` for vectors. +/// +/// There is no difference in the traits, but this avoids having to add +/// type annotations everywhere to disambiguate whether a single-bit +/// result should be reconstructed as `F` or `[F; 1]`. +pub trait ReconstructArr { + /// Validates correctness of the secret sharing scheme. + /// + /// # Panics + /// Panics if the given input is not a valid replicated secret share. + fn reconstruct_arr(&self) -> T; +} + impl Reconstruct for [&Replicated; 3] { fn reconstruct(&self) -> F { let s0 = &self[0]; @@ -62,6 +75,27 @@ impl Reconstruct for [Replicated; 3] { } } +impl, const N: usize> ReconstructArr<>::Array> + for [Replicated; 3] +{ + fn reconstruct_arr(&self) -> >::Array { + let s0l = self[0].left_arr(); + let s0r = self[0].right_arr(); + let s1l = self[1].left_arr(); + let s1r = self[1].right_arr(); + let s2l = self[2].left_arr(); + let s2r = self[2].right_arr(); + + assert_eq!(s0l.clone() + s1l + s2l, s0r.clone() + s1r + s2r); + + assert_eq!(s0r, s1l); + assert_eq!(s1r, s2l); + assert_eq!(s2r, s0l); + + s0l.clone() + s1l + s2l + } +} + impl Reconstruct<(V, W)> for [(T, U); 3] where for<'t> [&'t T; 3]: Reconstruct, From b844b18bbe4c6e1215f79e1a7951d0121d7f63f2 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Wed, 17 Jan 2024 12:59:45 -0800 Subject: [PATCH 012/135] Coverage improvements --- ipa-core/src/ff/boolean_array.rs | 13 +++ ipa-core/src/ff/galois_field.rs | 26 ----- ipa-core/src/secret_sharing/array.rs | 107 ++++++++++++++++++ .../replicated/semi_honest/additive_share.rs | 104 ++++++++++++++++- 4 files changed, 221 insertions(+), 29 deletions(-) diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index e733264f7..972f80fe3 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -462,6 +462,7 @@ macro_rules! boolean_array_impl { use crate::secret_sharing::replicated::ReplicatedSecretSharing; let bits = AdditiveShare::new(ONE, ONE); let iter = bits.into_iter(); + assert_eq!(iter.len(), $bits); for (i, j) in iter.enumerate() { if i == 0 { assert_eq!(j, AdditiveShare::new(Boolean::ONE, Boolean::ONE)); @@ -471,6 +472,18 @@ macro_rules! boolean_array_impl { } } + #[test] + fn iterate_secret_shared_boolean_array_len() { + use crate::secret_sharing::replicated::ReplicatedSecretSharing; + let bits = AdditiveShare::new(ONE, ONE); + let mut iter = bits.into_iter(); + assert_eq!(iter.len(), $bits); + for b in (0..$bits).rev() { + iter.next().unwrap(); + assert_eq!(iter.len(), b); + } + } + #[test] fn serde() { let ba = thread_rng().gen::<$name>(); diff --git a/ipa-core/src/ff/galois_field.rs b/ipa-core/src/ff/galois_field.rs index 64a345f6f..040d95ec3 100644 --- a/ipa-core/src/ff/galois_field.rs +++ b/ipa-core/src/ff/galois_field.rs @@ -703,31 +703,5 @@ bit_array_impl!( v } } - - impl From for bool { - fn from(value: Gf2) -> Self { - value != Gf2::ZERO - } - } - - impl From for Gf2 { - fn from(value: crate::ff::boolean::Boolean) -> Self { - bool::from(value).into() - } - } - - impl From for crate::ff::boolean::Boolean { - fn from(value: Gf2) -> Self { - bool::from(value).into() - } - } - - impl std::ops::Not for Gf2 { - type Output = Self; - - fn not(self) -> Self { - (!bool::from(self)).into() - } - } } ); diff --git a/ipa-core/src/secret_sharing/array.rs b/ipa-core/src/secret_sharing/array.rs index f05cc30dc..316178be8 100644 --- a/ipa-core/src/secret_sharing/array.rs +++ b/ipa-core/src/secret_sharing/array.rs @@ -313,3 +313,110 @@ where } impl Message for StdArray where Self: Serializable {} + +#[cfg(all(test, unit_test))] +mod test { + use proptest::{ + prelude::{prop, Arbitrary, Strategy}, + proptest, + }; + + use super::*; + + impl Arbitrary for StdArray + where + [V; N]: Arbitrary, + { + type Parameters = <[V; N] as Arbitrary>::Parameters; + type Strategy = prop::strategy::Map<<[V; N] as Arbitrary>::Strategy, fn([V; N]) -> Self>; + + fn arbitrary_with(args: Self::Parameters) -> Self::Strategy { + <[V; N]>::arbitrary_with(args).prop_map(Self) + } + } + + proptest! { + #[test] + fn add(a: StdArray, b: StdArray) { + let expected = StdArray([a.0[0] + b.0[0], a.0[1] + b.0[1]]); + let sum1 = &a + &b; + let sum2 = &a + b.clone(); + let sum3 = a.clone() + &b; + let sum4 = a + b; + assert_eq!(sum1, expected); + assert_eq!(sum2, expected); + assert_eq!(sum3, expected); + assert_eq!(sum4, expected); + } + + #[test] + fn add_assign(a: StdArray, b: StdArray) { + let expected = StdArray([a.0[0] + b.0[0], a.0[1] + b.0[1]]); + let mut sum1 = a.clone(); + let mut sum2 = a.clone(); + sum1 += &b; + sum2 += b; + assert_eq!(sum1, expected); + assert_eq!(sum2, expected); + } + + #[test] + fn sub(a: StdArray, b: StdArray) { + let expected = StdArray([a.0[0] - b.0[0], a.0[1] - b.0[1]]); + let diff1 = &a - &b; + let diff2 = &a - b.clone(); + let diff3 = a.clone() - &b; + let diff4 = a - b; + assert_eq!(diff1, expected); + assert_eq!(diff2, expected); + assert_eq!(diff3, expected); + assert_eq!(diff4, expected); + } + + #[test] + fn sub_assign(a: StdArray, b: StdArray) { + let expected = StdArray([a.0[0] - b.0[0], a.0[1] - b.0[1]]); + let mut diff1 = a.clone(); + let mut diff2 = a.clone(); + diff1 -= &b; + diff2 -= b; + assert_eq!(diff1, expected); + assert_eq!(diff2, expected); + } + + #[test] + fn mul_scalar(a: StdArray, b: Fp32BitPrime) { + let expected = StdArray([a.0[0] * b, a.0[1] * b]); + let b_ref = &b; // clippy complains inline ref to Copy type is needless + let prod1 = &a * b_ref; + let prod2 = &a * b; + let prod3 = a.clone() * b_ref; + let prod4 = a * b; + assert_eq!(prod1, expected); + assert_eq!(prod2, expected); + assert_eq!(prod3, expected); + assert_eq!(prod4, expected); + } + + #[test] + fn into_iter(a: StdArray) { + let expected = a.clone(); + let copy: StdArray = a.into_iter() + .collect::>() + .try_into() + .unwrap(); + assert_eq!(copy, expected); + } + + #[test] + fn get_set(mut a: StdArray, b: Fp32BitPrime, c: Fp32BitPrime) { + assert_eq!(a.get(0), a.0[0]); + a.set(0, b); + assert_eq!(a.get(0), b); + *a.get_mut(0) = c; + assert_eq!(a.get(0), c); + let from_fn = StdArray::::from_fn(|i| a.0[i]); + assert_eq!(from_fn, a); + } + } +} diff --git a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs index 319a438c7..b998b67c4 100644 --- a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs +++ b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs @@ -419,10 +419,17 @@ where #[cfg(all(test, unit_test))] mod tests { - use super::AdditiveShare; + use proptest::{ + prelude::{prop, Arbitrary, Strategy}, + proptest, + }; + + use super::*; use crate::{ - ff::{Field, Fp31}, - secret_sharing::replicated::ReplicatedSecretSharing, + ff::{Field, Fp31, Fp32BitPrime}, + secret_sharing::{ + replicated::ReplicatedSecretSharing, SharedValue, StdArray, Vectorizable, + }, }; fn secret_share( @@ -565,4 +572,95 @@ mod tests { mult_by_constant_test_case((0, 0, 1), 2, 2); mult_by_constant_test_case((0, 0, 0), 2, 0); } + + impl Arbitrary for AdditiveShare + where + V: Vectorizable>, + StdArray: Arbitrary, + { + type Parameters = <(StdArray, StdArray) as Arbitrary>::Parameters; + type Strategy = prop::strategy::Map< + <(StdArray, StdArray) as Arbitrary>::Strategy, + fn((StdArray, StdArray)) -> Self, + >; + + fn arbitrary_with(args: Self::Parameters) -> Self::Strategy { + <(StdArray, StdArray)>::arbitrary_with(args) + .prop_map(|(l, r)| AdditiveShare::new_arr(l, r)) + } + } + + proptest! { + #[test] + fn vector_add_assign_proptest(a: AdditiveShare, b: AdditiveShare) { + let left_sum = a.left_arr() + b.left_arr(); + let right_sum = a.right_arr() + b.right_arr(); + let expected = AdditiveShare::new_arr(left_sum, right_sum); + let mut sum1 = a.clone(); + let mut sum2 = a; + sum1 += &b; + sum2 += b; + assert_eq!(sum1, expected); + assert_eq!(sum2, expected); + } + + #[test] + fn sub_proptest(a: AdditiveShare, b: AdditiveShare) { + let left_diff = a.left() - b.left(); + let right_diff = a.right() - b.right(); + let expected = AdditiveShare::new(left_diff, right_diff); + let diff1 = &a - &b; + let diff2 = &a - b.clone(); + let diff3 = a.clone() - &b; + let diff4 = a - b; + assert_eq!(diff1, expected); + assert_eq!(diff2, expected); + assert_eq!(diff3, expected); + assert_eq!(diff4, expected); + } + + #[test] + fn vector_sub_proptest(a: AdditiveShare, b: AdditiveShare) { + let left_diff = a.left_arr() - b.left_arr(); + let right_diff = a.right_arr() - b.right_arr(); + let expected = AdditiveShare::new_arr(left_diff, right_diff); + let diff1 = &a - &b; + let diff2 = &a - b.clone(); + let diff3 = a.clone() - &b; + let diff4 = a - b; + assert_eq!(diff1, expected); + assert_eq!(diff2, expected); + assert_eq!(diff3, expected); + assert_eq!(diff4, expected); + } + + #[test] + fn vector_sub_assign_proptest(a: AdditiveShare, b: AdditiveShare) { + let left_diff = a.left_arr() - b.left_arr(); + let right_diff = a.right_arr() - b.right_arr(); + let expected = AdditiveShare::new_arr(left_diff, right_diff); + let mut diff1 = a.clone(); + let mut diff2 = a; + diff1 -= &b; + diff2 -= b; + assert_eq!(diff1, expected); + assert_eq!(diff2, expected); + } + + #[test] + fn vector_mul_scalar_proptest(a: AdditiveShare, b: Fp32BitPrime) { + let left_prod = a.left_arr() * b; + let right_prod = a.right_arr() * b; + let expected = AdditiveShare::new_arr(left_prod, right_prod); + let b_ref = &b; // clippy complains inline ref to Copy type is needless + let prod1 = &a * b_ref; + let prod2 = &a * b; + let prod3 = a.clone() * b_ref; + let prod4 = a * b; + assert_eq!(prod1, expected); + assert_eq!(prod2, expected); + assert_eq!(prod3, expected); + assert_eq!(prod4, expected); + } + } } From 852eeaad0dfa6c6385a7e93b992728c17256dec2 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 18 Jan 2024 09:52:02 -0800 Subject: [PATCH 013/135] One more coverage improvement, and a bug fix --- ipa-core/src/ff/galois_field.rs | 47 +++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/ipa-core/src/ff/galois_field.rs b/ipa-core/src/ff/galois_field.rs index 040d95ec3..9f27346cb 100644 --- a/ipa-core/src/ff/galois_field.rs +++ b/ipa-core/src/ff/galois_field.rs @@ -140,7 +140,7 @@ fn clmul(a: GF, b: GF) -> u128 { /// is that this type is not `Send`. /// /// [`BitValIter`]: bitvec::slice::BitValIter -pub struct BoolIterator<'a>(Iter<'a, u8, Lsb0>); +pub struct BoolIterator<'a>(std::iter::Take>); impl<'a> Iterator for BoolIterator<'a> { type Item = bool; fn next(&mut self) -> Option { @@ -218,7 +218,7 @@ macro_rules! bit_array_impl { } fn iter(&self) -> Self::Iter<'_> { - BoolIterator(self.0.iter()) + BoolIterator(self.0.iter().take(<$name>::BITS as usize)) } } @@ -489,10 +489,22 @@ macro_rules! bit_array_impl { mod tests { use super::*; use crate::{ff::GaloisField, secret_sharing::SharedValue}; + use proptest::proptest; + use proptest::prelude::{prop, Strategy, Arbitrary}; use rand::{thread_rng, Rng}; + use std::ops::RangeInclusive; const MASK: u128 = u128::MAX >> (u128::BITS - <$name>::BITS); + impl Arbitrary for $name { + type Parameters = (); + type Strategy = prop::strategy::Map, fn(u128) -> Self>; + + fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { + (0..=MASK).prop_map(Field::truncate_from as _) + } + } + #[test] pub fn basic() { let zero = bitarr!(u8, Lsb0; 0; <$name>::BITS as usize); @@ -600,6 +612,37 @@ macro_rules! bit_array_impl { assert_eq!(a < b, $name::truncate_from(a) < $name::truncate_from(b)); } + proptest! { + #[test] + fn arrayaccess_get_set(mut a: $name, b: bool, c: bool) { + assert_eq!(a.get(0), Some(a.0[0])); + a.set(0, b); + assert_eq!(a.get(0), Some(b)); + a.set($bits - 1, c); + assert_eq!(a.get($bits - 1), Some(c)); + assert_eq!(a.get($bits), None); + } + + #[test] + fn arrayacces_iter(a: $name) { + let mut val = 0u128; + for (i, b) in a.iter().enumerate() { + val |= u128::from(b) << i; + } + assert_eq!(val, a.as_u128()); + } + + #[test] + fn arrayacces_iter_len(a: $name) { + let mut iter = a.iter(); + assert_eq!(iter.len(), $bits); + for i in (0..$bits).rev() { + iter.next().unwrap(); + assert_eq!(iter.len(), i); + } + } + } + #[test] pub fn serde() { let mut rng = thread_rng(); From 9be2138fc5dc962cde4f5c455ec533a701321739 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Mon, 22 Jan 2024 10:15:38 -0800 Subject: [PATCH 014/135] Improved BA/GF iteration tests Closes #865 --- ipa-core/src/ff/boolean_array.rs | 72 +++++++++++++++++--------------- ipa-core/src/ff/galois_field.rs | 19 +++------ 2 files changed, 43 insertions(+), 48 deletions(-) diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index 972f80fe3..16e8b041f 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -284,6 +284,11 @@ macro_rules! boolean_array_impl { #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub struct $name(pub(super) Store); + impl $name { + #[cfg(all(test, unit_test))] + const STORE_LEN: usize = bitvec::mem::elts::($bits); + } + impl ArrayAccess for $name { type Output = Boolean; type Iter<'a> = BAIterator<'a>; @@ -427,12 +432,26 @@ macro_rules! boolean_array_impl { #[cfg(all(test, unit_test))] mod tests { + use proptest::{ + prelude::{prop, Arbitrary, Strategy}, + proptest, + }; use rand::{thread_rng, Rng}; use super::*; - // Only small BAs expose this via `Field`. - const ONE: $name = $name(bitarr_one!($bits)); + impl Arbitrary for $name { + type Parameters = <[u8; $name::STORE_LEN] as Arbitrary>::Parameters; + type Strategy = prop::strategy::Map< + <[u8; $name::STORE_LEN] as Arbitrary>::Strategy, + fn([u8; $name::STORE_LEN]) -> Self, + >; + + fn arbitrary_with(args: Self::Parameters) -> Self::Strategy { + <[u8; $name::STORE_LEN]>::arbitrary_with(args) + .prop_map(|arr| $name(Store::from(arr))) + } + } #[test] fn set_boolean_array() { @@ -444,46 +463,31 @@ macro_rules! boolean_array_impl { assert_eq!(ba.get(i), Some(a)); } - #[test] - fn iterate_boolean_array() { - let bits = ONE; - let iter = bits.iter(); - for (i, j) in iter.enumerate() { - if i == 0 { - assert_eq!(j, Boolean::ONE); - } else { - assert_eq!(j, Boolean::ZERO); + proptest! { + #[test] + fn iterate_boolean_array(a: $name) { + let mut iter = a.iter().enumerate(); + assert_eq!(iter.len(), $bits); + while let Some((i, b)) = iter.next() { + assert_eq!(bool::from(b), a.0[i]); + assert_eq!(iter.len(), $bits - 1 - i); } } - } - #[test] - fn iterate_secret_shared_boolean_array() { + #[test] + fn iterate_secret_shared_boolean_array(a: AdditiveShare<$name>) { use crate::secret_sharing::replicated::ReplicatedSecretSharing; - let bits = AdditiveShare::new(ONE, ONE); - let iter = bits.into_iter(); - assert_eq!(iter.len(), $bits); - for (i, j) in iter.enumerate() { - if i == 0 { - assert_eq!(j, AdditiveShare::new(Boolean::ONE, Boolean::ONE)); - } else { - assert_eq!(j, AdditiveShare::::ZERO); + let mut iter = a.iter().enumerate(); + assert_eq!(iter.len(), $bits); + while let Some((i, sb)) = iter.next() { + let left = Boolean::from(a.left().0[i]); + let right = Boolean::from(a.right().0[i]); + assert_eq!(sb, AdditiveShare::new(left, right)); + assert_eq!(iter.len(), $bits - 1 - i); } } } - #[test] - fn iterate_secret_shared_boolean_array_len() { - use crate::secret_sharing::replicated::ReplicatedSecretSharing; - let bits = AdditiveShare::new(ONE, ONE); - let mut iter = bits.into_iter(); - assert_eq!(iter.len(), $bits); - for b in (0..$bits).rev() { - iter.next().unwrap(); - assert_eq!(iter.len(), b); - } - } - #[test] fn serde() { let ba = thread_rng().gen::<$name>(); diff --git a/ipa-core/src/ff/galois_field.rs b/ipa-core/src/ff/galois_field.rs index 9f27346cb..df2ca6290 100644 --- a/ipa-core/src/ff/galois_field.rs +++ b/ipa-core/src/ff/galois_field.rs @@ -624,21 +624,12 @@ macro_rules! bit_array_impl { } #[test] - fn arrayacces_iter(a: $name) { - let mut val = 0u128; - for (i, b) in a.iter().enumerate() { - val |= u128::from(b) << i; - } - assert_eq!(val, a.as_u128()); - } - - #[test] - fn arrayacces_iter_len(a: $name) { - let mut iter = a.iter(); + fn arrayaccess_iter(a: $name) { + let mut iter = a.iter().enumerate(); assert_eq!(iter.len(), $bits); - for i in (0..$bits).rev() { - iter.next().unwrap(); - assert_eq!(iter.len(), i); + while let Some((i, b)) = iter.next() { + assert_eq!(u128::from(b), (a.as_u128() >> i) & 1); + assert_eq!(iter.len(), $bits - 1 - i); } } } From d15868c45ae461407ec9bb654bc35e91967d37c1 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Wed, 24 Jan 2024 16:49:27 -0800 Subject: [PATCH 015/135] PR feedback --- ipa-core/src/ff/mod.rs | 2 +- ipa-core/src/secret_sharing/array.rs | 32 ++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/ipa-core/src/ff/mod.rs b/ipa-core/src/ff/mod.rs index b831fd707..2b1e579e1 100644 --- a/ipa-core/src/ff/mod.rs +++ b/ipa-core/src/ff/mod.rs @@ -82,7 +82,7 @@ pub trait Serializable: Sized { pub trait ArrayAccess { type Output; - type Iter<'a>: Iterator + ExactSizeIterator + Send + type Iter<'a>: ExactSizeIterator + Send where Self: 'a; diff --git a/ipa-core/src/secret_sharing/array.rs b/ipa-core/src/secret_sharing/array.rs index 316178be8..7b9e09cff 100644 --- a/ipa-core/src/secret_sharing/array.rs +++ b/ipa-core/src/secret_sharing/array.rs @@ -15,6 +15,13 @@ use crate::{ secret_sharing::{FieldArray, SharedValue, SharedValueArray}, }; +/// Wrapper around `[V; N]`. +/// +/// This wrapper serves two purposes: +/// * It enables us to implement the `std::ops` traits, which the coherence rules +/// don't let us implement for `[V; N]`. +/// * It disables by-index access to individual elements of the array, which +/// should never be necessary in properly vectorized code. #[derive(Clone, Debug, Eq, PartialEq)] pub struct StdArray([V; N]); @@ -76,14 +83,16 @@ impl TryFrom> for StdArray { // Panics if the iterator terminates before producing N items. impl FromIterator for StdArray where - Self: Serializable, + Self: Serializable, // required for `::ZERO` { fn from_iter>(iter: T) -> Self { let mut res = Self::ZERO; let mut iter = iter.into_iter(); for i in 0..N { - res.0[i] = iter.next().unwrap(); + res.0[i] = iter + .next() + .unwrap_or_else(|| panic!("Expected iterator to produce {N} items, got only {i}")); } res @@ -316,6 +325,8 @@ impl Message for StdArray where Self: Seri #[cfg(all(test, unit_test))] mod test { + use std::iter; + use proptest::{ prelude::{prop, Arbitrary, Strategy}, proptest, @@ -408,6 +419,23 @@ mod test { assert_eq!(copy, expected); } + #[test] + #[allow(clippy::from_iter_instead_of_collect)] + fn from_iter(a: StdArray) { + let iter = a.0.iter().copied(); + let copy = StdArray::::from_iter(iter); + assert_eq!(copy, a); + } + } + + #[test] + #[should_panic(expected = "Expected iterator to produce 32 items, got only 0")] + #[allow(clippy::from_iter_instead_of_collect)] + fn from_short_iter() { + StdArray::::from_iter(iter::empty()); + } + + proptest! { #[test] fn get_set(mut a: StdArray, b: Fp32BitPrime, c: Fp32BitPrime) { assert_eq!(a.get(0), a.0[0]); From 84d81a7f541b21e531b0ff9db4bbbc6629a4dc9f Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 25 Jan 2024 12:27:52 -0800 Subject: [PATCH 016/135] Remove SharedValueArray get/set methods --- ipa-core/src/ff/boolean.rs | 3 ++ ipa-core/src/ff/boolean_array.rs | 3 ++ ipa-core/src/ff/curve_points.rs | 3 ++ ipa-core/src/ff/ec_prime_field.rs | 3 ++ ipa-core/src/ff/galois_field.rs | 4 +- ipa-core/src/ff/prime_field.rs | 6 ++- ipa-core/src/secret_sharing/array.rs | 35 +++++------------ ipa-core/src/secret_sharing/mod.rs | 59 ++++++++++++++++------------ 8 files changed, 63 insertions(+), 53 deletions(-) diff --git a/ipa-core/src/ff/boolean.rs b/ipa-core/src/ff/boolean.rs index f577c5ac1..c535914d8 100644 --- a/ipa-core/src/ff/boolean.rs +++ b/ipa-core/src/ff/boolean.rs @@ -4,6 +4,7 @@ use typenum::U1; use super::Gf32Bit; use crate::{ ff::{Field, Serializable}, + impl_shared_value_common, protocol::prss::FromRandomU128, secret_sharing::{ replicated::malicious::ExtendableField, Block, FieldVectorizable, SharedValue, StdArray, @@ -41,6 +42,8 @@ impl SharedValue for Boolean { type Storage = bool; const BITS: u32 = 1; const ZERO: Self = Self(false); + + impl_shared_value_common!(); } impl Vectorizable<1> for Boolean { diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index 16e8b041f..32ba62b8a 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -272,6 +272,7 @@ macro_rules! boolean_array_impl { use super::*; use crate::{ ff::{boolean::Boolean, ArrayAccess, Expand, Serializable}, + impl_shared_value_common, secret_sharing::{ replicated::semi_honest::{ASIterator, AdditiveShare}, SharedValue, @@ -317,6 +318,8 @@ macro_rules! boolean_array_impl { type Storage = Store; const BITS: u32 = $bits; const ZERO: Self = Self(::ZERO); + + impl_shared_value_common!(); } impl_serializable_trait!($name, $bits, Store, $deser_type); diff --git a/ipa-core/src/ff/curve_points.rs b/ipa-core/src/ff/curve_points.rs index f0db75b49..c89701ae4 100644 --- a/ipa-core/src/ff/curve_points.rs +++ b/ipa-core/src/ff/curve_points.rs @@ -7,6 +7,7 @@ use typenum::U32; use crate::{ ff::{ec_prime_field::Fp25519, Serializable}, + impl_shared_value_common, secret_sharing::{Block, SharedValue, StdArray, Vectorizable}, }; @@ -33,6 +34,8 @@ impl SharedValue for RP25519 { type Storage = CompressedRistretto; const BITS: u32 = 256; const ZERO: Self = Self(CompressedRistretto([0_u8; 32])); + + impl_shared_value_common!(); } impl Vectorizable<1> for RP25519 { diff --git a/ipa-core/src/ff/ec_prime_field.rs b/ipa-core/src/ff/ec_prime_field.rs index 4c03a6a6f..c2478c8cf 100644 --- a/ipa-core/src/ff/ec_prime_field.rs +++ b/ipa-core/src/ff/ec_prime_field.rs @@ -8,6 +8,7 @@ use typenum::U32; use crate::{ ff::{boolean_array::BA256, Field, Serializable}, + impl_shared_value_common, protocol::prss::FromRandomU128, secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, }; @@ -39,6 +40,8 @@ impl SharedValue for Fp25519 { type Storage = Scalar; const BITS: u32 = 256; const ZERO: Self = Self(Scalar::ZERO); + + impl_shared_value_common!(); } ///conversion to Scalar struct of `curve25519_dalek` diff --git a/ipa-core/src/ff/galois_field.rs b/ipa-core/src/ff/galois_field.rs index df2ca6290..1b7d1f526 100644 --- a/ipa-core/src/ff/galois_field.rs +++ b/ipa-core/src/ff/galois_field.rs @@ -13,7 +13,7 @@ use typenum::{Unsigned, U1, U2, U3, U4, U5}; use super::ArrayAccess; use crate::{ ff::{boolean_array::NonZeroPadding, Field, Serializable}, - impl_serializable_trait, + impl_serializable_trait, impl_shared_value_common, protocol::prss::FromRandomU128, secret_sharing::{Block, FieldVectorizable, SharedValue, Vectorizable}, }; @@ -173,6 +173,8 @@ macro_rules! bit_array_impl { type Storage = $store; const BITS: u32 = $bits; const ZERO: Self = Self(<$store>::ZERO); + + impl_shared_value_common!(); } impl Vectorizable<1> for $name { diff --git a/ipa-core/src/ff/prime_field.rs b/ipa-core/src/ff/prime_field.rs index 2f9694969..27e22a74e 100644 --- a/ipa-core/src/ff/prime_field.rs +++ b/ipa-core/src/ff/prime_field.rs @@ -4,7 +4,8 @@ use generic_array::GenericArray; use super::Field; use crate::{ - ff::Serializable, + ff::{FieldType, Serializable}, + impl_shared_value_common, protocol::prss::FromRandomU128, secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, }; @@ -22,7 +23,6 @@ pub struct GreaterThanPrimeError(V, u128); macro_rules! field_impl { ( $field:ident, $store:ty, $bits:expr, $prime:expr ) => { use super::*; - use crate::ff::FieldType; #[derive(Clone, Copy, PartialEq, Eq)] pub struct $field(::Storage); @@ -31,6 +31,8 @@ macro_rules! field_impl { type Storage = $store; const BITS: u32 = $bits; const ZERO: Self = $field(0); + + impl_shared_value_common!(); } impl Vectorizable<1> for $field { diff --git a/ipa-core/src/secret_sharing/array.rs b/ipa-core/src/secret_sharing/array.rs index 7b9e09cff..ce6bc3fb5 100644 --- a/ipa-core/src/secret_sharing/array.rs +++ b/ipa-core/src/secret_sharing/array.rs @@ -47,6 +47,16 @@ impl PartialEq> for [V; N] { } } +impl StdArray { + pub fn first(&self) -> &V { + &self.0[0] + } + + pub fn first_mut(&mut self) -> &mut V { + &mut self.0[0] + } +} + impl SharedValueArray for StdArray where Self: Serializable, @@ -56,18 +66,6 @@ where fn from_fn V>(f: F) -> Self { Self(array::from_fn(f)) } - - fn get(&self, index: usize) -> V { - self.0[index] - } - - fn get_mut(&mut self, index: usize) -> &mut V { - &mut self.0[index] - } - - fn set(&mut self, index: usize, value: V) { - self.0[index] = value; - } } impl FieldArray for StdArray where Self: FromRandom + Serializable @@ -434,17 +432,4 @@ mod test { fn from_short_iter() { StdArray::::from_iter(iter::empty()); } - - proptest! { - #[test] - fn get_set(mut a: StdArray, b: Fp32BitPrime, c: Fp32BitPrime) { - assert_eq!(a.get(0), a.0[0]); - a.set(0, b); - assert_eq!(a.get(0), b); - *a.get_mut(0) = c; - assert_eq!(a.get(0), c); - let from_fn = StdArray::::from_fn(|i| a.0[i]); - assert_eq!(from_fn, a); - } - } } diff --git a/ipa-core/src/secret_sharing/mod.rs b/ipa-core/src/secret_sharing/mod.rs index 3b4923854..bb9e4891e 100644 --- a/ipa-core/src/secret_sharing/mod.rs +++ b/ipa-core/src/secret_sharing/mod.rs @@ -52,7 +52,6 @@ mod scheme; use std::{ fmt::Debug, - iter::once, ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign}, }; @@ -129,29 +128,45 @@ pub trait SharedValue: // Note the trait bound of `Vectorizable<1>` here, i.e., these // helpers only apply to arrays of a single element. - fn into_array(self) -> A + fn into_array(self) -> >::Array where - Self: Vectorizable<1, Array = A>, - A: SharedValueArray, - { - once(self).collect::() - } + Self: Vectorizable<1>; - fn from_array(array: &A) -> Self + fn from_array(array: &>::Array) -> Self where - Self: Vectorizable<1, Array = A>, - A: SharedValueArray, - { - array.get(0) - } + Self: Vectorizable<1>; - fn from_array_mut(array: &mut A) -> &mut Self + fn from_array_mut(array: &mut >::Array) -> &mut Self where - Self: Vectorizable<1, Array = A>, - A: SharedValueArray, - { - array.get_mut(0) - } + Self: Vectorizable<1>; +} + +#[macro_export] +macro_rules! impl_shared_value_common { + () => { + // Note the trait bound of `Vectorizable<1>` here, i.e., these + // helpers only apply to arrays of a single element. + fn into_array(self) -> >::Array + where + Self: Vectorizable<1>, + { + std::iter::once(self).collect() + } + + fn from_array(array: &>::Array) -> Self + where + Self: Vectorizable<1>, + { + *array.first() + } + + fn from_array_mut(array: &mut >::Array) -> &mut Self + where + Self: Vectorizable<1>, + { + array.first_mut() + } + }; } // Note that we can either make `trait Vectorizable: SharedValue`, or we can make `trait @@ -226,12 +241,6 @@ pub trait SharedValueArray: const ZERO: Self; fn from_fn V>(f: F) -> Self; - - fn get(&self, index: usize) -> V; - - fn get_mut(&mut self, index: usize) -> &mut V; - - fn set(&mut self, index: usize, value: V); } // Some `SharedValue` types (and thus their arrays) implement `FromRandom`, but `RP25519` does not. From 2a13cc9dfbe9e132cec1fb3999c28a8cea04baaa Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Mon, 29 Jan 2024 12:36:51 -0800 Subject: [PATCH 017/135] Proper error type for `impl TryFrom> for StdArray` --- ipa-core/src/error.rs | 22 +++++++++++++++++++++- ipa-core/src/secret_sharing/array.rs | 11 +++++++++-- ipa-core/src/secret_sharing/mod.rs | 3 ++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/ipa-core/src/error.rs b/ipa-core/src/error.rs index 0c2705f1f..c896352e2 100644 --- a/ipa-core/src/error.rs +++ b/ipa-core/src/error.rs @@ -1,4 +1,8 @@ -use std::{backtrace::Backtrace, convert::Infallible, fmt::Debug}; +use std::{ + backtrace::Backtrace, + convert::Infallible, + fmt::{Debug, Display}, +}; use thiserror::Error; @@ -60,6 +64,8 @@ pub enum Error { Unsupported(String), #[error("Decompressing invalid elliptic curve point: {0}")] DecompressingInvalidCurvePoint(String), + #[error(transparent)] + LengthError(#[from] LengthError), } impl Default for Error { @@ -85,6 +91,20 @@ pub type BoxError = Box; pub type Res = Result; +#[derive(Debug)] +pub struct LengthError { + pub expected: usize, + pub actual: usize, +} + +impl Display for LengthError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "expected {} items, got {}", self.expected, self.actual) + } +} + +impl std::error::Error for LengthError {} + /// Set up a global panic hook that dumps the panic information to our tracing subsystem if it is /// available and duplicates that to standard error output. /// diff --git a/ipa-core/src/secret_sharing/array.rs b/ipa-core/src/secret_sharing/array.rs index ce6bc3fb5..326f9f65d 100644 --- a/ipa-core/src/secret_sharing/array.rs +++ b/ipa-core/src/secret_sharing/array.rs @@ -9,6 +9,7 @@ use generic_array::{ArrayLength, GenericArray}; use typenum::{U1, U32}; use crate::{ + error::LengthError, ff::{Field, Fp32BitPrime, Serializable}, helpers::Message, protocol::prss::{FromRandom, FromRandomU128}, @@ -72,9 +73,15 @@ impl FieldArray for StdArray where Self: From {} impl TryFrom> for StdArray { - type Error = (); + type Error = LengthError; fn try_from(value: Vec) -> Result { - value.try_into().map(Self).map_err(|_| ()) + match value.try_into() { + Ok(arr) => Ok(Self(arr)), + Err(vec) => Err(LengthError { + expected: N, + actual: vec.len(), + }), + } } } diff --git a/ipa-core/src/secret_sharing/mod.rs b/ipa-core/src/secret_sharing/mod.rs index bb9e4891e..03ca688e9 100644 --- a/ipa-core/src/secret_sharing/mod.rs +++ b/ipa-core/src/secret_sharing/mod.rs @@ -69,6 +69,7 @@ use replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}; pub use scheme::{Bitwise, Linear, LinearRefOps, SecretSharing}; use crate::{ + error::LengthError, ff::{AddSub, AddSubAssign, Field, Fp32BitPrime, Serializable}, helpers::Message, protocol::prss::FromRandom, @@ -224,7 +225,7 @@ pub trait SharedValueArray: + Send + Sync + Sized - + TryFrom, Error = ()> + + TryFrom, Error = LengthError> + FromIterator + IntoIterator + Add From 50272197b54e60bd6c72d8a6b8e8882cd12e2c44 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Sat, 27 Jan 2024 23:37:50 -0800 Subject: [PATCH 018/135] Sendable trait --- ipa-core/src/helpers/mod.rs | 7 ++++--- ipa-core/src/secret_sharing/array.rs | 14 ++++++-------- ipa-core/src/secret_sharing/mod.rs | 19 ++++++------------- 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/ipa-core/src/helpers/mod.rs b/ipa-core/src/helpers/mod.rs index 09902ede6..1d2989272 100644 --- a/ipa-core/src/helpers/mod.rs +++ b/ipa-core/src/helpers/mod.rs @@ -65,7 +65,7 @@ use crate::{ Role::{H1, H2, H3}, }, protocol::{step::Gate, RecordId}, - secret_sharing::SharedValue, + secret_sharing::Sendable, }; // TODO work with ArrayLength only @@ -426,10 +426,11 @@ impl Debug for ChannelId { } /// Trait for messages sent between helpers. Everything needs to be serializable and safe to send. +/// +/// Infrastructure's `Message` trait corresponds to IPA's `Sendable` trait. pub trait Message: Debug + Send + Serializable + 'static + Sized {} -/// Any shared value can be send as a message -impl Message for V {} +impl Message for V {} impl Serializable for PublicKey { type Size = typenum::U32; diff --git a/ipa-core/src/secret_sharing/array.rs b/ipa-core/src/secret_sharing/array.rs index 326f9f65d..3c069ba20 100644 --- a/ipa-core/src/secret_sharing/array.rs +++ b/ipa-core/src/secret_sharing/array.rs @@ -11,9 +11,8 @@ use typenum::{U1, U32}; use crate::{ error::LengthError, ff::{Field, Fp32BitPrime, Serializable}, - helpers::Message, protocol::prss::{FromRandom, FromRandomU128}, - secret_sharing::{FieldArray, SharedValue, SharedValueArray}, + secret_sharing::{FieldArray, Sendable, SharedValue, SharedValueArray}, }; /// Wrapper around `[V; N]`. @@ -58,9 +57,11 @@ impl StdArray { } } +impl Sendable for StdArray where Self: Serializable {} + impl SharedValueArray for StdArray where - Self: Serializable, + Self: Sendable, { const ZERO: Self = Self([V::ZERO; N]); @@ -69,8 +70,7 @@ where } } -impl FieldArray for StdArray where Self: FromRandom + Serializable -{} +impl FieldArray for StdArray where Self: FromRandom + Sendable {} impl TryFrom> for StdArray { type Error = LengthError; @@ -88,7 +88,7 @@ impl TryFrom> for StdArray { // Panics if the iterator terminates before producing N items. impl FromIterator for StdArray where - Self: Serializable, // required for `::ZERO` + Self: Sendable, // required for `::ZERO` { fn from_iter>(iter: T) -> Self { let mut res = Self::ZERO; @@ -326,8 +326,6 @@ where } } -impl Message for StdArray where Self: Serializable {} - #[cfg(all(test, unit_test))] mod test { use std::iter; diff --git a/ipa-core/src/secret_sharing/mod.rs b/ipa-core/src/secret_sharing/mod.rs index 03ca688e9..2ef83079c 100644 --- a/ipa-core/src/secret_sharing/mod.rs +++ b/ipa-core/src/secret_sharing/mod.rs @@ -71,7 +71,6 @@ pub use scheme::{Bitwise, Linear, LinearRefOps, SecretSharing}; use crate::{ error::LengthError, ff::{AddSub, AddSubAssign, Field, Fp32BitPrime, Serializable}, - helpers::Message, protocol::prss::FromRandom, }; @@ -103,23 +102,17 @@ pub trait Block: Sized + Copy + Debug { type Size: ArrayLength; } +pub trait Sendable: Send + Debug + Serializable + 'static {} + +impl Sendable for V {} + /// Trait for types that are input to our additive secret sharing scheme. /// /// Additive secret sharing requires an addition operation. In cases where arithmetic secret sharing /// (capable of supporting addition and multiplication) is desired, the `Field` trait extends /// `SharedValue` to require multiplication. pub trait SharedValue: - Clone - + Copy - + Eq - + Debug - + Send - + Sync - + Sized - + Additive - + Serializable - + Vectorizable<1> - + 'static + Clone + Copy + Eq + Debug + Send + Sync + Sized + Additive + Sendable + Vectorizable<1> + 'static { type Storage: Block; @@ -225,6 +218,7 @@ pub trait SharedValueArray: + Send + Sync + Sized + + Sendable + TryFrom, Error = LengthError> + FromIterator + IntoIterator @@ -237,7 +231,6 @@ pub trait SharedValueArray: + for<'a> Sub<&'a Self, Output = Self> + SubAssign + for<'a> SubAssign<&'a Self> - + Message { const ZERO: Self; From 0bc51771c938b42bcad9a650522f5b59b2520269 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 11 Jan 2024 12:03:24 -0800 Subject: [PATCH 019/135] Vectorization of boolean arrays --- ipa-core/src/ff/boolean.rs | 16 + ipa-core/src/ff/boolean_array.rs | 203 ++++++++++- ipa-core/src/ff/mod.rs | 48 ++- .../src/protocol/basics/mul/semi_honest.rs | 2 +- ipa-core/src/protocol/basics/mul/sparse.rs | 4 +- .../comparison_and_subtraction_sequential.rs | 322 +++++++++++++----- .../src/protocol/ipa_prf/prf_sharding/mod.rs | 5 + ipa-core/src/protocol/ipa_prf/quicksort.rs | 3 +- ipa-core/src/protocol/ipa_prf/shuffle/mod.rs | 8 +- ipa-core/src/secret_sharing/array.rs | 4 +- ipa-core/src/secret_sharing/decomposed.rs | 57 +++- ipa-core/src/secret_sharing/mod.rs | 8 +- .../replicated/semi_honest/additive_share.rs | 116 ++++++- 13 files changed, 664 insertions(+), 132 deletions(-) diff --git a/ipa-core/src/ff/boolean.rs b/ipa-core/src/ff/boolean.rs index c535914d8..4e1960d94 100644 --- a/ipa-core/src/ff/boolean.rs +++ b/ipa-core/src/ff/boolean.rs @@ -196,6 +196,22 @@ impl FromRandomU128 for Boolean { } } +impl Vectorizable<64> for Boolean { + type Array = crate::ff::boolean_array::BA64; +} + +impl FieldVectorizable<64> for Boolean { + type ArrayAlias = crate::ff::boolean_array::BA64; +} + +impl Vectorizable<256> for Boolean { + type Array = crate::ff::boolean_array::BA256; +} + +impl FieldVectorizable<256> for Boolean { + type ArrayAlias = crate::ff::boolean_array::BA256; +} + #[cfg(all(test, unit_test))] mod test { use generic_array::GenericArray; diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index 32ba62b8a..1689c5b1e 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -6,7 +6,7 @@ use generic_array::GenericArray; use typenum::{U14, U2, U32, U8}; use crate::{ - ff::{boolean::Boolean, ArrayAccess, Field, Serializable}, + ff::{boolean::Boolean, ArrayAccess, ArrayBuilder, Field, Serializable}, protocol::prss::{FromRandom, FromRandomU128}, secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, }; @@ -28,11 +28,16 @@ macro_rules! store_impl { }; } -/// iterator for Boolean arrays +/// Iterator returned by `.iter()` on Boolean arrays pub struct BAIterator<'a> { iterator: std::iter::Take>, } +/// Iterator returned by `.into_iter()` on Boolean arrays +pub struct BAOwnedIterator { + iterator: std::iter::Take, +} + ///impl Iterator for all Boolean arrays impl<'a> Iterator for BAIterator<'a> { type Item = Boolean; @@ -48,6 +53,30 @@ impl<'a> ExactSizeIterator for BAIterator<'a> { } } +impl Iterator for BAOwnedIterator +where + S: IntoIterator, + S::IntoIter: ExactSizeIterator, + ::Item: Into, +{ + type Item = Boolean; + + fn next(&mut self) -> Option { + self.iterator.next().map(Into::into) + } +} + +impl ExactSizeIterator for BAOwnedIterator +where + S: IntoIterator, + S::IntoIter: ExactSizeIterator, + ::Item: Into, +{ + fn len(&self) -> usize { + self.iterator.len() + } +} + /// A value of ONE has a one in the first element of the bit array, followed by `$bits-1` zeros. /// This macro uses a bit of recursive repetition to produce those zeros. /// @@ -271,11 +300,11 @@ macro_rules! boolean_array_impl { mod $modname { use super::*; use crate::{ - ff::{boolean::Boolean, ArrayAccess, Expand, Serializable}, + ff::{boolean::Boolean, ArrayAccess, ArrayBuild, Expand, Serializable}, impl_shared_value_common, secret_sharing::{ replicated::semi_honest::{ASIterator, AdditiveShare}, - SharedValue, + FieldArray, SharedValue, SharedValueArray, }, }; @@ -324,17 +353,17 @@ macro_rules! boolean_array_impl { impl_serializable_trait!($name, $bits, Store, $deser_type); - impl std::ops::Add for $name { + impl std::ops::Add<&Self> for $name { type Output = Self; - fn add(self, rhs: Self) -> Self::Output { + fn add(self, rhs: &Self) -> Self::Output { Self(self.0 ^ rhs.0) } } - impl std::ops::Add<&$name> for $name { - type Output = $name; - fn add(self, rhs: &$name) -> Self::Output { - $name(self.0 ^ rhs.0) + impl std::ops::Add for $name { + type Output = Self; + fn add(self, rhs: Self) -> Self::Output { + std::ops::Add::add(self, &rhs) } } @@ -352,22 +381,41 @@ macro_rules! boolean_array_impl { } } + impl std::ops::AddAssign<&Self> for $name { + fn add_assign(&mut self, rhs: &Self) { + *self.0.as_mut_bitslice() ^= rhs.0; + } + } + impl std::ops::AddAssign for $name { fn add_assign(&mut self, rhs: Self) { - *self.0.as_mut_bitslice() ^= rhs.0; + std::ops::AddAssign::add_assign(self, &rhs); + } + } + + impl std::ops::Sub<&Self> for $name { + type Output = Self; + fn sub(self, rhs: &Self) -> Self::Output { + std::ops::Add::add(self, rhs) } } impl std::ops::Sub for $name { type Output = Self; fn sub(self, rhs: Self) -> Self::Output { - self + rhs + std::ops::Add::add(self, rhs) + } + } + + impl std::ops::SubAssign<&Self> for $name { + fn sub_assign(&mut self, rhs: &Self) { + std::ops::AddAssign::add_assign(self, rhs); } } impl std::ops::SubAssign for $name { fn sub_assign(&mut self, rhs: Self) { - *self += rhs; + std::ops::SubAssign::sub_assign(self, &rhs); } } @@ -382,16 +430,34 @@ macro_rules! boolean_array_impl { type Array = StdArray<$name, 1>; } + impl std::ops::Mul<&Self> for $name { + type Output = Self; + fn mul(self, rhs: &Self) -> Self::Output { + Self(self.0 & rhs.0) + } + } + impl std::ops::Mul for $name { type Output = Self; fn mul(self, rhs: Self) -> Self::Output { - Self(self.0 & rhs.0) + std::ops::Mul::mul(self, &rhs) } } impl std::ops::MulAssign for $name { fn mul_assign(&mut self, rhs: Self) { - *self = *self * rhs; + self.0 &= rhs.0; + } + } + + impl std::ops::Mul<&Boolean> for $name { + type Output = Self; + fn mul(self, rhs: &Boolean) -> Self::Output { + if *rhs == Boolean::ONE { + self + } else { + ::ZERO + } } } @@ -405,20 +471,84 @@ macro_rules! boolean_array_impl { type Input = Boolean; fn expand(v: &Boolean) -> Self { - let mut result = <$name>::ZERO; + let mut result = <$name as SharedValue>::ZERO; for i in 0..usize::try_from(<$name>::BITS).unwrap() { - result.set(i, *v); + result.0.set(i, bool::from(*v)); } result } } + impl TryFrom> for $name { + type Error = (); + fn try_from(value: Vec) -> Result { + if value.len() == $bits { + Ok(value.into_iter().collect::()) + } else { + Err(()) + } + } + } + + impl ArrayBuild for $name { + type Input = Boolean; + type Builder = BooleanArrayBuilder<$name>; + + fn builder() -> Self::Builder { + BooleanArrayBuilder::new() + } + } + + impl SharedValueArray for $name { + const ZERO_ARRAY: Self = <$name as SharedValue>::ZERO; + + fn from_fn Boolean>(mut f: F) -> Self { + let mut res = >::ZERO_ARRAY; + + for i in 0..$bits { + res.0.set(i, bool::from(f(i))); + } + + res + } + } + + impl FieldArray for $name {} + + // Panics if the iterator terminates before producing N items. + impl FromIterator for $name { + fn from_iter>(iter: T) -> Self { + let mut res = >::ZERO_ARRAY; + let mut iter = iter.into_iter(); + + for i in 0..$bits { + res.0.set(i, bool::from(iter.next().unwrap())); + } + + res + } + } + + impl IntoIterator for $name { + type Item = Boolean; + type IntoIter = BAOwnedIterator; + + fn into_iter(self) -> Self::IntoIter { + BAOwnedIterator { + iterator: self + .0 + .into_iter() + .take(usize::try_from(<$name>::BITS).unwrap()), + } + } + } + /// `clippy` does not recognize `iter` method coming from another trait. It is a false alarm /// therefore suppressed here. #[allow(clippy::into_iter_without_iter)] impl<'a> IntoIterator for &'a AdditiveShare<$name> { type Item = AdditiveShare; - type IntoIter = ASIterator<'a, $name>; + type IntoIter = ASIterator<'a, $name, Boolean>; fn into_iter(self) -> Self::IntoIter { self.iter() @@ -556,3 +686,40 @@ impl rand::distributions::Distribution for rand::distributions::Standard (rng.gen(), rng.gen()).into() } } + +pub struct BooleanArrayBuilder +where + T: ArrayAccess, +{ + array: T, + index: usize, +} + +impl BooleanArrayBuilder +where + T: ArrayAccess + SharedValue, +{ + fn new() -> Self { + Self { + array: T::ZERO, + index: 0, + } + } +} + +impl ArrayBuilder for BooleanArrayBuilder +where + T: ArrayAccess + Send, +{ + type Element = Boolean; + type Array = T; + + fn push(&mut self, value: Self::Element) { + self.array.set(self.index, value); + self.index += 1; + } + + fn build(self) -> Self::Array { + self.array + } +} diff --git a/ipa-core/src/ff/mod.rs b/ipa-core/src/ff/mod.rs index 2b1e579e1..96bdbca60 100644 --- a/ipa-core/src/ff/mod.rs +++ b/ipa-core/src/ff/mod.rs @@ -11,6 +11,7 @@ mod galois_field; mod prime_field; use std::{ + borrow::Borrow, convert::Infallible, ops::{Add, AddAssign, Sub, SubAssign}, }; @@ -93,6 +94,24 @@ pub trait ArrayAccess { fn iter(&self) -> Self::Iter<'_>; } +pub trait ArrayAccessRef { + type Element; + type Ref<'a>: Borrow + Clone + where + Self: 'a; + type Iter<'a>: Iterator> + ExactSizeIterator + Send + where + Self: 'a; + + fn get(&self, index: usize) -> Option>; + + fn set(&mut self, index: usize, e: Self::Ref<'_>); + + fn iter(&self) -> Self::Iter<'_>; + + fn make_ref(src: &Self::Element) -> Self::Ref<'_>; +} + pub trait Expand { type Input; @@ -105,7 +124,9 @@ pub trait Expand { /// supports `FromIterator` to collect an iterator of elements back into the original type pub trait CustomArray where - Self: ArrayAccess + Expand, + Self: ArrayAccess + + Expand + + ArrayBuild, { type Element; } @@ -113,7 +134,30 @@ where /// impl Custom Array for all compatible structs impl CustomArray for S where - S: ArrayAccess + Expand::Output>, + S: ArrayAccess + + Expand::Output> + + ArrayBuild::Output>, { type Element = ::Output; } + +pub trait ArrayBuild { + type Input; + type Builder: ArrayBuilder; + + fn builder() -> Self::Builder; +} + +pub trait ArrayBuilder: Send + Sized { + type Element; + type Array; + + #[must_use] + fn with_capacity(self, _capacity: usize) -> Self { + self + } + + fn push(&mut self, value: Self::Element); + + fn build(self) -> Self::Array; +} diff --git a/ipa-core/src/protocol/basics/mul/semi_honest.rs b/ipa-core/src/protocol/basics/mul/semi_honest.rs index 67171ff25..fec513f7c 100644 --- a/ipa-core/src/protocol/basics/mul/semi_honest.rs +++ b/ipa-core/src/protocol/basics/mul/semi_honest.rs @@ -62,7 +62,7 @@ where } else { debug_assert_eq!( a.left_arr().clone() * b.right_arr() + a.right_arr().clone() * b.left_arr(), - <>::Array as SharedValueArray>::ZERO + <>::Array as SharedValueArray>::ZERO_ARRAY ); } // Add randomness to this value whether we sent or not, depending on whether the diff --git a/ipa-core/src/protocol/basics/mul/sparse.rs b/ipa-core/src/protocol/basics/mul/sparse.rs index 878199b23..2c61d9a3a 100644 --- a/ipa-core/src/protocol/basics/mul/sparse.rs +++ b/ipa-core/src/protocol/basics/mul/sparse.rs @@ -121,14 +121,14 @@ impl ZeroPositions { let flags = <[bool; 3]>::from(self); if flags[role as usize] { assert_eq!( - &>::Array::ZERO, + &>::Array::ZERO_ARRAY, v.left_arr(), "expected a zero on the left for input {which}" ); } if flags[role.peer(Right) as usize] { assert_eq!( - &>::Array::ZERO, + &>::Array::ZERO_ARRAY, v.right_arr(), "expected a zero on the right for input {which}" ); diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs index d02ab115a..3dec75a79 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs @@ -1,18 +1,29 @@ +//! Bitwise subtraction and comparison protocols +//! +//! Implementations in this module require that if the bit-width of the second (y) operand exceeds +//! the bit-width of the first (x) operand, then the excess bits of y must be zero. This condition +//! is abbreviated below as `length(x) >= log2(y)`. + +use std::{borrow::Borrow, iter::repeat, ops::Not}; + #[cfg(all(test, unit_test))] use ipa_macros::Step; -#[cfg(all(test, unit_test))] -use crate::ff::Expand; use crate::{ error::Error, - ff::{ArrayAccess, CustomArray, Field}, + ff::{ArrayAccessRef, ArrayBuild, ArrayBuilder, Field}, protocol::{ basics::{SecureMul, ShareKnownValue}, context::Context, step::BitOpStep, RecordId, }, - secret_sharing::{replicated::semi_honest::AdditiveShare, SharedValue}, + secret_sharing::{replicated::semi_honest::AdditiveShare, FieldSimd}, +}; +#[cfg(all(test, unit_test))] +use crate::{ + ff::{CustomArray, Expand}, + secret_sharing::SharedValue, }; #[cfg(all(test, unit_test))] @@ -23,80 +34,82 @@ pub(crate) enum Step { } /// Comparison operation -/// outputs x>=y +/// +/// Outputs x>=y for length(x) >= log2(y). /// # Errors -/// propagates errors from multiply +/// Propagates errors from multiply #[cfg(all(test, unit_test))] -pub async fn compare_geq( +pub async fn compare_geq( ctx: C, record_id: RecordId, - x: &AdditiveShare, - y: &AdditiveShare, -) -> Result, Error> + x: &XS, + y: &YS, +) -> Result, Error> where C: Context, - YS: SharedValue + CustomArray, - XS: SharedValue + CustomArray + Field, - XS::Element: Field, - AdditiveShare: std::ops::Not>, + F: Field, + XS: ArrayAccessRef> + ArrayBuild>, + YS: ArrayAccessRef>, + AdditiveShare: SecureMul + Not>, { // we need to initialize carry to 1 for x>=y, - let mut carry = AdditiveShare::::share_known_value(&ctx, XS::Element::ONE); - // we don't care about the subtraction, we just want the carry - let _ = subtraction_circuit(ctx, record_id, x, y, &mut carry).await; + let mut carry = AdditiveShare::::share_known_value(&ctx, F::ONE); + // We don't care about the subtraction, we just want the carry + subtraction_circuit(ctx, record_id, x, y, &mut carry).await?; Ok(carry) } /// Comparison operation -/// outputs x>y + +/// Outputs x>y for length(x) >= log2(y). /// # Errors /// propagates errors from multiply -pub async fn compare_gt( +pub async fn compare_gt( ctx: C, record_id: RecordId, - x: &AdditiveShare, - y: &AdditiveShare, -) -> Result, Error> + x: &XS, + y: &YS, +) -> Result, Error> where C: Context, - YS: SharedValue + CustomArray, - XS: SharedValue + CustomArray + Field, - XS::Element: Field, - AdditiveShare: std::ops::Not>, + F: Field + FieldSimd, + XS: ArrayAccessRef> + ArrayBuild>, + YS: ArrayAccessRef>, + AdditiveShare: SecureMul + Not>, { // we need to initialize carry to 0 for x>y - let mut carry = AdditiveShare::::ZERO; - // we don't care about the subtraction, we just want the carry - let _ = subtraction_circuit(ctx, record_id, x, y, &mut carry).await; + let mut carry = AdditiveShare::::ZERO; + subtraction_circuit(ctx, record_id, x, y, &mut carry).await?; Ok(carry) } /// non-saturated unsigned integer subtraction -/// subtracts y from x, Output has same length as x (carries and indices of y too large for x are ignored) -/// when y>x, it computes `(x+"XS::MaxValue")-y` +/// subtracts y from x, Output has same length as x (carries and indices of y too large for x are ignored). +/// When y>x, it computes `(x+"XS::MaxValue"+1)-y`, considering only the least-significant +/// length(x) bits of y. /// # Errors /// propagates errors from multiply -pub async fn integer_sub( +pub async fn integer_sub( ctx: C, record_id: RecordId, - x: &AdditiveShare, - y: &AdditiveShare, -) -> Result, Error> + x: &XS, + y: &YS, +) -> Result where C: Context, - YS: SharedValue + CustomArray, - XS: SharedValue + CustomArray + Field, - XS::Element: Field, - AdditiveShare: std::ops::Not>, + F: Field, + XS: ArrayAccessRef> + ArrayBuild>, + YS: ArrayAccessRef>, + AdditiveShare: SecureMul + Not>, { // we need to initialize carry to 1 for a subtraction - let mut carry = AdditiveShare::::share_known_value(&ctx, XS::Element::ONE); + let mut carry = AdditiveShare::::share_known_value(&ctx, F::ONE); subtraction_circuit(ctx, record_id, x, y, &mut carry).await } /// saturated unsigned integer subtraction -/// subtracts y from x, Output has same length as x (we dont seem to need support for different length) -/// when y>x, it outputs 0 +/// subtracts y from x, Output has same length as x (we dont seem to need support for different length). +/// when y>x, it outputs 0. Only correct when length(x) >= log2(y). /// # Errors /// propagates errors from multiply #[cfg(all(test, unit_test))] @@ -108,9 +121,12 @@ pub async fn integer_sat_sub( ) -> Result, Error> where C: Context, - S: CustomArray + Field, S::Element: Field, - AdditiveShare: std::ops::Not>, + S: SharedValue + CustomArray + Expand, + AdditiveShare: SecureMul + + ArrayAccessRef> + + ArrayBuild>, + AdditiveShare: SecureMul + Not>, { let mut carry = AdditiveShare::::share_known_value(&ctx, S::Element::ONE); let result = subtraction_circuit( @@ -131,41 +147,48 @@ where } /// subtraction using bit subtractor -/// subtracts y from x, Output has same length as x (carries and indices of y too large for x are ignored) -/// implementing `https://encrypto.de/papers/KSS09.pdf` from Section 3.1/3.2 +/// subtracts y from x, Output has same length as x (carries and indices of y too large for x are ignored, +/// so only correct when length(x) >= log2(y)). +/// Implements `https://encrypto.de/papers/KSS09.pdf` from Section 3.1/3.2 /// /// # Errors /// propagates errors from multiply -async fn subtraction_circuit( +async fn subtraction_circuit( ctx: C, record_id: RecordId, - x: &AdditiveShare, - y: &AdditiveShare, - carry: &mut AdditiveShare, -) -> Result, Error> + x: &XS, + y: &YS, + carry: &mut AdditiveShare, +) -> Result where C: Context, - XS: SharedValue + CustomArray, - YS: SharedValue + CustomArray, - XS::Element: Field, - AdditiveShare: std::ops::Not>, + F: Field + FieldSimd, + XS: ArrayAccessRef> + ArrayBuild>, + YS: ArrayAccessRef>, + AdditiveShare: SecureMul + Not>, { - let mut result = AdditiveShare::::ZERO; - for (i, v) in x.iter().enumerate() { - result.set( - i, + let x = x.iter(); + let y = y.iter(); + + let mut result = XS::builder().with_capacity(x.len()); + + for (i, (xb, yb)) in x + .zip(y.chain(repeat(YS::make_ref(&AdditiveShare::::ZERO)))) + .enumerate() + { + result.push( bit_subtractor( ctx.narrow(&BitOpStep::from(i)), record_id, - &v, - y.get(i).as_ref(), + xb.borrow(), + yb.borrow(), carry, ) .await?, ); } - Ok(result) + Ok(result.build()) } /// This improved one-bit subtractor that only requires a single multiplication was taken from: @@ -182,27 +205,23 @@ where /// /// # Errors /// propagates errors from multiply -async fn bit_subtractor( +async fn bit_subtractor( ctx: C, record_id: RecordId, - x: &AdditiveShare, - y: Option<&AdditiveShare>, - carry: &mut AdditiveShare, -) -> Result, Error> + x: &AdditiveShare, + y: &AdditiveShare, + carry: &mut AdditiveShare, +) -> Result, Error> where C: Context, - S: Field, - AdditiveShare: std::ops::Not>, + F: Field + FieldSimd, + AdditiveShare: SecureMul + Not>, { - let output = x + !(y.unwrap_or(&AdditiveShare::::ZERO) + &*carry); + let output = x + !(y + &*carry); *carry = &*carry + (x + &*carry) - .multiply( - &(!(y.unwrap_or(&AdditiveShare::::ZERO) + &*carry)), - ctx, - record_id, - ) + .multiply(&(!(y + &*carry)), ctx, record_id) .await?; Ok(output) @@ -210,6 +229,14 @@ where #[cfg(all(test, unit_test))] mod test { + use std::{ + array, + iter::{repeat, repeat_with, zip, Iterator}, + time::Instant, + }; + + use futures::stream::iter as stream_iter; + use futures_util::TryStreamExt; use rand::Rng; use crate::{ @@ -224,14 +251,16 @@ mod test { ipa_prf::boolean_ops::comparison_and_subtraction_sequential::{ compare_geq, compare_gt, integer_sat_sub, integer_sub, }, + RecordId, }, rand::thread_rng, secret_sharing::{ replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, - SharedValue, + BitDecomposed, SharedValue, }, + seq_join::{seq_join, SeqJoin}, test_executor::run, - test_fixture::{Reconstruct, Runner, TestWorld}, + test_fixture::{Reconstruct, ReconstructArr, Runner, TestWorld}, }; /// testing correctness of Not @@ -282,7 +311,7 @@ mod test { let result = world .semi_honest(records.clone().into_iter(), |ctx, x_y| async move { - compare_geq::<_, BA64, BA64>( + compare_geq( ctx.set_total_records(1), protocol::RecordId(0), &x_y[0], @@ -298,7 +327,7 @@ mod test { let result2 = world .semi_honest(records.into_iter(), |ctx, x_y| async move { - compare_geq::<_, BA64, BA64>( + compare_geq( ctx.set_total_records(1), protocol::RecordId(0), &x_y[0], @@ -329,7 +358,7 @@ mod test { let result = world .semi_honest(records.clone().into_iter(), |ctx, x_y| async move { - compare_gt::<_, BA64, BA64>( + compare_gt::<_, _, AdditiveShare, AdditiveShare, 1>( ctx.set_total_records(1), protocol::RecordId(0), &x_y[0], @@ -346,7 +375,7 @@ mod test { // check that x is not greater than itself let result2 = world .semi_honest(records.into_iter(), |ctx, x_y| async move { - compare_gt::<_, BA64, BA64>( + compare_gt::<_, _, AdditiveShare, AdditiveShare, 1>( ctx.set_total_records(1), protocol::RecordId(0), &x_y[0], @@ -361,6 +390,133 @@ mod test { }); } + const BENCH_COUNT: usize = 131_072; + + #[test] + #[ignore] // benchmark + fn semi_honest_compare_gt_novec() { + run(|| async move { + let world = TestWorld::default(); + + let mut rng = thread_rng(); + + let x = repeat_with(|| rng.gen()) + .take(BENCH_COUNT) + .collect::>(); + let x_int = x.iter().map(Field::as_u128).collect::>(); + let y: BA64 = rng.gen::(); + let y_int = y.as_u128(); + + let expected = x_int.iter().map(|x| *x > y_int).collect::>(); + + let result = world + .semi_honest((x.clone().into_iter(), y), |ctx, (x, y)| async move { + let begin = Instant::now(); + let ctx = ctx.set_total_records(x.len()); + let res = seq_join( + ctx.active_work(), + stream_iter(x.into_iter().zip(repeat((ctx, y))).enumerate().map( + |(i, (x, (ctx, y)))| async move { + compare_gt(ctx, RecordId::from(i), &x, &y).await + }, + )), + ) + .try_collect::>>() + .await + .unwrap(); + tracing::info!("Execution time: {:?}", begin.elapsed()); + res + }) + .await + .reconstruct(); + + let results_iter = zip(result, expected); + assert_eq!(results_iter.len(), BENCH_COUNT); + for (observed, expected) in results_iter { + assert_eq!(observed, ::from(expected)); + } + }); + } + + #[test] + #[ignore] // benchmark + fn semi_honest_compare_gt_vec() { + run(|| async move { + const N: usize = 256; + const CMP_BITS: usize = 64; + + let world = TestWorld::default(); + + let mut rng = thread_rng(); + + let x = repeat_with(|| rng.gen()) + .take(BENCH_COUNT) + .collect::>(); + let x_int: Vec = x + .iter() + .map(|x| x.as_u128().try_into().unwrap()) + .collect::>(); + let y: BA64 = rng.gen::(); + let y_int: u64 = y.as_u128().try_into().unwrap(); + let xa: Vec> = x_int + .chunks(N) + .map(|x| { + BitDecomposed::decompose(CMP_BITS, move |bit| { + array::from_fn(|rec| { + if (x[rec] >> bit) & 1 == 1 { + Boolean::TRUE + } else { + Boolean::FALSE + } + }) + }) + }) + .collect::>(); + let ya: BitDecomposed<[Boolean; N]> = BitDecomposed::decompose(CMP_BITS, |i| { + if (y_int >> i) & 1 == 1 { + [Boolean::TRUE; N] + } else { + [Boolean::FALSE; N] + } + }); + + let expected = x_int.iter().map(|x| *x > y_int).collect::>(); + + let xa_iter = xa.clone().into_iter(); + let result = world + .semi_honest((xa_iter, ya.clone()), |ctx, (x, y)| async move { + println!("Processing {} records", x.len()); + let begin = Instant::now(); + let ctx = ctx.set_total_records(x.len()); + let res = seq_join( + ctx.active_work(), + stream_iter(x.into_iter().zip(repeat((ctx, y))).enumerate().map( + |(i, (x, (ctx, y)))| async move { + compare_gt(ctx, RecordId::from(i), &x, &y).await + }, + )), + ) + .try_collect::>>() + .await + .unwrap(); + tracing::info!("Execution time: {:?}", begin.elapsed()); + res + }) + .await; + + let [r0, r1, r2] = result; + let observed = (0..r0.len()) + .flat_map(|i| [r0[i].clone(), r1[i].clone(), r2[i].clone()].reconstruct_arr()) + .collect::>(); + + let results_iter = zip(observed, expected); + assert_eq!(results_iter.len(), BENCH_COUNT); + for (observed, expected) in results_iter { + assert_eq!(observed, ::from(expected)); + } + }); + } + /// testing correctness of subtraction #[test] fn semi_honest_sub() { @@ -378,7 +534,7 @@ mod test { let result = world .semi_honest(records.into_iter(), |ctx, x_y| async move { - integer_sub::<_, BA64, BA64>( + integer_sub( ctx.set_total_records(1), protocol::RecordId(0), &x_y[0], @@ -468,7 +624,7 @@ mod test { let result = world .semi_honest(records, |ctx, x_y| async move { - integer_sub::<_, BA64, BA32>( + integer_sub( ctx.set_total_records(1), protocol::RecordId(0), &x_y.0, diff --git a/ipa-core/src/protocol/ipa_prf/prf_sharding/mod.rs b/ipa-core/src/protocol/ipa_prf/prf_sharding/mod.rs index 6dd3908b0..c1de99f66 100644 --- a/ipa-core/src/protocol/ipa_prf/prf_sharding/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/prf_sharding/mod.rs @@ -198,6 +198,11 @@ impl< ctx.narrow(&Step::IsSaturatedAndPrevRowNotSaturated), record_id, ), + // It is okay that we are calling `integer_sub` with length(y) > length(x) here. + // `difference_to_cap` only needs to be accurate in the case where the next row will + // overflow. When that is the case, `updated_sum` must be within `2^TV::BITS` of the + // cap, and a `TV::BITS` subtraction of the `TV::BITS` least significant bits of + // `updated_sum` from zero will correctly compute the difference to the cap. integer_sub( ctx.narrow(&Step::ComputeDifferenceToCap), record_id, diff --git a/ipa-core/src/protocol/ipa_prf/quicksort.rs b/ipa-core/src/protocol/ipa_prf/quicksort.rs index 8501f23fb..0ac73a985 100644 --- a/ipa-core/src/protocol/ipa_prf/quicksort.rs +++ b/ipa-core/src/protocol/ipa_prf/quicksort.rs @@ -9,7 +9,7 @@ use ipa_macros::Step; use crate::{ error::Error, - ff::{boolean::Boolean, CustomArray, Field}, + ff::{boolean::Boolean, ArrayAccess, ArrayBuild, CustomArray, Field}, protocol::{ basics::Reveal, context::Context, ipa_prf::boolean_ops::comparison_and_subtraction_sequential::compare_gt, RecordId, @@ -61,6 +61,7 @@ where S: Send + Sync, F: Fn(&S) -> &AdditiveShare + Sync + Send + Copy, K: SharedValue + Field + CustomArray, + AdditiveShare: ArrayAccess + ArrayBuild>, { assert!(!ranges_to_sort.iter().any(Range::is_empty)); diff --git a/ipa-core/src/protocol/ipa_prf/shuffle/mod.rs b/ipa-core/src/protocol/ipa_prf/shuffle/mod.rs index ecc9c4f75..db982a0ad 100644 --- a/ipa-core/src/protocol/ipa_prf/shuffle/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/shuffle/mod.rs @@ -75,10 +75,10 @@ where // This function converts AdditiveShare obtained from shuffle protocol to OprfReport pub fn shuffled_to_oprfreport(input: &AdditiveShare) -> OprfReport where - YS: SharedValue + ArrayAccess + Expand, - BK: SharedValue + ArrayAccess + Expand, - TV: SharedValue + ArrayAccess + Expand, - TS: SharedValue + ArrayAccess + Expand, + YS: SharedValue + CustomArray, + BK: SharedValue + CustomArray, + TV: SharedValue + CustomArray, + TS: SharedValue + CustomArray, { let match_key = extract_from_shared_array::(input, 0); diff --git a/ipa-core/src/secret_sharing/array.rs b/ipa-core/src/secret_sharing/array.rs index 3c069ba20..effce79f1 100644 --- a/ipa-core/src/secret_sharing/array.rs +++ b/ipa-core/src/secret_sharing/array.rs @@ -63,7 +63,7 @@ impl SharedValueArray for StdArray where Self: Sendable, { - const ZERO: Self = Self([V::ZERO; N]); + const ZERO_ARRAY: Self = Self([V::ZERO; N]); fn from_fn V>(f: F) -> Self { Self(array::from_fn(f)) @@ -91,7 +91,7 @@ where Self: Sendable, // required for `::ZERO` { fn from_iter>(iter: T) -> Self { - let mut res = Self::ZERO; + let mut res = Self::ZERO_ARRAY; let mut iter = iter.into_iter(); for i in 0..N { diff --git a/ipa-core/src/secret_sharing/decomposed.rs b/ipa-core/src/secret_sharing/decomposed.rs index 9abede2e3..3861ffb98 100644 --- a/ipa-core/src/secret_sharing/decomposed.rs +++ b/ipa-core/src/secret_sharing/decomposed.rs @@ -1,8 +1,8 @@ -use std::{fmt::Debug, ops::Deref}; +use std::{fmt::Debug, ops::Deref, slice}; use crate::{ error::Error, - ff::PrimeField, + ff::{ArrayAccessRef, ArrayBuild, ArrayBuilder, PrimeField}, secret_sharing::{Linear as LinearSecretSharing, LinearRefOps}, }; @@ -110,6 +110,37 @@ impl TryFrom> for BitDecomposed { } } +pub struct BitDecomposedBuilder { + bits: Vec, +} + +impl ArrayBuild for BitDecomposed { + type Input = S; + type Builder = BitDecomposedBuilder; + + fn builder() -> Self::Builder { + BitDecomposedBuilder { bits: Vec::new() } + } +} + +impl ArrayBuilder for BitDecomposedBuilder { + type Element = S; + type Array = BitDecomposed; + + fn with_capacity(mut self, capacity: usize) -> Self { + self.bits.reserve(capacity); + self + } + + fn push(&mut self, value: S) { + self.bits.push(value); + } + + fn build(self) -> Self::Array { + BitDecomposed::new(self.bits) + } +} + impl Deref for BitDecomposed { type Target = [S]; fn deref(&self) -> &Self::Target { @@ -124,3 +155,25 @@ impl IntoIterator for BitDecomposed { self.bits.into_iter() } } + +impl ArrayAccessRef for BitDecomposed { + type Element = S; + type Ref<'a> = &'a S where S: 'a; + type Iter<'a> = slice::Iter<'a, S> where S: 'a; + + fn get(&self, index: usize) -> Option> { + self.bits.get(index) + } + + fn set(&mut self, index: usize, e: Self::Ref<'_>) { + self.bits[index] = e.clone(); + } + + fn iter(&self) -> Self::Iter<'_> { + self.bits.iter() + } + + fn make_ref(src: &Self::Element) -> Self::Ref<'_> { + src + } +} diff --git a/ipa-core/src/secret_sharing/mod.rs b/ipa-core/src/secret_sharing/mod.rs index 2ef83079c..f7479433b 100644 --- a/ipa-core/src/secret_sharing/mod.rs +++ b/ipa-core/src/secret_sharing/mod.rs @@ -70,7 +70,7 @@ pub use scheme::{Bitwise, Linear, LinearRefOps, SecretSharing}; use crate::{ error::LengthError, - ff::{AddSub, AddSubAssign, Field, Fp32BitPrime, Serializable}, + ff::{boolean::Boolean, AddSub, AddSubAssign, Field, Fp32BitPrime, Serializable}, protocol::prss::FromRandom, }; @@ -211,6 +211,10 @@ impl FieldSimd<1> for F {} impl FieldSimd<32> for Fp32BitPrime {} +impl FieldSimd<64> for Boolean {} + +impl FieldSimd<256> for Boolean {} + pub trait SharedValueArray: Clone + Eq @@ -232,7 +236,7 @@ pub trait SharedValueArray: + SubAssign + for<'a> SubAssign<&'a Self> { - const ZERO: Self; + const ZERO_ARRAY: Self; fn from_fn V>(f: F) -> Self; } diff --git a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs index b998b67c4..ea7fe6fdd 100644 --- a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs +++ b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs @@ -1,5 +1,6 @@ use std::{ fmt::{Debug, Formatter}, + marker::PhantomData, ops::{Add, AddAssign, Mul, Neg, Range, Sub, SubAssign}, }; @@ -7,7 +8,7 @@ use generic_array::{ArrayLength, GenericArray}; use typenum::Unsigned; use crate::{ - ff::{ArrayAccess, Expand, Field, Serializable}, + ff::{ArrayAccess, ArrayAccessRef, ArrayBuild, ArrayBuilder, Expand, Field, Serializable}, secret_sharing::{ replicated::ReplicatedSecretSharing, FieldSimd, Linear as LinearSecretSharing, SecretSharing, SharedValue, SharedValueArray, Vectorizable, @@ -24,16 +25,23 @@ pub struct AdditiveShare, const N: usize = 1>( >::Array, ); +// The `V` type parameter allows ASIterator to convert array elements to a new type before +// returning. It is used for Galois fields, which use `bool` as the native array element type. #[derive(Clone, PartialEq, Eq)] -pub struct ASIterator<'a, S: SharedValue + ArrayAccess> { +pub struct ASIterator<'a, S, V = ::Output> +where + S: SharedValue + ArrayAccess, + V: From<::Output>, +{ range: Range, share: &'a AdditiveShare, + phantom_data: PhantomData, } impl, const N: usize> SecretSharing for AdditiveShare { const ZERO: Self = Self( - >::Array::ZERO, - >::Array::ZERO, + >::Array::ZERO_ARRAY, + >::Array::ZERO_ARRAY, ); } @@ -54,8 +62,8 @@ impl Default for AdditiveShare { impl, const N: usize> AdditiveShare { /// Replicated secret share where both left and right values are `V::ZERO` pub const ZERO: Self = Self( - >::Array::ZERO, - >::Array::ZERO, + >::Array::ZERO_ARRAY, + >::Array::ZERO_ARRAY, ); } @@ -353,10 +361,38 @@ where end: S::from_array(&self.0).iter().len(), }, share: self, + phantom_data: PhantomData, } } } +impl ArrayAccessRef for AdditiveShare +where + S: SharedValue + ArrayAccess, + V: SharedValue + Vectorizable<1, Array = A>, + A: SharedValueArray, +{ + type Element = AdditiveShare; + type Ref<'a> = AdditiveShare; + type Iter<'a> = ASIterator<'a, S>; + + fn get(&self, index: usize) -> Option> { + ArrayAccess::get(self, index) + } + + fn set(&mut self, index: usize, e: Self::Ref<'_>) { + ArrayAccess::set(self, index, e); + } + + fn iter(&self) -> Self::Iter<'_> { + ArrayAccess::iter(self) + } + + fn make_ref(src: &Self::Element) -> Self::Ref<'_> { + src.clone() + } +} + impl Expand for AdditiveShare where S: Expand + SharedValue + Vectorizable<1, Array = A>, @@ -373,27 +409,27 @@ where } } -impl<'a, S, T> Iterator for ASIterator<'a, S> +impl<'a, S, V> Iterator for ASIterator<'a, S, V> where - S: SharedValue + ArrayAccess, - T: SharedValue, + S: SharedValue + ArrayAccess, + V: SharedValue + From<::Output>, { - type Item = AdditiveShare; + type Item = AdditiveShare; fn next(&mut self) -> Option { self.range.next().map(|i| { AdditiveShare( - S::from_array(&self.share.0).get(i).unwrap().into_array(), - S::from_array(&self.share.1).get(i).unwrap().into_array(), + V::from(S::from_array(&self.share.0).get(i).unwrap()).into_array(), + V::from(S::from_array(&self.share.1).get(i).unwrap()).into_array(), ) }) } } -impl<'a, S> ExactSizeIterator for ASIterator<'a, S> +impl<'a, S, V> ExactSizeIterator for ASIterator<'a, S, V> where S: SharedValue + ArrayAccess, - ::Output: SharedValue, + V: SharedValue + From<::Output>, { fn len(&self) -> usize { self.range.len() @@ -411,12 +447,62 @@ where { let mut result = AdditiveShare::::ZERO; for (i, v) in iter.into_iter().enumerate() { - result.set(i, v); + // Disambiguate ArrayAccess vs. ArrayAccessRef + ArrayAccess::set(&mut result, i, v); } result } } +pub struct AdditiveShareArrayBuilder +where + B: ArrayBuilder, + B::Array: SharedValue, + B::Element: SharedValue, +{ + left_builder: B, + right_builder: B, +} + +impl ArrayBuilder for AdditiveShareArrayBuilder +where + B: ArrayBuilder, + B::Array: SharedValue, + B::Element: SharedValue, +{ + type Element = AdditiveShare; + type Array = AdditiveShare; + + fn push(&mut self, value: Self::Element) { + self.left_builder.push(value.left()); + self.right_builder.push(value.right()); + } + + fn build(self) -> Self::Array { + let Self { + left_builder, + right_builder, + } = self; + AdditiveShare::new(left_builder.build(), right_builder.build()) + } +} + +impl ArrayBuild for AdditiveShare +where + A: SharedValue + ArrayBuild, + ::Input: SharedValue, +{ + type Input = AdditiveShare<::Input>; + type Builder = AdditiveShareArrayBuilder<::Builder>; + + fn builder() -> Self::Builder { + AdditiveShareArrayBuilder { + left_builder: A::builder(), + right_builder: A::builder(), + } + } +} + #[cfg(all(test, unit_test))] mod tests { use proptest::{ From 62014c3582625bca5b2af318c22e091674f80617 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Fri, 26 Jan 2024 15:26:10 -0800 Subject: [PATCH 020/135] Coverage improvements --- ipa-core/src/ff/boolean_array.rs | 93 ++++++++++++++++++ .../comparison_and_subtraction_sequential.rs | 2 + ipa-core/src/secret_sharing/decomposed.rs | 96 +++++++++++++++++++ ipa-core/src/secret_sharing/mod.rs | 1 + 4 files changed, 192 insertions(+) diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index 1689c5b1e..711aa4f18 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -461,6 +461,13 @@ macro_rules! boolean_array_impl { } } + impl std::ops::Mul for $name { + type Output = Self; + fn mul(self, rhs: Boolean) -> Self::Output { + std::ops::Mul::mul(self, &rhs) + } + } + impl From<$name> for Store { fn from(v: $name) -> Self { v.0 @@ -619,6 +626,16 @@ macro_rules! boolean_array_impl { assert_eq!(iter.len(), $bits - 1 - i); } } + + #[test] + fn owned_iterator(a: $name) { + let mut iter = a.into_iter().enumerate(); + assert_eq!(iter.len(), $bits); + while let Some((i, b)) = iter.next() { + assert_eq!(bool::from(b), a.0[i]); + assert_eq!(iter.len(), $bits - 1 - i); + } + } } #[test] @@ -723,3 +740,79 @@ where self.array } } + +#[cfg(all(test, unit_test))] +mod tests { + use rand::{thread_rng, Rng}; + + use super::*; + + // It does not seem worth running these tests for every BA type, although + // it would be worth writing a version for the largest BA type (which + // requires replacing truncate_from). + + #[test] + #[allow(clippy::clone_on_copy, clippy::op_ref)] + pub fn add_sub() { + let mut rng = thread_rng(); + let a = rng.gen::(); + let b = rng.gen::(); + + let xor = BA8::truncate_from(a ^ b); + + let a = BA8::truncate_from(a); + let b = BA8::truncate_from(b); + + assert_eq!(&a + &b, xor); + assert_eq!(&a + b.clone(), xor); + assert_eq!(a.clone() + &b, xor); + assert_eq!(a.clone() + b.clone(), xor); + + let mut tmp = a.clone(); + tmp += &b; + assert_eq!(tmp, xor); + + let mut tmp = a.clone(); + tmp += b; + assert_eq!(tmp, xor); + + // Sub not implemented yet for &BA + //assert_eq!(&a - &b, xor); + //assert_eq!(&a - b.clone(), xor); + assert_eq!(a.clone() - &b, xor); + assert_eq!(a.clone() - b.clone(), xor); + + let mut tmp = a.clone(); + tmp -= &b; + assert_eq!(tmp, xor); + + let mut tmp = a.clone(); + tmp -= b; + assert_eq!(tmp, xor); + + assert_eq!(-a, a); + assert_eq!(a + (-a), BA8::ZERO); + } + + #[test] + #[allow(clippy::clone_on_copy, clippy::op_ref)] + pub fn mul() { + let mut rng = thread_rng(); + let a = rng.gen::(); + let b = rng.gen::(); + let c = rng.gen::(); + + let prod = BA8::truncate_from(a & b); + + let mut a = BA8::truncate_from(a); + let b = BA8::truncate_from(b); + + a *= b; + assert_eq!(a, prod); + + assert_eq!(a * Boolean::from(false), BA8::ZERO); + assert_eq!(a * Boolean::from(true), a); + assert_eq!(a * c, if bool::from(c) { a } else { BA8::ZERO }); + assert_eq!(a * &c, if bool::from(c) { a } else { BA8::ZERO }); + } +} diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs index 3dec75a79..43abfeacc 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs @@ -394,6 +394,7 @@ mod test { #[test] #[ignore] // benchmark + #[cfg(not(coverage))] fn semi_honest_compare_gt_novec() { run(|| async move { let world = TestWorld::default(); @@ -440,6 +441,7 @@ mod test { #[test] #[ignore] // benchmark + #[cfg(not(coverage))] fn semi_honest_compare_gt_vec() { run(|| async move { const N: usize = 256; diff --git a/ipa-core/src/secret_sharing/decomposed.rs b/ipa-core/src/secret_sharing/decomposed.rs index 3861ffb98..83555d3ab 100644 --- a/ipa-core/src/secret_sharing/decomposed.rs +++ b/ipa-core/src/secret_sharing/decomposed.rs @@ -177,3 +177,99 @@ impl ArrayAccessRef for BitDecomposed { src } } + +#[cfg(all(test, unit_test))] +mod tests { + use proptest::prelude::*; + + use super::*; + + const MAX_TEST_SIZE: usize = 1024; + + impl Arbitrary for BitDecomposed + where + S: Debug, + Vec: Arbitrary, + { + type Parameters = as Arbitrary>::Parameters; + type Strategy = prop::strategy::Map< as Arbitrary>::Strategy, fn(Vec) -> Self>; + + fn arbitrary_with(args: Self::Parameters) -> Self::Strategy { + Vec::::arbitrary_with(args).prop_map(|bits| Self { bits }) + } + } + + prop_compose! { + fn val_and_index() + (vec in prop::collection::vec(any::(), 2..MAX_TEST_SIZE)) + (index in 0..vec.len(), vec in Just(vec)) + -> (BitDecomposed, usize) { + (BitDecomposed { bits: vec }, index) + } + } + + proptest! { + #[test] + fn arrayaccess_get_set( + (mut a, ix) in val_and_index(), + b: u8, + c: u8, + d: u8, + ) { + prop_assert_eq!(a.get(0), Some(&a.bits[0])); + a.set(0, &b); + prop_assert_eq!(a.get(0), Some(&b)); + prop_assert_eq!(a.get(ix), Some(&a.bits[ix])); + a.set(ix, &c); + prop_assert_eq!(a.get(ix), Some(&c)); + prop_assert_eq!(a.get(a.len() - 1), Some(&a.bits[a.len() - 1])); + a.set(a.len() - 1, &d); + prop_assert_eq!(a.get(a.len() - 1), Some(&d)); + prop_assert_eq!(a.get(a.len()), None); + let BitDecomposed { + bits: mut a_mod, + } = a.clone(); + a_mod[0] = b; + a_mod[ix] = c; + a_mod[a.len() - 1] = d; + prop_assert_eq!(a.bits, a_mod); + } + + #[test] + fn arrayaccess_iter(val in any::>()) { + let mut iter = val.iter().enumerate(); + prop_assert_eq!(iter.len(), val.len()); + while let Some((i, v)) = iter.next() { + prop_assert_eq!(v, &val.bits[i]); + prop_assert_eq!(iter.len(), val.len() - 1 - i); + } + } + + #[test] + fn arrayaccess_make_ref(val in any::()) { + prop_assert_eq!( as ArrayAccessRef>::make_ref(&val), &val); + } + } + + #[test] + fn arraybuild() { + let mut b = BitDecomposed::::builder(); + b.push(1); + b.push(2); + b.push(3); + assert_eq!( + b.build(), + BitDecomposed { + bits: vec![1, 2, 3] + } + ); + } + + proptest! { + #[test] + fn arraybuild_with_capacity(capacity in 0..MAX_TEST_SIZE) { + let b = BitDecomposed::::builder().with_capacity(capacity); + prop_assert!(b.bits.capacity() >= capacity); + } + } +} diff --git a/ipa-core/src/secret_sharing/mod.rs b/ipa-core/src/secret_sharing/mod.rs index f7479433b..9d2b6f1c2 100644 --- a/ipa-core/src/secret_sharing/mod.rs +++ b/ipa-core/src/secret_sharing/mod.rs @@ -247,6 +247,7 @@ pub trait SharedValueArray: pub trait FieldArray: SharedValueArray + FromRandom + + for<'a> Mul + for<'a> Mul<&'a F, Output = Self> + for<'a> Mul<&'a Self, Output = Self> { From 564afcbace7a8a96e5891118387d8528014be24e Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Fri, 26 Jan 2024 15:42:31 -0800 Subject: [PATCH 021/135] Waive unused imports in coverage build --- .../boolean_ops/comparison_and_subtraction_sequential.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs index 43abfeacc..c882b9f9f 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs @@ -228,6 +228,7 @@ where } #[cfg(all(test, unit_test))] +#[cfg_attr(coverage, allow(unused_imports))] mod test { use std::{ array, @@ -390,6 +391,7 @@ mod test { }); } + #[cfg(not(coverage))] const BENCH_COUNT: usize = 131_072; #[test] From e3d030e0e6a9d2b34bdb4b999b9ba754c2eb0998 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Tue, 13 Feb 2024 14:12:44 -0800 Subject: [PATCH 022/135] Use LengthError in `impl TryFrom>` for boolean arrays --- ipa-core/src/ff/boolean_array.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index 711aa4f18..00b21ca93 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -6,6 +6,7 @@ use generic_array::GenericArray; use typenum::{U14, U2, U32, U8}; use crate::{ + error::LengthError, ff::{boolean::Boolean, ArrayAccess, ArrayBuilder, Field, Serializable}, protocol::prss::{FromRandom, FromRandomU128}, secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, @@ -487,12 +488,15 @@ macro_rules! boolean_array_impl { } impl TryFrom> for $name { - type Error = (); + type Error = LengthError; fn try_from(value: Vec) -> Result { if value.len() == $bits { Ok(value.into_iter().collect::()) } else { - Err(()) + Err(LengthError { + expected: $bits, + actual: value.len(), + }) } } } From 7e9432f7bfebb30bb57c0b181e8445f369049873 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Tue, 13 Feb 2024 17:35:59 -0800 Subject: [PATCH 023/135] A few more tests to improve coverage --- ipa-core/src/error.rs | 2 +- ipa-core/src/ff/boolean.rs | 10 ++ ipa-core/src/ff/boolean_array.rs | 182 ++++++++++++++++++------------- 3 files changed, 115 insertions(+), 79 deletions(-) diff --git a/ipa-core/src/error.rs b/ipa-core/src/error.rs index c896352e2..5fb22dfca 100644 --- a/ipa-core/src/error.rs +++ b/ipa-core/src/error.rs @@ -91,7 +91,7 @@ pub type BoxError = Box; pub type Res = Result; -#[derive(Debug)] +#[derive(Debug, PartialEq, Eq)] pub struct LengthError { pub expected: usize, pub actual: usize, diff --git a/ipa-core/src/ff/boolean.rs b/ipa-core/src/ff/boolean.rs index 4e1960d94..fafd3bc2b 100644 --- a/ipa-core/src/ff/boolean.rs +++ b/ipa-core/src/ff/boolean.rs @@ -215,11 +215,21 @@ impl FieldVectorizable<256> for Boolean { #[cfg(all(test, unit_test))] mod test { use generic_array::GenericArray; + use proptest::prelude::{prop, Arbitrary, Strategy}; use rand::{thread_rng, Rng}; use typenum::U1; use crate::ff::{boolean::Boolean, Serializable}; + impl Arbitrary for Boolean { + type Parameters = ::Parameters; + type Strategy = prop::strategy::Map<::Strategy, fn(bool) -> Self>; + + fn arbitrary_with(args: Self::Parameters) -> Self::Strategy { + ::arbitrary_with(args).prop_map(Boolean) + } + } + ///test serialize and deserialize #[test] fn serde_boolean() { diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index 00b21ca93..ae34dc1e8 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -533,7 +533,12 @@ macro_rules! boolean_array_impl { let mut iter = iter.into_iter(); for i in 0..$bits { - res.0.set(i, bool::from(iter.next().unwrap())); + res.0.set( + i, + bool::from(iter.next().unwrap_or_else(|| { + panic!("Expected iterator to produce {} items, got only {i}", $bits) + })), + ); } res @@ -597,6 +602,90 @@ macro_rules! boolean_array_impl { } } + proptest! { + #[test] + fn add_sub(a: $name, b: $name) { + let xor = $name(a.0 ^ b.0); + + assert_eq!(&a + &b, xor); + assert_eq!(&a + b.clone(), xor); + assert_eq!(a.clone() + &b, xor); + assert_eq!(a.clone() + b.clone(), xor); + + let mut tmp = a.clone(); + tmp += &b; + assert_eq!(tmp, xor); + + let mut tmp = a.clone(); + tmp += b; + assert_eq!(tmp, xor); + + // Sub not implemented yet for &BA + //assert_eq!(&a - &b, xor); + //assert_eq!(&a - b.clone(), xor); + assert_eq!(a.clone() - &b, xor); + assert_eq!(a.clone() - b.clone(), xor); + + let mut tmp = a.clone(); + tmp -= &b; + assert_eq!(tmp, xor); + + let mut tmp = a.clone(); + tmp -= b; + assert_eq!(tmp, xor); + + assert_eq!(-a, a); + assert_eq!(a + (-a), $name::ZERO); + } + + #[test] + fn mul(mut a: $name, b: $name, c: Boolean) { + let prod = $name(a.0 & b.0); + + a *= b; + assert_eq!(a, prod); + + assert_eq!(a * Boolean::from(false), $name::ZERO); + assert_eq!(a * Boolean::from(true), a); + assert_eq!(a * c, if bool::from(c) { a } else { $name::ZERO }); + assert_eq!(a * &c, if bool::from(c) { a } else { $name::ZERO }); + } + } + + #[test] + fn boolean_array_from_vec() { + let v = [false, false, true].map(Boolean::from).to_vec(); + assert_eq!(BA3::try_from(v.clone()), Ok(BA3::truncate_from(4_u128))); + assert_eq!( + BA8::try_from(v), + Err(LengthError { + expected: 8, + actual: 3 + }) + ); + } + + #[test] + fn boolean_array_from_fn() { + assert_eq!( + BA3::from_fn(|i| Boolean::from(i == 2)), + BA3::truncate_from(4_u128) + ); + } + + #[test] + fn boolean_array_from_iter() { + let iter = [false, false, true].into_iter().map(Boolean::from); + assert_eq!(BA3::from_iter(iter), BA3::truncate_from(4_u128)); + } + + #[test] + #[should_panic(expected = "Expected iterator to produce 3 items, got only 2")] + fn boolean_array_from_short_iter() { + let iter = [false, false].into_iter().map(Boolean::from); + assert_eq!(BA3::from_iter(iter), BA3::truncate_from(4_u128)); + } + #[test] fn set_boolean_array() { let mut rng = thread_rng(); @@ -620,7 +709,7 @@ macro_rules! boolean_array_impl { #[test] fn iterate_secret_shared_boolean_array(a: AdditiveShare<$name>) { - use crate::secret_sharing::replicated::ReplicatedSecretSharing; + use crate::secret_sharing::replicated::ReplicatedSecretSharing; let mut iter = a.iter().enumerate(); assert_eq!(iter.len(), $bits); while let Some((i, sb)) = iter.next() { @@ -631,6 +720,19 @@ macro_rules! boolean_array_impl { } } + #[test] + fn iterate_secret_shared_boolean_array_ref(a: AdditiveShare<$name>) { + use crate::secret_sharing::replicated::ReplicatedSecretSharing; + let mut iter = (&a).into_iter().enumerate(); + assert_eq!(iter.len(), $bits); + while let Some((i, sb)) = iter.next() { + let left = Boolean::from(a.left().0[i]); + let right = Boolean::from(a.right().0[i]); + assert_eq!(sb, AdditiveShare::new(left, right)); + assert_eq!(iter.len(), $bits - 1 - i); + } + } + #[test] fn owned_iterator(a: $name) { let mut iter = a.into_iter().enumerate(); @@ -744,79 +846,3 @@ where self.array } } - -#[cfg(all(test, unit_test))] -mod tests { - use rand::{thread_rng, Rng}; - - use super::*; - - // It does not seem worth running these tests for every BA type, although - // it would be worth writing a version for the largest BA type (which - // requires replacing truncate_from). - - #[test] - #[allow(clippy::clone_on_copy, clippy::op_ref)] - pub fn add_sub() { - let mut rng = thread_rng(); - let a = rng.gen::(); - let b = rng.gen::(); - - let xor = BA8::truncate_from(a ^ b); - - let a = BA8::truncate_from(a); - let b = BA8::truncate_from(b); - - assert_eq!(&a + &b, xor); - assert_eq!(&a + b.clone(), xor); - assert_eq!(a.clone() + &b, xor); - assert_eq!(a.clone() + b.clone(), xor); - - let mut tmp = a.clone(); - tmp += &b; - assert_eq!(tmp, xor); - - let mut tmp = a.clone(); - tmp += b; - assert_eq!(tmp, xor); - - // Sub not implemented yet for &BA - //assert_eq!(&a - &b, xor); - //assert_eq!(&a - b.clone(), xor); - assert_eq!(a.clone() - &b, xor); - assert_eq!(a.clone() - b.clone(), xor); - - let mut tmp = a.clone(); - tmp -= &b; - assert_eq!(tmp, xor); - - let mut tmp = a.clone(); - tmp -= b; - assert_eq!(tmp, xor); - - assert_eq!(-a, a); - assert_eq!(a + (-a), BA8::ZERO); - } - - #[test] - #[allow(clippy::clone_on_copy, clippy::op_ref)] - pub fn mul() { - let mut rng = thread_rng(); - let a = rng.gen::(); - let b = rng.gen::(); - let c = rng.gen::(); - - let prod = BA8::truncate_from(a & b); - - let mut a = BA8::truncate_from(a); - let b = BA8::truncate_from(b); - - a *= b; - assert_eq!(a, prod); - - assert_eq!(a * Boolean::from(false), BA8::ZERO); - assert_eq!(a * Boolean::from(true), a); - assert_eq!(a * c, if bool::from(c) { a } else { BA8::ZERO }); - assert_eq!(a * &c, if bool::from(c) { a } else { BA8::ZERO }); - } -} From b526f554d4b1771a1046008234e856cbd31229f0 Mon Sep 17 00:00:00 2001 From: danielmasny <46358615+danielmasny@users.noreply.github.com> Date: Thu, 15 Feb 2024 13:48:28 -0800 Subject: [PATCH 024/135] Add Encryption and Decryption for OPRF Report Structs (#904) * defining encrypted oprf report:: constants * encryptedoprfreport compiles * reports decrypt encrypt * decryption roundtrip passes * fmt * fix clippy * fix clippy * fix clippy * delete comment * remove crazy trait bounds * support encrypted report queries * add test (fails because of quicksort) * clippy * fmt * fix test * clippy * let compiler defer length of gen array * merge * addressing some comments * fmt * offsets * split OprfReport into OprfReport and OPRFIPAInputRow * address other comments * address Alex comments * address comments * address comments * fix CT length * added error length and validate when generating report from bytes --- ipa-core/src/bin/report_collector.rs | 3 +- ipa-core/src/cli/playbook/ipa.rs | 55 +- ipa-core/src/hpke/mod.rs | 5 +- ipa-core/src/hpke/registry.rs | 6 +- ipa-core/src/protocol/ipa_prf/mod.rs | 108 +++- ipa-core/src/protocol/ipa_prf/shuffle/mod.rs | 18 +- ipa-core/src/query/executor.rs | 4 +- ipa-core/src/query/runner/oprf_ipa.rs | 167 +++++- ipa-core/src/report.rs | 525 +++++++++++++++---- ipa-core/src/test_fixture/input/sharing.rs | 66 ++- ipa-core/src/test_fixture/ipa.rs | 5 +- 11 files changed, 801 insertions(+), 161 deletions(-) diff --git a/ipa-core/src/bin/report_collector.rs b/ipa-core/src/bin/report_collector.rs index 2fcbd28fa..0df54c325 100644 --- a/ipa-core/src/bin/report_collector.rs +++ b/ipa-core/src/bin/report_collector.rs @@ -290,11 +290,12 @@ async fn ipa( let mut key_registries = KeyRegistries::default(); let actual = match query_style { IpaQueryStyle::Oprf => { - playbook_oprf_ipa::( + playbook_oprf_ipa::( input_rows, &helper_clients, query_id, ipa_query_config, + key_registries.init_from(network), ) .await } diff --git a/ipa-core/src/cli/playbook/ipa.rs b/ipa-core/src/cli/playbook/ipa.rs index 8459d946e..eb9d96a2d 100644 --- a/ipa-core/src/cli/playbook/ipa.rs +++ b/ipa-core/src/cli/playbook/ipa.rs @@ -22,7 +22,10 @@ use crate::{ hpke::PublicKeyRegistry, ipa_test_input, net::MpcHelperClient, - protocol::{ipa::IPAInputRow, BreakdownKey, MatchKey, QueryId, Timestamp, TriggerValue}, + protocol::{ + ipa::IPAInputRow, ipa_prf::OPRFIPAInputRow, BreakdownKey, MatchKey, QueryId, Timestamp, + TriggerValue, + }, query::QueryStatus, report::{KeyIdentifier, OprfReport, Report}, secret_sharing::{replicated::semi_honest::AdditiveShare, IntoShares}, @@ -103,31 +106,59 @@ where run_query_and_validate::(inputs, query_size, clients, query_id, query_config).await } -pub async fn playbook_oprf_ipa( +pub async fn playbook_oprf_ipa( records: Vec, clients: &[MpcHelperClient; 3], query_id: QueryId, query_config: IpaQueryConfig, + encryption: Option<(KeyIdentifier, [&KR; 3])>, ) -> IpaQueryResult where F: PrimeField, AdditiveShare: Serializable, + KR: PublicKeyRegistry, { let mut buffers: [_; 3] = std::array::from_fn(|_| Vec::new()); let query_size = records.len(); - let sz = as Serializable>::Size::USIZE; - for buffer in &mut buffers { - buffer.resize(query_size * sz, 0u8); - } + if !query_config.plaintext_match_keys { + if let Some((key_id, key_registries)) = encryption { + const ESTIMATED_AVERAGE_REPORT_SIZE: usize = 80; // TODO: confirm/adjust + for buffer in &mut buffers { + buffer.reserve(query_size * ESTIMATED_AVERAGE_REPORT_SIZE); + } - let shares: [Vec>; 3] = - records.iter().cloned().share(); - zip(&mut buffers, shares).for_each(|(buf, shares)| { - for (share, chunk) in zip(shares, buf.chunks_mut(sz)) { - share.serialize(GenericArray::from_mut_slice(chunk)); + let mut rng = StdRng::from_entropy(); + let shares: [Vec>; 3] = + records.iter().cloned().share(); + zip(&mut buffers, shares).zip(key_registries).for_each( + |((buf, shares), key_registry)| { + for share in shares { + share + .delimited_encrypt_to(key_id, key_registry, &mut rng, buf) + .unwrap(); + } + }, + ); + } else { + panic!("match key encryption was requested, but one or more helpers is missing a public key") + } + } else { + let sz = + as Serializable>::Size::USIZE; + for buffer in &mut buffers { + buffer.resize(query_size * sz, 0u8); } - }); + + let shares: [Vec>; 3] = + records.iter().cloned().share(); + + zip(&mut buffers, shares).for_each(|(buf, shares)| { + for (share, chunk) in zip(shares, buf.chunks_mut(sz)) { + share.serialize(GenericArray::from_mut_slice(chunk)); + } + }); + } let inputs = buffers.map(BodyStream::from); tracing::info!("Starting query for OPRF"); diff --git a/ipa-core/src/hpke/mod.rs b/ipa-core/src/hpke/mod.rs index d2f47cd63..48d4c1303 100644 --- a/ipa-core/src/hpke/mod.rs +++ b/ipa-core/src/hpke/mod.rs @@ -29,9 +29,12 @@ type IpaKem = hpke::kem::X25519HkdfSha256; type IpaAead = hpke::aead::AesGcm128; type IpaKdf = hpke::kdf::HkdfSha256; +pub type EncapsulationSize = <::EncappedKey as Serializable>::OutputSize; +pub type TagSize = as Serializable>::OutputSize; + pub type IpaPublicKey = ::PublicKey; pub type IpaPrivateKey = ::PrivateKey; -pub type IpaEncappedKey = ::EncappedKey; +pub type IpaEncapsulatedKey = ::EncappedKey; pub use hpke::{Deserializable, Serializable}; diff --git a/ipa-core/src/hpke/registry.rs b/ipa-core/src/hpke/registry.rs index 338553a8d..87bbbc0f6 100644 --- a/ipa-core/src/hpke/registry.rs +++ b/ipa-core/src/hpke/registry.rs @@ -128,7 +128,7 @@ mod tests { use rand_core::{CryptoRng, RngCore, SeedableRng}; use super::*; - use crate::hpke::{IpaAead, IpaEncappedKey, IpaKdf, IpaKem}; + use crate::hpke::{IpaAead, IpaEncapsulatedKey, IpaKdf, IpaKem}; const INFO_STR: &[u8] = b"This is an INFO string."; const AAD: &[u8] = b"This is AAD."; @@ -137,7 +137,7 @@ mod tests { pk: &IpaPublicKey, pt: &[u8], r: &mut R, - ) -> (IpaEncappedKey, Vec) { + ) -> (IpaEncapsulatedKey, Vec) { let (encapsulated_key, mut encryption_context) = hpke::setup_sender::(&OpModeS::Base, pk, INFO_STR, r) .expect("Can setup the sender."); @@ -152,7 +152,7 @@ mod tests { fn decrypt>( sk: &IpaPrivateKey, - payload: &(IpaEncappedKey, I), + payload: &(IpaEncapsulatedKey, I), ) -> Result, HpkeError> { let (encap_key, ct) = payload; let mut decryption_context = hpke::setup_receiver::( diff --git a/ipa-core/src/protocol/ipa_prf/mod.rs b/ipa-core/src/protocol/ipa_prf/mod.rs index 47616d929..e7dc68f52 100644 --- a/ipa-core/src/protocol/ipa_prf/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/mod.rs @@ -1,10 +1,12 @@ -use std::num::NonZeroU32; +use std::{num::NonZeroU32, ops::Add}; +use generic_array::{ArrayLength, GenericArray}; use ipa_macros::Step; +use typenum::{Unsigned, U18}; use self::{quicksort::quicksort_ranges_by_key_insecure, shuffle::shuffle_inputs}; use crate::{ - error::Error, + error::{Error, UnwrapInfallible}, ff::{boolean::Boolean, boolean_array::BA64, CustomArray, Field, PrimeField, Serializable}, protocol::{ context::{UpgradableContext, UpgradedContext}, @@ -17,7 +19,6 @@ use crate::{ }, RecordId, }, - report::OprfReport, secret_sharing::{ replicated::{malicious::ExtendableField, semi_honest::AdditiveShare as Replicated}, SharedValue, @@ -40,6 +41,103 @@ pub(crate) enum Step { SortByTimestamp, } +#[derive(Debug)] +#[cfg_attr(test, derive(Clone, PartialEq, Eq))] +pub struct OPRFIPAInputRow { + pub match_key: Replicated, + pub is_trigger: Replicated, + pub breakdown_key: Replicated, + pub trigger_value: Replicated, + pub timestamp: Replicated, +} + +impl Serializable for OPRFIPAInputRow +where + Replicated: Serializable, + Replicated: Serializable, + Replicated: Serializable, + as Serializable>::Size: Add, + as Serializable>::Size: + Add<< as Serializable>::Size as Add>::Output>, + as Serializable>::Size: Add< + < as Serializable>::Size as Add< + < as Serializable>::Size as Add>::Output, + >>::Output, + >, + < as Serializable>::Size as Add< + < as Serializable>::Size as Add< + < as Serializable>::Size as Add>::Output, + >>::Output, + >>::Output: ArrayLength, +{ + type Size = < as Serializable>::Size as Add< + < as Serializable>::Size as Add< + < as Serializable>::Size as Add>::Output, + >>::Output, + >>::Output; + type DeserializationError = Error; + + fn serialize(&self, buf: &mut GenericArray) { + let mk_sz = as Serializable>::Size::USIZE; + let ts_sz = as Serializable>::Size::USIZE; + let bk_sz = as Serializable>::Size::USIZE; + let tv_sz = as Serializable>::Size::USIZE; + let it_sz = as Serializable>::Size::USIZE; + + self.match_key + .serialize(GenericArray::from_mut_slice(&mut buf[..mk_sz])); + + self.timestamp + .serialize(GenericArray::from_mut_slice(&mut buf[mk_sz..mk_sz + ts_sz])); + + self.breakdown_key.serialize(GenericArray::from_mut_slice( + &mut buf[mk_sz + ts_sz..mk_sz + ts_sz + bk_sz], + )); + + self.trigger_value.serialize(GenericArray::from_mut_slice( + &mut buf[mk_sz + ts_sz + bk_sz..mk_sz + ts_sz + bk_sz + tv_sz], + )); + + self.is_trigger.serialize(GenericArray::from_mut_slice( + &mut buf[mk_sz + ts_sz + bk_sz + tv_sz..mk_sz + ts_sz + bk_sz + tv_sz + it_sz], + )); + } + + fn deserialize(buf: &GenericArray) -> Result { + let mk_sz = as Serializable>::Size::USIZE; + let ts_sz = as Serializable>::Size::USIZE; + let bk_sz = as Serializable>::Size::USIZE; + let tv_sz = as Serializable>::Size::USIZE; + let it_sz = as Serializable>::Size::USIZE; + + let match_key = Replicated::::deserialize(GenericArray::from_slice(&buf[..mk_sz])) + .unwrap_infallible(); + let timestamp = + Replicated::::deserialize(GenericArray::from_slice(&buf[mk_sz..mk_sz + ts_sz])) + .map_err(|e| Error::ParseError(e.into()))?; + let breakdown_key = Replicated::::deserialize(GenericArray::from_slice( + &buf[mk_sz + ts_sz..mk_sz + ts_sz + bk_sz], + )) + .map_err(|e| Error::ParseError(e.into()))?; + let trigger_value = Replicated::::deserialize(GenericArray::from_slice( + &buf[mk_sz + ts_sz + bk_sz..mk_sz + ts_sz + bk_sz + tv_sz], + )) + .map_err(|e| Error::ParseError(e.into()))?; + let is_trigger = Replicated::::deserialize(GenericArray::from_slice( + &buf[mk_sz + ts_sz + bk_sz + tv_sz..mk_sz + ts_sz + bk_sz + tv_sz + it_sz], + )) + .map_err(|e| Error::ParseError(e.into()))?; + + Ok(Self { + match_key, + is_trigger, + breakdown_key, + trigger_value, + timestamp, + }) + } +} + /// IPA OPRF Protocol /// /// The output of this function is a vector of secret-shared totals, one per breakdown key @@ -63,7 +161,7 @@ pub(crate) enum Step { /// Propagates errors from config issues or while running the protocol pub async fn oprf_ipa( ctx: C, - input_rows: Vec>, + input_rows: Vec>, attribution_window_seconds: Option, ) -> Result>, Error> where @@ -105,7 +203,7 @@ where #[tracing::instrument(name = "compute_prf_for_inputs", skip_all)] async fn compute_prf_for_inputs( ctx: C, - input_rows: Vec>, + input_rows: Vec>, ) -> Result>, Error> where C: UpgradableContext, diff --git a/ipa-core/src/protocol/ipa_prf/shuffle/mod.rs b/ipa-core/src/protocol/ipa_prf/shuffle/mod.rs index db982a0ad..62a7ac5fc 100644 --- a/ipa-core/src/protocol/ipa_prf/shuffle/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/shuffle/mod.rs @@ -7,8 +7,10 @@ use crate::{ boolean_array::{BA112, BA64}, ArrayAccess, CustomArray, Expand, Field, }, - protocol::context::{UpgradableContext, UpgradedContext}, - report::OprfReport, + protocol::{ + context::{UpgradableContext, UpgradedContext}, + ipa_prf::OPRFIPAInputRow, + }, secret_sharing::{ replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, SharedValue, @@ -20,8 +22,8 @@ pub mod base; #[tracing::instrument(name = "shuffle_inputs", skip_all)] pub async fn shuffle_inputs( ctx: C, - input: Vec>, -) -> Result>, Error> + input: Vec>, +) -> Result>, Error> where C: UpgradableContext, C::UpgradedContext: UpgradedContext>, @@ -44,7 +46,7 @@ where // This function converts OprfReport to an AdditiveShare needed for shuffle protocol pub fn oprfreport_to_shuffle_input( - input: &OprfReport, + input: &OPRFIPAInputRow, ) -> AdditiveShare where YS: CustomArray::Element> + SharedValue, @@ -73,7 +75,9 @@ where } // This function converts AdditiveShare obtained from shuffle protocol to OprfReport -pub fn shuffled_to_oprfreport(input: &AdditiveShare) -> OprfReport +pub fn shuffled_to_oprfreport( + input: &AdditiveShare, +) -> OPRFIPAInputRow where YS: SharedValue + CustomArray, BK: SharedValue + CustomArray, @@ -99,7 +103,7 @@ where offset += TV::BITS as usize; let timestamp = extract_from_shared_array::(input, offset); - OprfReport { + OPRFIPAInputRow { match_key, is_trigger, breakdown_key, diff --git a/ipa-core/src/query/executor.rs b/ipa-core/src/query/executor.rs index 5244c6c22..1f663499c 100644 --- a/ipa-core/src/query/executor.rs +++ b/ipa-core/src/query/executor.rs @@ -209,7 +209,7 @@ pub fn execute( move |prss, gateway, config, input| { let ctx = SemiHonestContext::new(prss, gateway); Box::pin( - OprfIpaQuery::<_, Fp32BitPrime>::new(ipa_config) + OprfIpaQuery::<_, Fp32BitPrime>::new(ipa_config, key_registry) .execute(ctx, config.size, input) .then(|res| ready(res.map(|out| Box::new(out) as Box))), ) @@ -223,7 +223,7 @@ pub fn execute( move |prss, gateway, config, input| { let ctx = SemiHonestContext::new(prss, gateway); Box::pin( - OprfIpaQuery::<_, crate::ff::Fp31>::new(ipa_config) + OprfIpaQuery::<_, crate::ff::Fp31>::new(ipa_config, key_registry) .execute(ctx, config.size, input) .then(|res| ready(res.map(|out| Box::new(out) as Box))), ) diff --git a/ipa-core/src/query/runner/oprf_ipa.rs b/ipa-core/src/query/runner/oprf_ipa.rs index c5b0776da..4c013d259 100644 --- a/ipa-core/src/query/runner/oprf_ipa.rs +++ b/ipa-core/src/query/runner/oprf_ipa.rs @@ -1,38 +1,44 @@ use std::marker::PhantomData; -use futures::TryStreamExt; +use futures::{stream::iter, StreamExt, TryStreamExt}; +use futures_util::stream::repeat; use crate::{ error::Error, ff::{ boolean::Boolean, boolean_array::{BA20, BA3, BA4, BA5, BA6, BA7, BA8}, - PrimeField, Serializable, + Field, PrimeField, Serializable, }, helpers::{ query::{IpaQueryConfig, QuerySize}, - BodyStream, RecordsStream, + BodyStream, LengthDelimitedStream, RecordsStream, }, + hpke::{KeyPair, KeyRegistry}, protocol::{ basics::ShareKnownValue, context::{UpgradableContext, UpgradedContext}, - ipa_prf::oprf_ipa, + ipa_prf::{oprf_ipa, OPRFIPAInputRow}, }, - report::OprfReport, - secret_sharing::replicated::{ - malicious::ExtendableField, semi_honest::AdditiveShare as Replicated, + report::{EncryptedOprfReport, EventType}, + secret_sharing::{ + replicated::{malicious::ExtendableField, semi_honest::AdditiveShare as Replicated}, + SharedValue, }, + sync::Arc, }; pub struct OprfIpaQuery { config: IpaQueryConfig, + key_registry: Arc>, phantom_data: PhantomData<(C, F)>, } impl OprfIpaQuery { - pub fn new(config: IpaQueryConfig) -> Self { + pub fn new(config: IpaQueryConfig, key_registry: Arc>) -> Self { Self { config, + key_registry, phantom_data: PhantomData, } } @@ -57,19 +63,52 @@ where ) -> Result>, Error> { let Self { config, + key_registry, phantom_data: _, } = self; tracing::info!("New query: {config:?}"); let sz = usize::from(query_size); let input = if config.plaintext_match_keys { - let mut v = RecordsStream::, _>::new(input_stream) + let mut v = RecordsStream::, _>::new(input_stream) .try_concat() .await?; v.truncate(sz); v } else { - panic!("Encrypted match key handling is not handled for OPRF flow as yet"); + LengthDelimitedStream::, _>::new(input_stream) + .map_err(Into::::into) + .map_ok(|enc_reports| { + iter(enc_reports.into_iter().map(|enc_report| { + enc_report + .decrypt(key_registry.as_ref()) + .map_err(Into::::into) + })) + }) + .try_flatten() + .take(sz) + .zip(repeat(ctx.clone())) + .map(|(res, ctx)| { + res.map(|report| { + let is_trigger = Replicated::::share_known_value( + &ctx, + match report.event_type { + EventType::Source => Boolean::ZERO, + EventType::Trigger => Boolean::ONE, + }, + ); + + OPRFIPAInputRow { + timestamp: report.timestamp, + match_key: report.match_key, + is_trigger, + breakdown_key: report.breakdown_key, + trigger_value: report.trigger_value, + } + }) + }) + .try_collect::>() + .await? }; let aws = config.attribution_window_seconds; @@ -86,3 +125,111 @@ where } } } + +#[cfg(all(test, unit_test))] +mod tests { + use std::iter::zip; + + use rand::rngs::StdRng; + use rand_core::SeedableRng; + + use super::*; + use crate::{ + ff::{Field, Fp31}, + report::{OprfReport, DEFAULT_KEY_ID}, + secret_sharing::IntoShares, + test_fixture::{ipa::TestRawDataRecord, join3v, Reconstruct, TestWorld}, + }; + + #[tokio::test] + async fn encrypted_reports() { + const EXPECTED: &[u128] = &[0, 8, 5]; + + let records: Vec = vec![ + TestRawDataRecord { + timestamp: 0, + user_id: 12345, + is_trigger_report: false, + breakdown_key: 2, + trigger_value: 0, + }, + TestRawDataRecord { + timestamp: 4, + user_id: 68362, + is_trigger_report: false, + breakdown_key: 1, + trigger_value: 0, + }, + TestRawDataRecord { + timestamp: 10, + user_id: 12345, + is_trigger_report: true, + breakdown_key: 0, + trigger_value: 5, + }, + TestRawDataRecord { + timestamp: 12, + user_id: 68362, + is_trigger_report: true, + breakdown_key: 0, + trigger_value: 2, + }, + TestRawDataRecord { + timestamp: 20, + user_id: 68362, + is_trigger_report: false, + breakdown_key: 1, + trigger_value: 0, + }, + TestRawDataRecord { + timestamp: 30, + user_id: 68362, + is_trigger_report: true, + breakdown_key: 1, + trigger_value: 7, + }, + ]; + + let query_size = QuerySize::try_from(records.len()).unwrap(); + + let mut rng = StdRng::seed_from_u64(42); + let key_id = DEFAULT_KEY_ID; + let key_registry = Arc::new(KeyRegistry::random(1, &mut rng)); + + let mut buffers: [_; 3] = std::array::from_fn(|_| Vec::new()); + + let shares: [Vec>; 3] = records.into_iter().share(); + for (buf, shares) in zip(&mut buffers, shares) { + for share in shares { + share + .delimited_encrypt_to(key_id, key_registry.as_ref(), &mut rng, buf) + .unwrap(); + } + } + + let world = TestWorld::default(); + let contexts = world.contexts(); + #[allow(clippy::large_futures)] + let results = join3v(buffers.into_iter().zip(contexts).map(|(buffer, ctx)| { + let query_config = IpaQueryConfig { + num_multi_bits: 3, + per_user_credit_cap: 8, + attribution_window_seconds: None, + max_breakdown_key: 3, + plaintext_match_keys: false, + }; + let input = BodyStream::from(buffer); + OprfIpaQuery::<_, Fp31>::new(query_config, Arc::clone(&key_registry)) + .execute(ctx, query_size, input) + })) + .await; + + assert_eq!( + results.reconstruct()[0..3] + .iter() + .map(Field::as_u128) + .collect::>(), + EXPECTED + ); + } +} diff --git a/ipa-core/src/report.rs b/ipa-core/src/report.rs index 37f8b466b..6b16e4c9e 100644 --- a/ipa-core/src/report.rs +++ b/ipa-core/src/report.rs @@ -1,8 +1,6 @@ use std::{ - convert::Infallible, fmt::{Display, Formatter}, marker::PhantomData, - mem::size_of, ops::{Add, Deref}, }; @@ -10,17 +8,14 @@ use bytes::{BufMut, Bytes}; use generic_array::{ArrayLength, GenericArray}; use hpke::Serializable as _; use rand_core::{CryptoRng, RngCore}; -use typenum::{Unsigned, U1, U18, U8}; +use typenum::{Sum, Unsigned, U1, U16}; use crate::{ - error::{BoxError, Error, UnwrapInfallible}, - ff::{ - boolean::Boolean, boolean_array::BA64, GaloisField, Gf40Bit, Gf8Bit, PrimeField, - Serializable, - }, + error::BoxError, + ff::{boolean_array::BA64, GaloisField, Gf40Bit, Gf8Bit, PrimeField, Serializable}, hpke::{ - open_in_place, seal_in_place, CryptError, FieldShareCrypt, Info, KeyPair, KeyRegistry, - PublicKeyRegistry, + open_in_place, seal_in_place, CryptError, EncapsulationSize, FieldShareCrypt, Info, + KeyPair, KeyRegistry, PublicKeyRegistry, TagSize, }, secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, SharedValue}, }; @@ -63,16 +58,16 @@ impl Serializable for EventType { fn serialize(&self, buf: &mut GenericArray) { let raw: &[u8] = match self { - EventType::Trigger => &[0], - EventType::Source => &[1], + EventType::Trigger => &[1], + EventType::Source => &[0], }; buf.copy_from_slice(raw); } fn deserialize(buf: &GenericArray) -> Result { match buf[0] { - 0 => Ok(EventType::Trigger), - 1 => Ok(EventType::Source), + 1 => Ok(EventType::Trigger), + 0 => Ok(EventType::Source), _ => Err(UnknownEventType(buf[0])), } } @@ -160,6 +155,8 @@ pub enum InvalidReportError { Crypt(#[from] CryptError), #[error("failed to deserialize field {0}: {1}")] DeserializationError(&'static str, #[source] BoxError), + #[error("report is too short: {0}, expected length at least: {1}")] + Length(usize, usize), } /// A binary report as submitted by a report collector, containing encrypted match key shares. @@ -346,7 +343,7 @@ where Replicated: Serializable, { /// # Panics - /// If report length does not fit in u16. + /// If report length does not fit in `u16`. pub fn encrypted_len(&self) -> u16 { let len = EncryptedReport::::SITE_DOMAIN_OFFSET + self.site_domain.as_bytes().len(); @@ -374,7 +371,7 @@ where key_registry: &impl PublicKeyRegistry, rng: &mut R, ) -> Result, InvalidReportError> { - let mut out = Vec::new(); + let mut out = Vec::with_capacity(usize::from(self.encrypted_len())); self.encrypt_to(key_id, key_registry, rng, &mut out)?; debug_assert_eq!(out.len(), usize::from(self.encrypted_len())); Ok(out) @@ -424,136 +421,384 @@ where } } -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct OprfReport +/// A binary report as submitted by a report collector, containing encrypted `OprfReport` +/// An `EncryptedOprfReport` consists of: +/// `ct_mk`: Enc(`match_key`) +/// `ct_btt`: Enc(`breakdown_key`, `trigger_value`, `timestamp`) +/// associated data of `ct_mk`: `key_id`, `epoch`, `event_type`, `site_domain`, +#[derive(Copy, Clone, Eq, PartialEq)] +pub struct EncryptedOprfReport where + B: Deref, BK: SharedValue, TV: SharedValue, TS: SharedValue, { - pub match_key: Replicated, - pub is_trigger: Replicated, - pub breakdown_key: Replicated, - pub trigger_value: Replicated, - pub timestamp: Replicated, + data: B, + phantom_data: PhantomData<(BK, TV, TS)>, } -impl Serializable for u64 { - type Size = U8; - type DeserializationError = Infallible; +// follows the outline of the implementation of `EncryptedReport` +// Report structure: +// * 0..a: `encap_key_1` +// * a..b: `mk_ciphertext` +// * b..c: `encap_key_2` +// * c..d: `btt_ciphertext` +// * d: `event_type` +// * d+1: `key_id` +// * d+2..d+4: `epoch` +// * d+4..: `site_domain` + +// btt ciphertext structure +// * 0..a `timestamp` +// * a..b `breakdown` +// * b..c `trigger value` +impl EncryptedOprfReport +where + B: Deref, + BK: SharedValue, + TV: SharedValue, + TS: SharedValue, + Replicated: Serializable, + Replicated: Serializable, + Replicated: Serializable, + as Serializable>::Size: Add< as Serializable>::Size>, + Sum< as Serializable>::Size, as Serializable>::Size>: + Add< as Serializable>::Size>, + Sum< + Sum< as Serializable>::Size, as Serializable>::Size>, + as Serializable>::Size, + >: Add, + Sum< + Sum< + Sum< as Serializable>::Size, as Serializable>::Size>, + as Serializable>::Size, + >, + U16, + >: ArrayLength, +{ + const ENCAP_KEY_MK_OFFSET: usize = 0; + const CIPHERTEXT_MK_OFFSET: usize = Self::ENCAP_KEY_MK_OFFSET + EncapsulationSize::USIZE; + const ENCAP_KEY_BTT_OFFSET: usize = (Self::CIPHERTEXT_MK_OFFSET + + TagSize::USIZE + + as Serializable>::Size::USIZE); + const CIPHERTEXT_BTT_OFFSET: usize = Self::ENCAP_KEY_BTT_OFFSET + EncapsulationSize::USIZE; - fn serialize(&self, buf: &mut GenericArray) { - let raw = &self.to_le_bytes()[..buf.len()]; - buf.copy_from_slice(raw); + const EVENT_TYPE_OFFSET: usize = (Self::CIPHERTEXT_BTT_OFFSET + + TagSize::USIZE + + as Serializable>::Size::USIZE + + as Serializable>::Size::USIZE + + as Serializable>::Size::USIZE); + const KEY_IDENTIFIER_OFFSET: usize = Self::EVENT_TYPE_OFFSET + 1; + const EPOCH_OFFSET: usize = Self::KEY_IDENTIFIER_OFFSET + 1; + const SITE_DOMAIN_OFFSET: usize = Self::EPOCH_OFFSET + 2; + + // offsets within Ciphertext_BTT + const TS_OFFSET: usize = 0; + + const BK_OFFSET: usize = Self::TS_OFFSET + as Serializable>::Size::USIZE; + const TV_OFFSET: usize = Self::BK_OFFSET + as Serializable>::Size::USIZE; + const TV_END: usize = Self::TV_OFFSET + as Serializable>::Size::USIZE; + + pub fn encap_key_mk(&self) -> &[u8] { + &self.data[Self::ENCAP_KEY_MK_OFFSET..Self::CIPHERTEXT_MK_OFFSET] } - fn deserialize(buf: &GenericArray) -> Result { - let mut buf_to = [0u8; 8]; - buf_to[..buf.len()].copy_from_slice(buf); - Ok(u64::from_le_bytes(buf_to)) + pub fn mk_ciphertext(&self) -> &[u8] { + &self.data[Self::CIPHERTEXT_MK_OFFSET..Self::ENCAP_KEY_BTT_OFFSET] + } + + pub fn encap_key_btt(&self) -> &[u8] { + &self.data[Self::ENCAP_KEY_BTT_OFFSET..Self::CIPHERTEXT_BTT_OFFSET] + } + + pub fn btt_ciphertext(&self) -> &[u8] { + &self.data[Self::CIPHERTEXT_BTT_OFFSET..Self::EVENT_TYPE_OFFSET] + } + + /// ## Panics + /// Only if a `Report` constructor failed to validate the contents properly, which would be a bug. + pub fn event_type(&self) -> EventType { + EventType::try_from(self.data[Self::EVENT_TYPE_OFFSET]).unwrap() // validated on construction + } + + pub fn key_id(&self) -> KeyIdentifier { + self.data[Self::KEY_IDENTIFIER_OFFSET] + } + + /// ## Panics + /// Never. + pub fn epoch(&self) -> Epoch { + u16::from_le_bytes( + self.data[Self::EPOCH_OFFSET..Self::SITE_DOMAIN_OFFSET] + .try_into() + .unwrap(), // infallible slice-to-array conversion + ) + } + + /// ## Panics + /// Only if a `Report` constructor failed to validate the contents properly, which would be a bug. + pub fn site_domain(&self) -> &str { + std::str::from_utf8(&self.data[Self::SITE_DOMAIN_OFFSET..]).unwrap() // validated on construction + } + + /// ## Errors + /// If the report contents are invalid. + pub fn from_bytes(bytes: B) -> Result { + if bytes.len() <= Self::SITE_DOMAIN_OFFSET { + return Err(InvalidReportError::Length( + bytes.len(), + Self::SITE_DOMAIN_OFFSET, + )); + } + EventType::try_from(bytes[Self::EVENT_TYPE_OFFSET])?; + let site_domain = &bytes[Self::SITE_DOMAIN_OFFSET..]; + if !site_domain.is_ascii() { + return Err(NonAsciiStringError::from(site_domain).into()); + } + Ok(Self { + data: bytes, + phantom_data: PhantomData, + }) + } + + /// ## Errors + /// If the match key shares in the report cannot be decrypted (e.g. due to a + /// failure of the authenticated encryption). + /// ## Panics + /// Should not panic. Only panics if a `Report` constructor failed to validate the + /// contents properly, which would be a bug. + pub fn decrypt( + &self, + key_registry: &KeyRegistry, + ) -> Result, InvalidReportError> { + type CTMKLength = Sum< as Serializable>::Size, TagSize>; + type CTBTTLength = Sum< + Sum< + Sum< as Serializable>::Size, as Serializable>::Size>, + as Serializable>::Size, + >, + TagSize, + >; + + let info = Info::new( + self.key_id(), + self.epoch(), + self.event_type(), + HELPER_ORIGIN, + self.site_domain(), + ) + .unwrap(); // validated on construction + + let mut ct_mk: GenericArray = + *GenericArray::from_slice(self.mk_ciphertext()); + // let mut ct_mk = self.mk_ciphertext().to_vec(); + let plaintext_mk = open_in_place(key_registry, self.encap_key_mk(), &mut ct_mk, &info)?; + let mut ct_btt: GenericArray> = + GenericArray::from_slice(self.btt_ciphertext()).clone(); + // let mut ct_btt = self.btt_ciphertext().to_vec(); + let plaintext_btt = open_in_place(key_registry, self.encap_key_btt(), &mut ct_btt, &info)?; + + Ok(OprfReport:: { + timestamp: Replicated::::deserialize(GenericArray::from_slice( + &plaintext_btt[Self::TS_OFFSET..Self::BK_OFFSET], + )) + .map_err(|e| InvalidReportError::DeserializationError("timestamp", e.into()))?, + match_key: Replicated::::deserialize(GenericArray::from_slice(plaintext_mk)) + .map_err(|e| InvalidReportError::DeserializationError("matchkey", e.into()))?, + event_type: self.event_type(), + breakdown_key: Replicated::::deserialize(GenericArray::from_slice( + &plaintext_btt[Self::BK_OFFSET..Self::TV_OFFSET], + )) + .map_err(|e| InvalidReportError::DeserializationError("is_trigger", e.into()))?, + trigger_value: Replicated::::deserialize(GenericArray::from_slice( + &plaintext_btt[Self::TV_OFFSET..Self::TV_END], + )) + .map_err(|e| InvalidReportError::DeserializationError("trigger_value", e.into()))?, + epoch: self.epoch(), + site_domain: self.site_domain().to_owned(), + }) } } -impl Serializable for OprfReport +impl TryFrom for EncryptedOprfReport where + BK: SharedValue, + TV: SharedValue, + TS: SharedValue, Replicated: Serializable, Replicated: Serializable, Replicated: Serializable, - as Serializable>::Size: Add, - as Serializable>::Size: - Add<< as Serializable>::Size as Add>::Output>, - as Serializable>::Size: Add< - < as Serializable>::Size as Add< - < as Serializable>::Size as Add>::Output, - >>::Output, - >, - < as Serializable>::Size as Add< - < as Serializable>::Size as Add< - < as Serializable>::Size as Add>::Output, - >>::Output, - >>::Output: ArrayLength, + as Serializable>::Size: Add< as Serializable>::Size>, + Sum< as Serializable>::Size, as Serializable>::Size>: + Add< as Serializable>::Size>, + Sum< + Sum< as Serializable>::Size, as Serializable>::Size>, + as Serializable>::Size, + >: Add, + Sum< + Sum< + Sum< as Serializable>::Size, as Serializable>::Size>, + as Serializable>::Size, + >, + U16, + >: ArrayLength, { - type Size = < as Serializable>::Size as Add< - < as Serializable>::Size as Add< - < as Serializable>::Size as Add>::Output, - >>::Output, - >>::Output; - type DeserializationError = Error; + type Error = InvalidReportError; - fn serialize(&self, buf: &mut GenericArray) { - let sizeof_matchkey = size_of::() * 2; - let sizeof_eventtype = size_of::() * 2; - let ts_sz = as Serializable>::Size::USIZE; - let bk_sz = as Serializable>::Size::USIZE; - let tv_sz = as Serializable>::Size::USIZE; + fn try_from(bytes: Bytes) -> Result { + EncryptedOprfReport::from_bytes(bytes) + } +} + +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct OprfReport +where + BK: SharedValue, + TV: SharedValue, + TS: SharedValue, +{ + pub match_key: Replicated, + pub event_type: EventType, + pub breakdown_key: Replicated, + pub trigger_value: Replicated, + pub timestamp: Replicated, + pub epoch: Epoch, + pub site_domain: String, +} + +impl OprfReport +where + BK: SharedValue, + TV: SharedValue, + TS: SharedValue, + Replicated: Serializable, + Replicated: Serializable, + Replicated: Serializable, + as Serializable>::Size: Add< as Serializable>::Size>, + Sum< as Serializable>::Size, as Serializable>::Size>: + Add< as Serializable>::Size>, + Sum< + Sum< as Serializable>::Size, as Serializable>::Size>, + as Serializable>::Size, + >: Add, + Sum< + Sum< + Sum< as Serializable>::Size, as Serializable>::Size>, + as Serializable>::Size, + >, + U16, + >: ArrayLength, +{ + // offsets for BTT Ciphertext + const TS_OFFSET: usize = 0; + const BK_OFFSET: usize = Self::TS_OFFSET + as Serializable>::Size::USIZE; + const TV_OFFSET: usize = Self::BK_OFFSET + as Serializable>::Size::USIZE; + const BTT_END: usize = Self::TV_OFFSET + as Serializable>::Size::USIZE; + + /// # Panics + /// If report length does not fit in `u16`. + pub fn encrypted_len(&self) -> u16 { + let len = EncryptedOprfReport::::SITE_DOMAIN_OFFSET + + self.site_domain.as_bytes().len(); + len.try_into().unwrap() + } + + /// # Errors + /// If there is a problem encrypting the report. + pub fn delimited_encrypt_to( + &self, + key_id: KeyIdentifier, + key_registry: &impl PublicKeyRegistry, + rng: &mut R, + out: &mut B, + ) -> Result<(), InvalidReportError> { + out.put_u16_le(self.encrypted_len()); + self.encrypt_to(key_id, key_registry, rng, out) + } + + /// # Errors + /// If there is a problem encrypting the report. + pub fn encrypt( + &self, + key_id: KeyIdentifier, + key_registry: &impl PublicKeyRegistry, + rng: &mut R, + ) -> Result, InvalidReportError> { + let mut out = Vec::with_capacity(usize::from(self.encrypted_len())); + self.encrypt_to(key_id, key_registry, rng, &mut out)?; + debug_assert_eq!(out.len(), usize::from(self.encrypted_len())); + Ok(out) + } + + /// # Errors + /// If there is a problem encrypting the report. + pub fn encrypt_to( + &self, + key_id: KeyIdentifier, + key_registry: &impl PublicKeyRegistry, + rng: &mut R, + out: &mut B, + ) -> Result<(), InvalidReportError> { + let info = Info::new( + key_id, + self.epoch, + self.event_type, + HELPER_ORIGIN, + self.site_domain.as_ref(), + )?; - self.match_key - .serialize(GenericArray::from_mut_slice(&mut buf[..sizeof_matchkey])); + let mut plaintext_mk = GenericArray::default(); + self.match_key.serialize(&mut plaintext_mk); + let mut plaintext_btt = vec![0u8; Self::BTT_END]; self.timestamp.serialize(GenericArray::from_mut_slice( - &mut buf[sizeof_matchkey..sizeof_matchkey + ts_sz], + &mut plaintext_btt[Self::TS_OFFSET..Self::BK_OFFSET], )); - self.breakdown_key.serialize(GenericArray::from_mut_slice( - &mut buf[sizeof_matchkey + ts_sz..sizeof_matchkey + ts_sz + bk_sz], + &mut plaintext_btt[Self::BK_OFFSET..Self::TV_OFFSET], )); - self.trigger_value.serialize(GenericArray::from_mut_slice( - &mut buf[sizeof_matchkey + ts_sz + bk_sz..sizeof_matchkey + ts_sz + bk_sz + tv_sz], + &mut plaintext_btt[Self::TV_OFFSET + ..(Self::TV_OFFSET + as Serializable>::Size::USIZE)], )); - self.is_trigger.serialize(GenericArray::from_mut_slice( - &mut buf[sizeof_matchkey + ts_sz + bk_sz + tv_sz - ..sizeof_matchkey + ts_sz + bk_sz + tv_sz + sizeof_eventtype], - )); - } + let (encap_key_mk, ciphertext_mk, tag_mk) = + seal_in_place(key_registry, plaintext_mk.as_mut(), &info, rng)?; - fn deserialize(buf: &GenericArray) -> Result { - let sizeof_matchkey = size_of::() * 2; - let sizeof_eventtype = size_of::() * 2; - - let ts_sz = as Serializable>::Size::USIZE; - let bk_sz = as Serializable>::Size::USIZE; - let tv_sz = as Serializable>::Size::USIZE; - - let match_key = - Replicated::::deserialize(GenericArray::from_slice(&buf[..sizeof_matchkey])) - .unwrap_infallible(); - let timestamp = Replicated::::deserialize(GenericArray::from_slice( - &buf[sizeof_matchkey..sizeof_matchkey + ts_sz], - )) - .map_err(|e| Error::ParseError(e.into()))?; - let breakdown_key = Replicated::::deserialize(GenericArray::from_slice( - &buf[sizeof_matchkey + ts_sz..sizeof_matchkey + ts_sz + bk_sz], - )) - .map_err(|e| Error::ParseError(e.into()))?; - let trigger_value = Replicated::::deserialize(GenericArray::from_slice( - &buf[sizeof_matchkey + ts_sz + bk_sz..sizeof_matchkey + ts_sz + bk_sz + tv_sz], - )) - .map_err(|e| Error::ParseError(e.into()))?; - let is_trigger = Replicated::::deserialize(GenericArray::from_slice( - &buf[sizeof_matchkey + ts_sz + bk_sz + tv_sz - ..sizeof_matchkey + ts_sz + bk_sz + tv_sz + sizeof_eventtype], - )) - .map_err(|e| Error::ParseError(e.into()))?; + let (encap_key_btt, ciphertext_btt, tag_btt) = + seal_in_place(key_registry, plaintext_btt.as_mut(), &info, rng)?; - Ok(Self { - match_key, - is_trigger, - breakdown_key, - trigger_value, - timestamp, - }) + out.put_slice(&encap_key_mk.to_bytes()); + out.put_slice(ciphertext_mk); + out.put_slice(&tag_mk.to_bytes()); + out.put_slice(&encap_key_btt.to_bytes()); + out.put_slice(ciphertext_btt); + out.put_slice(&tag_btt.to_bytes()); + out.put_slice(&[u8::from(&self.event_type)]); + out.put_slice(&[key_id]); + out.put_slice(&self.epoch.to_le_bytes()); + out.put_slice(self.site_domain.as_bytes()); + + Ok(()) } } #[cfg(all(test, unit_test))] mod test { - use rand::{distributions::Alphanumeric, rngs::StdRng, Rng}; + use rand::{distributions::Alphanumeric, rngs::StdRng, thread_rng, Rng}; use rand_core::SeedableRng; use super::*; - use crate::ff::{Fp32BitPrime, Gf40Bit, Gf8Bit}; + use crate::{ + ff::{ + boolean_array::{BA20, BA3, BA8}, + Fp32BitPrime, Gf40Bit, Gf8Bit, + }, + report, + report::EventType::{Source, Trigger}, + secret_sharing::replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, + }; #[test] fn enc_dec_roundtrip() { @@ -583,6 +828,70 @@ mod test { assert_eq!(dec_report, report); } + #[test] + fn enc_dec_roundtrip_oprf() { + let mut rng = thread_rng(); + + let b: EventType = if rng.gen::() { Trigger } else { Source }; + + let report = OprfReport:: { + match_key: AdditiveShare::new(rng.gen(), rng.gen()), + timestamp: AdditiveShare::new(rng.gen(), rng.gen()), + breakdown_key: AdditiveShare::new(rng.gen(), rng.gen()), + trigger_value: AdditiveShare::new(rng.gen(), rng.gen()), + event_type: b, + epoch: rng.gen(), + site_domain: (&mut rng) + .sample_iter(Alphanumeric) + .map(char::from) + .take(10) + .collect(), + }; + + let key_registry = KeyRegistry::random(1, &mut rng); + let key_id = 0; + + let enc_report_bytes = report.encrypt(key_id, &key_registry, &mut rng).unwrap(); + let enc_report = EncryptedOprfReport::from_bytes(enc_report_bytes.as_slice()).unwrap(); + let dec_report: OprfReport = enc_report.decrypt(&key_registry).unwrap(); + + assert_eq!(dec_report, report); + } + + #[test] + fn test_decryption_fails() { + let mut rng = thread_rng(); + + let b: EventType = if rng.gen::() { Trigger } else { Source }; + + let report = OprfReport:: { + match_key: AdditiveShare::new(rng.gen(), rng.gen()), + timestamp: AdditiveShare::new(rng.gen(), rng.gen()), + breakdown_key: AdditiveShare::new(rng.gen(), rng.gen()), + trigger_value: AdditiveShare::new(rng.gen(), rng.gen()), + event_type: b, + epoch: rng.gen(), + site_domain: (&mut rng) + .sample_iter(Alphanumeric) + .map(char::from) + .take(10) + .collect(), + }; + + let enc_key_registry = KeyRegistry::random(1, &mut rng); + let enc_key_id = 0; + let dec_key_registry = KeyRegistry::random(1, &mut rng); + + let enc_report_bytes = report + .encrypt(enc_key_id, &enc_key_registry, &mut rng) + .unwrap(); + let enc_report: report::EncryptedOprfReport = + EncryptedOprfReport::from_bytes(enc_report_bytes.as_slice()).unwrap(); + let dec_report = enc_report.decrypt(&dec_key_registry); + + assert!(dec_report.is_err()); + } + #[test] fn decrypt() { let mut rng = StdRng::from_seed([1_u8; 32]); diff --git a/ipa-core/src/test_fixture/input/sharing.rs b/ipa-core/src/test_fixture/input/sharing.rs index 873b2cc8a..b184fbb1f 100644 --- a/ipa-core/src/test_fixture/input/sharing.rs +++ b/ipa-core/src/test_fixture/input/sharing.rs @@ -11,6 +11,7 @@ use crate::{ AccumulateCreditInputRow, ApplyAttributionWindowInputRow, CreditCappingInputRow, }, ipa::IPAInputRow, + ipa_prf::OPRFIPAInputRow, BreakdownKey, MatchKey, }, rand::Rng, @@ -199,6 +200,51 @@ where } } +impl IntoShares> for TestRawDataRecord +where + BK: SharedValue + Field + IntoShares>, + TV: SharedValue + Field + IntoShares>, + TS: SharedValue + Field + IntoShares>, +{ + fn share_with(self, rng: &mut R) -> [OprfReport; 3] { + let match_key = BA64::try_from(u128::from(self.user_id)) + .unwrap() + .share_with(rng); + let timestamp: [Replicated; 3] = TS::try_from(u128::from(self.timestamp)) + .unwrap() + .share_with(rng); + let breakdown_key = BK::try_from(self.breakdown_key.into()) + .unwrap() + .share_with(rng); + let trigger_value = TV::try_from(self.trigger_value.into()) + .unwrap() + .share_with(rng); + let event_type = if self.is_trigger_report { + EventType::Trigger + } else { + EventType::Source + }; + let epoch = 1; + let site_domain = DOMAINS[rng.gen_range(0..DOMAINS.len())].to_owned(); + + zip(zip(match_key, zip(timestamp, breakdown_key)), trigger_value) + .map( + |((match_key_share, (ts_share, bk_share)), tv_share)| OprfReport { + timestamp: ts_share, + match_key: match_key_share, + event_type, + breakdown_key: bk_share, + trigger_value: tv_share, + epoch, + site_domain: site_domain.clone(), + }, + ) + .collect::>() + .try_into() + .unwrap() + } +} + impl IntoShares> for GenericReportTestInput where F: Field + IntoShares>, @@ -360,13 +406,13 @@ where } } -impl IntoShares> for TestRawDataRecord +impl IntoShares> for TestRawDataRecord where BK: SharedValue + Field + IntoShares>, TV: SharedValue + Field + IntoShares>, TS: SharedValue + Field + IntoShares>, { - fn share_with(self, rng: &mut R) -> [OprfReport; 3] { + fn share_with(self, rng: &mut R) -> [OPRFIPAInputRow; 3] { let is_trigger = Replicated::new( Boolean::from(self.is_trigger_report), Boolean::from(self.is_trigger_report), @@ -389,12 +435,14 @@ where repeat(is_trigger), ) .map( - |(((match_key_share, (ts_share, bk_share)), tv_share), is_trigger_share)| OprfReport { - timestamp: ts_share, - match_key: match_key_share, - is_trigger: is_trigger_share, - breakdown_key: bk_share, - trigger_value: tv_share, + |(((match_key_share, (ts_share, bk_share)), tv_share), is_trigger_share)| { + OPRFIPAInputRow { + timestamp: ts_share, + match_key: match_key_share, + is_trigger: is_trigger_share, + breakdown_key: bk_share, + trigger_value: tv_share, + } }, ) .collect::>() @@ -403,7 +451,7 @@ where } } -impl Reconstruct for [&OprfReport; 3] +impl Reconstruct for [&OPRFIPAInputRow; 3] where BK: SharedValue + Field, TV: SharedValue + Field, diff --git a/ipa-core/src/test_fixture/ipa.rs b/ipa-core/src/test_fixture/ipa.rs index 363b2e723..57739df2f 100644 --- a/ipa-core/src/test_fixture/ipa.rs +++ b/ipa-core/src/test_fixture/ipa.rs @@ -6,7 +6,7 @@ use crate::{ ff::{PrimeField, Serializable}, helpers::query::IpaQueryConfig, ipa_test_input, - protocol::{ipa::ipa, BreakdownKey, MatchKey}, + protocol::{ipa::ipa, ipa_prf::OPRFIPAInputRow, BreakdownKey, MatchKey}, secret_sharing::{ replicated::{ malicious, malicious::ExtendableField, semi_honest, @@ -250,7 +250,6 @@ pub async fn test_oprf_ipa( use crate::{ ff::boolean_array::{BA20, BA3, BA4, BA5, BA6, BA7, BA8}, protocol::ipa_prf::oprf_ipa, - report::OprfReport, test_fixture::Runner, }; @@ -258,7 +257,7 @@ pub async fn test_oprf_ipa( let result: Vec<_> = world .semi_honest( records.into_iter(), - |ctx, input_rows: Vec>| async move { + |ctx, input_rows: Vec>| async move { match config.per_user_credit_cap { 8 => oprf_ipa::<_, BA8, BA3, BA20, BA3, F>(ctx, input_rows, aws) From fc2611686def7ef27ac581ad7e3952d3cc7c2b83 Mon Sep 17 00:00:00 2001 From: danielmasny Date: Thu, 15 Feb 2024 14:53:08 -0800 Subject: [PATCH 025/135] inversion for prime fields (smaller than 128 bit) --- ipa-core/src/ff/prime_field.rs | 47 +++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/ipa-core/src/ff/prime_field.rs b/ipa-core/src/ff/prime_field.rs index 27e22a74e..5f32eb337 100644 --- a/ipa-core/src/ff/prime_field.rs +++ b/ipa-core/src/ff/prime_field.rs @@ -1,4 +1,4 @@ -use std::fmt::Display; +use std::{fmt::Display, mem}; use generic_array::GenericArray; @@ -14,6 +14,43 @@ pub trait PrimeField: Field { type PrimeInteger: Into; const PRIME: Self::PrimeInteger; + + /// Invert function that returns the multiplicative inverse + /// the default implementation uses the extended Euclidean algorithm, + /// follows inversion algorithm in + /// (with the modification that it works for unsigned integers by keeping track of `sign`): + /// `https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm` + /// + /// The function operates on `u128` rather than field elements since we need divisions + /// + /// ## Panics + /// When `self` is `Zero` + + #[must_use] + fn invert(&self) -> Self { + assert_ne!(*self, Self::ZERO); + + let mut t = 0u128; + let mut newt = 1u128; + let mut r = Self::PRIME.into(); + let mut newr = self.as_u128(); + let mut sign = 1u128; + + while newr != 0u128 { + let quotient = r / newr; + mem::swap(&mut t, &mut newt); + mem::swap(&mut r, &mut newr); + newt += quotient * t; + newr -= quotient * r; + + // flip sign + sign = 1 - sign; + } + + // when sign is negative, output `PRIME-t` otherwise `t` + // unwrap is safe + Self::try_from((1 - sign) * t + sign * (Self::PRIME.into() - t)).unwrap() + } } #[derive(thiserror::Error, Debug)] @@ -294,6 +331,14 @@ macro_rules! field_impl { let err = $field::deserialize(&buf).unwrap_err(); assert!(matches!(err, GreaterThanPrimeError(..))) } + + #[test] + fn test_invert(element: $field) { + if element != $field::ZERO + { + assert_eq!($field::ONE,element * element.invert() ); + } + } } } From ee6d2f50e7b241dd03aa577bbed8fff9dc2a103c Mon Sep 17 00:00:00 2001 From: danielmasny Date: Fri, 16 Feb 2024 20:47:41 -0800 Subject: [PATCH 026/135] lagrange interpolation --- .../ipa_prf/malicious_security/lagrange.rs | 240 ++++++++++++++++++ .../ipa_prf/malicious_security/mod.rs | 1 + ipa-core/src/protocol/ipa_prf/mod.rs | 2 + 3 files changed, 243 insertions(+) create mode 100644 ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs create mode 100644 ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs new file mode 100644 index 000000000..10d79dd25 --- /dev/null +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -0,0 +1,240 @@ +use std::iter; + +use generic_array::{ArrayLength, GenericArray}; +use typenum::U1; + +use crate::ff::{Field, PrimeField}; + +/// A degree `N-1` polynomial is stored as `N` points `(x,y)` +/// where the "x coordinates" of the input points are `x_0` to `x_N` are `F::ZERO` to `(N-1)*F::ONE` +/// Therefore, we only need to store the `y` coordinates. +#[derive(Debug, PartialEq, Clone)] +pub struct Polynomial { + y_coordinates: GenericArray, +} + +/// The Canonical Lagrange denominator is defined as the denominator of the Lagrange base polynomials +/// `https://en.wikipedia.org/wiki/Lagrange_polynomial` +/// where the "x coordinates" of the input points are `x_0` to `x_N` are `F::ZERO` to `(N-1)*F::ONE` +/// the degree of the polynomials is `N-1` +pub struct CanonicalLagrangeDenominator { + denominator: GenericArray, +} + +impl CanonicalLagrangeDenominator +where + F: PrimeField, + N: ArrayLength, +{ + /// generates canonical Lagrange denominators + /// + /// ## Panics + /// When the field size is too small for `N` evaluation points + pub fn new() -> Self { + // assertion that field is large enough + // also checks that `try_from` for conversions from sufficiently small `u128` to `F` do not panic + debug_assert!(F::BITS > usize::BITS - N::USIZE.leading_zeros()); + + let mut denominator = iter::repeat(F::ONE) + .take(N::USIZE) + .collect::>(); + for (i, d) in denominator.iter_mut().enumerate() { + for j in (0usize..N::USIZE).filter(|&j| i != j) { + *d *= F::try_from(i as u128).unwrap() - F::try_from(j as u128).unwrap(); + } + *d = d.invert(); + } + CanonicalLagrangeDenominator { denominator } + } +} + +/// `LagrangeTable` is a precomputation table for the Lagrange evaluation. +/// The "x coordinates" of the input points are `x_0` to `x_(N-1)` are `F::ZERO` to `(N-1)*F::ONE`. +/// The `LagrangeTable` also specifies `M` "x coordinates" for the output points +/// The "x coordinates" of the output points are `x_N` to `x_(N+M-1)` are `N*F::ONE` to `(N+M-1)*F::ONE`. +pub struct LagrangeTable { + table: GenericArray, M>, +} + +impl LagrangeTable +where + F: Field, + N: ArrayLength, +{ + /// generates a `CanonicalLagrangeTable` from `CanoncialLagrangeDenominators` for a single output point + /// The "x coordinate" of the output point is `x_output`. + pub fn new(denominator: &CanonicalLagrangeDenominator, x_output: &F) -> Self { + let mut table = denominator.denominator.clone(); + compute_table_row(x_output, &mut table); + LagrangeTable:: { + table: GenericArray::from_array([table; 1]), + } + } +} + +impl LagrangeTable +where + F: Field, + N: ArrayLength, + M: ArrayLength, +{ + /// This function uses the `LagrangeTable` to evaluate `polynomial` on the specified output "x coordinates" + /// outputs the "y coordinates" such that `(x,y)` lies on `polynomial` + pub fn eval(&self, polynomial: &Polynomial) -> GenericArray { + let mut result = iter::repeat(F::ONE) + .take(M::USIZE) + .collect::>(); + self.mult_result_by_evaluation(polynomial, &mut result); + result + } + + /// This function uses the `LagrangeTable` to evaluate `polynomial` on the specified output "x coordinates" + /// the "y coordinates" of the evaluation are multiplied to `result` + pub fn mult_result_by_evaluation( + &self, + polynomial: &Polynomial, + result: &mut GenericArray, + ) { + for (y, base) in result.iter_mut().zip(self.table.iter()) { + *y *= base + .iter() + .zip(polynomial.y_coordinates.iter()) + .fold(F::ZERO, |acc, (&base, &y)| acc + base * y); + } + } +} + +impl From> for LagrangeTable +where + F: Field, + N: ArrayLength, + M: ArrayLength, +{ + fn from(value: CanonicalLagrangeDenominator) -> Self { + // assertion that field is large enough + // also checks that `try_from` for conversions from sufficiently small `u128` to `F` do not panic + debug_assert!(F::BITS > usize::BITS - N::USIZE.leading_zeros() - M::USIZE.leading_zeros()); + + let mut table = iter::repeat(value.denominator.clone()) + .take(M::USIZE) + .collect::>(); + table.iter_mut().enumerate().for_each(|(i, row)| { + compute_table_row(&F::try_from((i + N::USIZE) as u128).unwrap(), row); + }); + LagrangeTable { table } + } +} + +/// helper function to compute a single row of `CanonicalLagrangeTable` +/// +/// ## Panics +/// When the field size is too small for `N` evaluation points +fn compute_table_row(x_output: &F, table_row: &mut GenericArray) +where + F: Field, + N: ArrayLength, +{ + for (i, entry) in table_row.iter_mut().enumerate() { + for j in (0usize..N::USIZE).filter(|&j| j != i) { + *entry *= *x_output - F::try_from(j as u128).unwrap(); + } + } +} + +#[cfg(all(test, unit_test))] +mod test { + use std::iter; + + use generic_array::{ArrayLength, GenericArray}; + use proptest::{prelude::*, proptest}; + use typenum::{U1, U32, U7, U8}; + + use crate::{ + ff::Field, + protocol::ipa_prf::malicious_security::lagrange::{ + CanonicalLagrangeDenominator, LagrangeTable, Polynomial, + }, + }; + + type TestField = crate::ff::Fp32BitPrime; + + #[derive(Debug, PartialEq, Clone)] + struct MonomialFormPolynomial { + coefficients: GenericArray, + } + + impl MonomialFormPolynomial + where + F: Field, + N: ArrayLength, + { + /// test helper function that evaluates a polynomial in monomial form, i.e. `sum_i c_i x^i` on points `x_output` + /// where `c_0` to `c_N` are stored in `polynomial` + fn eval(&self, x_output: &GenericArray) -> GenericArray + where + M: ArrayLength, + { + // evaluate polynomial p at evaluation_points and random point using monomial base + let mut y_values = iter::repeat(F::ZERO) + .take(M::USIZE) + .collect::>(); + for (x, y) in x_output.iter().zip(y_values.iter_mut()) { + // monomial base, i.e. `x^k` + let mut base = F::ONE; + // evaluate p via `sum_k coefficient_k * x^k` + for coefficient in &self.coefficients { + *y += *coefficient * base; + base *= *x; + } + } + y_values + } + } + + impl From> for Polynomial + where + F: Field, + N: ArrayLength, + { + fn from(value: MonomialFormPolynomial) -> Self { + let canonical_points: GenericArray = (0..N::USIZE) + .map(|i| F::try_from(i as u128).unwrap()) + .collect::>(); + Polynomial { + y_coordinates: value.eval(&canonical_points), + } + } + } + + proptest! { + #[test] + fn test_lagrange_single_output_point_using_new(output_point: TestField, input_points in prop::array::uniform32(any::())){ + let polynomial_monomial_form = MonomialFormPolynomial{ + coefficients: GenericArray::::from_array(input_points)}; + let output_expected = polynomial_monomial_form.eval( + &GenericArray::::from_array([output_point;1])); + let polynomial = Polynomial::from(polynomial_monomial_form.clone()); + let denominator = CanonicalLagrangeDenominator::::new(); + // generate table using new + let lagrange_table = LagrangeTable::::new(&denominator,&output_point); + let output = lagrange_table.eval(&polynomial); + assert_eq!(output,output_expected); + } + + #[test] + fn test_lagrange_cannonical_using_from(input_points in prop::array::uniform8(any::())) + { + let polynomial_monomial_form = MonomialFormPolynomial{ + coefficients: GenericArray::::from_array(input_points)}; + // the canonical x coordinates are 0..15, the outputs use coordinates 8..15: + let x_coordinates_output = (8..15).map(|i|TestField::try_from(i).unwrap()).collect::>(); + let output_expected = polynomial_monomial_form.eval(&x_coordinates_output); + let polynomial = Polynomial::from(polynomial_monomial_form.clone()); + let denominator = CanonicalLagrangeDenominator::::new(); + // generate table using from + let lagrange_table = LagrangeTable::::from(denominator); + let output = lagrange_table.eval(&polynomial); + assert_eq!(output,output_expected); + } + } +} diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs new file mode 100644 index 000000000..ea0ac6eef --- /dev/null +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs @@ -0,0 +1 @@ +pub mod lagrange; diff --git a/ipa-core/src/protocol/ipa_prf/mod.rs b/ipa-core/src/protocol/ipa_prf/mod.rs index 47616d929..54530456b 100644 --- a/ipa-core/src/protocol/ipa_prf/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/mod.rs @@ -28,6 +28,8 @@ mod boolean_ops; pub mod prf_eval; pub mod prf_sharding; +#[cfg(all(test, unit_test))] +mod malicious_security; mod quicksort; mod shuffle; From 9d51abd843da44a3391721a158638ecf970865d1 Mon Sep 17 00:00:00 2001 From: danielmasny Date: Tue, 20 Feb 2024 12:02:55 -0800 Subject: [PATCH 027/135] address comments --- .../ipa_prf/malicious_security/lagrange.rs | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index 10d79dd25..17254ba96 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -44,7 +44,7 @@ where } *d = d.invert(); } - CanonicalLagrangeDenominator { denominator } + Self { denominator } } } @@ -63,9 +63,9 @@ where { /// generates a `CanonicalLagrangeTable` from `CanoncialLagrangeDenominators` for a single output point /// The "x coordinate" of the output point is `x_output`. - pub fn new(denominator: &CanonicalLagrangeDenominator, x_output: &F) -> Self { - let mut table = denominator.denominator.clone(); - compute_table_row(x_output, &mut table); + pub fn new(denominator: CanonicalLagrangeDenominator, x_output: &F) -> Self { + let mut table = denominator.denominator; + Self::compute_table_row(x_output, &mut table); LagrangeTable:: { table: GenericArray::from_array([table; 1]), } @@ -102,6 +102,22 @@ where .fold(F::ZERO, |acc, (&base, &y)| acc + base * y); } } + + /// helper function to compute a single row of `CanonicalLagrangeTable` + /// + /// ## Panics + /// When the field size is too small for `N` evaluation points + fn compute_table_row(x_output: &F, table_row: &mut GenericArray) + where + F: Field, + N: ArrayLength, + { + for (i, entry) in table_row.iter_mut().enumerate() { + for j in (0usize..N::USIZE).filter(|&j| j != i) { + *entry *= *x_output - F::try_from(j as u128).unwrap(); + } + } + } } impl From> for LagrangeTable @@ -113,34 +129,18 @@ where fn from(value: CanonicalLagrangeDenominator) -> Self { // assertion that field is large enough // also checks that `try_from` for conversions from sufficiently small `u128` to `F` do not panic - debug_assert!(F::BITS > usize::BITS - N::USIZE.leading_zeros() - M::USIZE.leading_zeros()); + debug_assert!(F::BITS > usize::BITS - (N::USIZE + M::USIZE).leading_zeros()); let mut table = iter::repeat(value.denominator.clone()) .take(M::USIZE) .collect::>(); table.iter_mut().enumerate().for_each(|(i, row)| { - compute_table_row(&F::try_from((i + N::USIZE) as u128).unwrap(), row); + Self::compute_table_row(&F::try_from((i + N::USIZE) as u128).unwrap(), row); }); LagrangeTable { table } } } -/// helper function to compute a single row of `CanonicalLagrangeTable` -/// -/// ## Panics -/// When the field size is too small for `N` evaluation points -fn compute_table_row(x_output: &F, table_row: &mut GenericArray) -where - F: Field, - N: ArrayLength, -{ - for (i, entry) in table_row.iter_mut().enumerate() { - for j in (0usize..N::USIZE).filter(|&j| j != i) { - *entry *= *x_output - F::try_from(j as u128).unwrap(); - } - } -} - #[cfg(all(test, unit_test))] mod test { use std::iter; @@ -216,7 +216,7 @@ mod test { let polynomial = Polynomial::from(polynomial_monomial_form.clone()); let denominator = CanonicalLagrangeDenominator::::new(); // generate table using new - let lagrange_table = LagrangeTable::::new(&denominator,&output_point); + let lagrange_table = LagrangeTable::::new(denominator,&output_point); let output = lagrange_table.eval(&polynomial); assert_eq!(output,output_expected); } From b95d9f84c64bc0371576176a3503cd73f4b128b6 Mon Sep 17 00:00:00 2001 From: danielmasny Date: Tue, 20 Feb 2024 12:07:03 -0800 Subject: [PATCH 028/135] address comments --- ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index 17254ba96..2ed9eee0f 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -208,7 +208,7 @@ mod test { proptest! { #[test] - fn test_lagrange_single_output_point_using_new(output_point: TestField, input_points in prop::array::uniform32(any::())){ + fn lagrange_single_output_point_using_new(output_point: TestField, input_points in prop::array::uniform32(any::())){ let polynomial_monomial_form = MonomialFormPolynomial{ coefficients: GenericArray::::from_array(input_points)}; let output_expected = polynomial_monomial_form.eval( @@ -222,7 +222,7 @@ mod test { } #[test] - fn test_lagrange_cannonical_using_from(input_points in prop::array::uniform8(any::())) + fn lagrange_cannonical_using_from(input_points in prop::array::uniform8(any::())) { let polynomial_monomial_form = MonomialFormPolynomial{ coefficients: GenericArray::::from_array(input_points)}; From 36c5883e607693e9cfef18577ada4a978a3fa892 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Tue, 20 Feb 2024 15:15:26 -0800 Subject: [PATCH 029/135] Delete the old IPA implementation (#956) --- .github/workflows/check.yml | 4 + ipa-core/Cargo.toml | 6 - ipa-core/benches/oneshot/ipa.rs | 29 +- ipa-core/benches/oneshot/sort.rs | 72 - ipa-core/src/bin/report_collector.rs | 62 +- ipa-core/src/bin/test_mpc.rs | 6 +- ipa-core/src/cli/noise.rs | 21 +- ipa-core/src/cli/playbook/input.rs | 30 +- ipa-core/src/cli/playbook/ipa.rs | 137 +- ipa-core/src/cli/playbook/mod.rs | 21 +- ipa-core/src/cli/playbook/multiply.rs | 2 +- ipa-core/src/config.rs | 9 +- ipa-core/src/ff/curve_points.rs | 7 +- .../src/helpers/buffers/ordering_sender.rs | 1 - ipa-core/src/helpers/mod.rs | 2 +- .../helpers/transport/in_memory/transport.rs | 21 +- ipa-core/src/helpers/transport/query/mod.rs | 16 +- .../src/helpers/transport/stream/axum_body.rs | 1 + .../src/helpers/transport/stream/input.rs | 5 +- ipa-core/src/hpke/mod.rs | 7 +- ipa-core/src/lib.rs | 18 +- ipa-core/src/net/client/mod.rs | 2 +- ipa-core/src/net/http_serde.rs | 30 +- .../src/net/server/handlers/query/create.rs | 99 +- .../src/net/server/handlers/query/input.rs | 9 +- .../src/net/server/handlers/query/prepare.rs | 5 +- .../src/net/server/handlers/query/results.rs | 9 +- .../src/net/server/handlers/query/status.rs | 8 +- ipa-core/src/net/test.rs | 1 + ipa-core/src/net/transport.rs | 4 +- ipa-core/src/protocol/aggregation/input.rs | 56 - ipa-core/src/protocol/aggregation/mod.rs | 314 - .../protocol/attribution/accumulate_credit.rs | 319 - .../protocol/attribution/aggregate_credit.rs | 200 - .../attribution/apply_attribution_window.rs | 297 - .../protocol/attribution/credit_capping.rs | 597 -- ipa-core/src/protocol/attribution/input.rs | 172 - ipa-core/src/protocol/attribution/mod.rs | 449 - ipa-core/src/protocol/basics/mod.rs | 26 +- ipa-core/src/protocol/basics/mul/malicious.rs | 19 + ipa-core/src/protocol/basics/mul/mod.rs | 55 +- .../src/protocol/basics/mul/semi_honest.rs | 22 + .../src/protocol/basics/partial_reveal.rs | 129 - ipa-core/src/protocol/basics/reshare.rs | 65 +- ipa-core/src/protocol/basics/reveal.rs | 140 +- .../src/protocol/basics/share_known_value.rs | 17 +- .../basics/sum_of_product/malicious.rs | 19 + .../src/protocol/basics/sum_of_product/mod.rs | 43 +- .../basics/sum_of_product/semi_honest.rs | 17 + ipa-core/src/protocol/boolean/mod.rs | 10 +- ipa-core/src/protocol/context/mod.rs | 19 +- ipa-core/src/protocol/context/upgrade.rs | 135 +- ipa-core/src/protocol/context/validator.rs | 32 +- ipa-core/src/protocol/dp/distributions.rs | 4 +- ipa-core/src/protocol/ipa/mod.rs | 1185 --- .../comparison_and_subtraction_sequential.rs | 2 +- .../boolean_ops/share_conversion_aby.rs | 4 +- ipa-core/src/protocol/mod.rs | 4 - ipa-core/src/protocol/prss/mod.rs | 2 - ipa-core/src/protocol/sort/apply_sort/mod.rs | 120 - .../src/protocol/sort/apply_sort/shuffle.rs | 223 - ipa-core/src/protocol/sort/bit_permutation.rs | 120 - ipa-core/src/protocol/sort/compose.rs | 119 - .../src/protocol/sort/generate_permutation.rs | 280 - .../protocol/sort/generate_permutation_opt.rs | 338 - ipa-core/src/protocol/sort/mod.rs | 262 - .../protocol/sort/multi_bit_permutation.rs | 189 - ipa-core/src/protocol/sort/secureapplyinv.rs | 106 - ipa-core/src/protocol/sort/shuffle.rs | 391 - ipa-core/src/protocol/step/compact.rs | 14 +- ipa-core/src/protocol/step/mod.rs | 8 - ipa-core/src/protocol/step/steps.txt | 8711 +---------------- ipa-core/src/query/executor.rs | 131 +- ipa-core/src/query/processor.rs | 78 +- ipa-core/src/query/runner/aggregate.rs | 101 - ipa-core/src/query/runner/ipa.rs | 339 - ipa-core/src/query/runner/mod.rs | 4 +- ipa-core/src/query/runner/oprf_ipa.rs | 14 +- ipa-core/src/report.rs | 361 +- ipa-core/src/secret_sharing/mod.rs | 2 +- .../replicated/malicious/additive_share.rs | 1 + .../replicated/malicious/mod.rs | 6 +- .../replicated/semi_honest/additive_share.rs | 4 +- ipa-core/src/seq_join/local.rs | 10 +- ipa-core/src/seq_join/mod.rs | 14 +- ipa-core/src/seq_join/multi_thread.rs | 11 +- ipa-core/src/test_fixture/input/mod.rs | 147 - ipa-core/src/test_fixture/input/sharing.rs | 363 +- ipa-core/src/test_fixture/ipa.rs | 68 +- ipa-core/src/test_fixture/metrics.rs | 3 + ipa-core/src/test_fixture/sharing.rs | 8 +- ipa-core/tests/common/mod.rs | 4 +- ipa-core/tests/compact_gate.rs | 36 +- ipa-core/tests/helper_networks.rs | 8 +- pre-commit | 11 +- scripts/collect_steps.py | 51 +- 96 files changed, 641 insertions(+), 17012 deletions(-) delete mode 100644 ipa-core/benches/oneshot/sort.rs delete mode 100644 ipa-core/src/protocol/aggregation/input.rs delete mode 100644 ipa-core/src/protocol/aggregation/mod.rs delete mode 100644 ipa-core/src/protocol/attribution/accumulate_credit.rs delete mode 100644 ipa-core/src/protocol/attribution/aggregate_credit.rs delete mode 100644 ipa-core/src/protocol/attribution/apply_attribution_window.rs delete mode 100644 ipa-core/src/protocol/attribution/credit_capping.rs delete mode 100644 ipa-core/src/protocol/attribution/input.rs delete mode 100644 ipa-core/src/protocol/attribution/mod.rs delete mode 100644 ipa-core/src/protocol/basics/partial_reveal.rs delete mode 100644 ipa-core/src/protocol/ipa/mod.rs delete mode 100644 ipa-core/src/protocol/sort/apply_sort/mod.rs delete mode 100644 ipa-core/src/protocol/sort/apply_sort/shuffle.rs delete mode 100644 ipa-core/src/protocol/sort/bit_permutation.rs delete mode 100644 ipa-core/src/protocol/sort/compose.rs delete mode 100644 ipa-core/src/protocol/sort/generate_permutation.rs delete mode 100644 ipa-core/src/protocol/sort/generate_permutation_opt.rs delete mode 100644 ipa-core/src/protocol/sort/mod.rs delete mode 100644 ipa-core/src/protocol/sort/multi_bit_permutation.rs delete mode 100644 ipa-core/src/protocol/sort/secureapplyinv.rs delete mode 100644 ipa-core/src/protocol/sort/shuffle.rs delete mode 100644 ipa-core/src/query/runner/aggregate.rs delete mode 100644 ipa-core/src/query/runner/ipa.rs diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 292e0d89f..195ad733f 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -59,6 +59,10 @@ jobs: if: ${{ success() || failure() }} run: cargo clippy --tests --features shuttle + - name: Clippy web + if: ${{ success() || failure() }} + run: cargo clippy --no-default-features --features "cli web-app real-world-infra test-fixture descriptive-gate" + - name: Build if: ${{ success() || failure() }} run: cargo build --tests diff --git a/ipa-core/Cargo.toml b/ipa-core/Cargo.toml index 9d8718fce..c4097c165 100644 --- a/ipa-core/Cargo.toml +++ b/ipa-core/Cargo.toml @@ -205,12 +205,6 @@ path = "benches/oneshot/arithmetic_circuit.rs" harness = false required-features = ["enable-benches", "descriptive-gate"] -[[bench]] -name = "oneshot_sort" -path = "benches/oneshot/sort.rs" -harness = false -required-features = ["enable-benches", "descriptive-gate"] - [[bench]] name = "oneshot_ipa" path = "benches/oneshot/ipa.rs" diff --git a/ipa-core/benches/oneshot/ipa.rs b/ipa-core/benches/oneshot/ipa.rs index 155f0c37c..7b4ddcce5 100644 --- a/ipa-core/benches/oneshot/ipa.rs +++ b/ipa-core/benches/oneshot/ipa.rs @@ -9,7 +9,7 @@ use ipa_core::{ ff::Fp32BitPrime, helpers::{query::IpaQueryConfig, GatewayConfig}, test_fixture::{ - ipa::{ipa_in_the_clear, test_ipa, test_oprf_ipa, CappingOrder, IpaSecurityModel}, + ipa::{ipa_in_the_clear, test_oprf_ipa, CappingOrder, IpaSecurityModel}, EventGenerator, EventGeneratorConfig, TestWorld, TestWorldConfig, }, }; @@ -38,7 +38,7 @@ struct Args { #[arg(short = 'u', long, default_value = "50")] records_per_user: u32, /// The contribution cap for each person. - #[arg(short = 'c', long, default_value = "3")] + #[arg(short = 'c', long, default_value = "8")] per_user_cap: u32, /// The number of breakdown keys. #[arg(short = 'b', long, default_value = "16")] @@ -70,8 +70,6 @@ struct Args { /// Needed for benches. #[arg(long, hide = true)] bench: bool, - #[arg(short = 'o', long)] - oprf: bool, } impl Args { @@ -112,8 +110,8 @@ async fn run(args: Args) -> Result<(), Error> { ); let rng = StdRng::seed_from_u64(seed); let (user_count, min_events_per_user, max_events_per_user, query_size) = - if args.oprf && cfg!(feature = "step-trace") { - // For the steps collection, OPRF mode requires a single user with the same number + if cfg!(feature = "step-trace") { + // For the steps collection, compact gate requires a single user with the same number // of dynamic steps as defined for `UserNthRowStep::Row`. ( NonZeroU64::new(1).unwrap(), @@ -146,11 +144,7 @@ async fn run(args: Args) -> Result<(), Error> { // timestamp. raw_data.sort_by_key(|e| e.timestamp); - let order = if args.oprf { - CappingOrder::CapMostRecentFirst - } else { - CappingOrder::CapOldestFirst - }; + let order = CappingOrder::CapMostRecentFirst; let expected_results = ipa_in_the_clear( &raw_data, @@ -164,18 +158,7 @@ async fn run(args: Args) -> Result<(), Error> { tracing::trace!("Preparation complete in {:?}", _prep_time.elapsed()); let _protocol_time = Instant::now(); - if args.oprf { - test_oprf_ipa::(&world, raw_data, &expected_results, args.config()).await; - } else { - test_ipa::( - &world, - &raw_data, - &expected_results, - args.config(), - args.mode, - ) - .await; - } + test_oprf_ipa::(&world, raw_data, &expected_results, args.config()).await; tracing::trace!( "{m:?} IPA for {q} records took {t:?}", m = args.mode, diff --git a/ipa-core/benches/oneshot/sort.rs b/ipa-core/benches/oneshot/sort.rs deleted file mode 100644 index 1c5f369e4..000000000 --- a/ipa-core/benches/oneshot/sort.rs +++ /dev/null @@ -1,72 +0,0 @@ -use std::time::Instant; - -use futures::stream::iter as stream_iter; -use ipa_core::{ - error::Error, - ff::{Field, Fp32BitPrime, GaloisField}, - helpers::GatewayConfig, - protocol::{ - context::{validator::SemiHonest as SemiHonestValidator, Validator}, - sort::generate_permutation_opt::generate_permutation_opt, - MatchKey, - }, - secret_sharing::{ - replicated::semi_honest::AdditiveShare as Replicated, IntoShares, SharedValue, - }, - test_fixture::{join3, Reconstruct, TestWorld, TestWorldConfig}, -}; -use rand::Rng; - -#[tokio::main(flavor = "multi_thread", worker_threads = 3)] -async fn main() -> Result<(), Error> { - const BATCHSIZE: usize = 100; - const NUM_MULTI_BITS: u32 = 3; - type BenchField = Fp32BitPrime; - - let config = TestWorldConfig { - gateway_config: GatewayConfig::new(BATCHSIZE.clamp(4, 1024)), - ..TestWorldConfig::default() - }; - let world = TestWorld::new_with(config); - let [ctx0, ctx1, ctx2] = world.contexts(); - let mut rng = rand::thread_rng(); - - let mut match_keys: Vec = Vec::with_capacity(BATCHSIZE); - - for _ in 0..BATCHSIZE { - match_keys.push(rng.gen::()); - } - - let [s0, s1, s2] = match_keys.iter().cloned().share_with(&mut rng); - - let start = Instant::now(); - let [(v0, r0), (v1, r1), (v2, r2)]: [(SemiHonestValidator<'_, BenchField>, Vec>); - 3] = join3( - generate_permutation_opt(ctx0, stream_iter(s0), NUM_MULTI_BITS, MatchKey::BITS), - generate_permutation_opt(ctx1, stream_iter(s1), NUM_MULTI_BITS, MatchKey::BITS), - generate_permutation_opt(ctx2, stream_iter(s2), NUM_MULTI_BITS, MatchKey::BITS), - ) - .await; - let result = join3(v0.validate(r0), v1.validate(r1), v2.validate(r2)).await; - - let duration = start.elapsed().as_secs_f32(); - println!("sort benchmark BATCHSIZE {BATCHSIZE} NUM_MULTI_BITS {NUM_MULTI_BITS} complete after {duration}s"); - - assert_eq!(result[0].len(), BATCHSIZE); - assert_eq!(result[1].len(), BATCHSIZE); - assert_eq!(result[2].len(), BATCHSIZE); - - let mut mpc_sorted_list: Vec = (0..BATCHSIZE).map(|i| i as u128).collect(); - for (i, match_key) in match_keys.iter().enumerate() { - let index = [&result[0][i], &result[1][i], &result[2][i]].reconstruct(); - mpc_sorted_list[index.as_u128() as usize] = match_key.as_u128(); - } - - let mut sorted_match_keys = match_keys.clone(); - sorted_match_keys.sort_unstable(); - for i in 0..BATCHSIZE { - assert_eq!(sorted_match_keys[i].as_u128(), mpc_sorted_list[i]); - } - - Ok(()) -} diff --git a/ipa-core/src/bin/report_collector.rs b/ipa-core/src/bin/report_collector.rs index 0df54c325..69f72cdea 100644 --- a/ipa-core/src/bin/report_collector.rs +++ b/ipa-core/src/bin/report_collector.rs @@ -15,7 +15,7 @@ use hyper::http::uri::Scheme; use ipa_core::{ cli::{ noise::{apply, ApplyDpArgs}, - playbook::{make_clients, playbook_ipa, playbook_oprf_ipa, validate, InputSource}, + playbook::{make_clients, playbook_oprf_ipa, validate, InputSource}, CsvSerializer, IpaQueryResult, Verbosity, }, config::NetworkConfig, @@ -23,7 +23,6 @@ use ipa_core::{ helpers::query::{IpaQueryConfig, QueryConfig, QuerySize, QueryType}, hpke::{KeyRegistry, PublicKeyOnly}, net::MpcHelperClient, - protocol::{BreakdownKey, MatchKey}, report::{KeyIdentifier, DEFAULT_KEY_ID}, test_fixture::{ ipa::{ipa_in_the_clear, CappingOrder, IpaQueryStyle, IpaSecurityModel, TestRawDataRecord}, @@ -84,10 +83,6 @@ impl From<&CommandInput> for InputSource { #[derive(Debug, Subcommand)] enum ReportCollectorCommand { - /// Execute IPA in semi-honest honest majority setting - SemiHonestIpa(IpaQueryConfig), - /// Execute IPA in malicious honest majority setting - MaliciousIpa(IpaQueryConfig), /// Generate inputs for IPA GenIpaInputs { /// Number of records to generate @@ -129,28 +124,6 @@ async fn main() -> Result<(), Box> { let (clients, network) = make_clients(args.network.as_deref(), scheme, args.wait).await; match args.action { - ReportCollectorCommand::SemiHonestIpa(config) => { - ipa( - &args, - &network, - IpaSecurityModel::SemiHonest, - config, - &clients, - IpaQueryStyle::SortInMpc, - ) - .await? - } - ReportCollectorCommand::MaliciousIpa(config) => { - ipa( - &args, - &network, - IpaSecurityModel::Malicious, - config, - &clients, - IpaQueryStyle::SortInMpc, - ) - .await? - } ReportCollectorCommand::GenIpaInputs { count, seed, @@ -181,7 +154,7 @@ fn gen_inputs( ) -> io::Result<()> { let rng = seed .map(StdRng::seed_from_u64) - .unwrap_or_else(|| StdRng::from_entropy()); + .unwrap_or_else(StdRng::from_entropy); let mut event_gen = EventGenerator::with_config(rng, args) .take(count as usize) .collect::>(); @@ -194,7 +167,7 @@ fn gen_inputs( for event in event_gen { event.to_csv(&mut writer)?; - writer.write(&[b'\n'])?; + writer.write_all(&[b'\n'])?; } Ok(()) @@ -209,8 +182,8 @@ impl KeyRegistries { network: &NetworkConfig, ) -> Option<(KeyIdentifier, [&KeyRegistry; 3])> { // Get the configs, if all three peers have one - let Some(configs) = network.peers().iter().fold(Some(vec![]), |acc, peer| { - if let (Some(mut vec), Some(hpke_config)) = (acc, peer.hpke_config.as_ref()) { + let Some(configs) = network.peers().iter().try_fold(Vec::new(), |acc, peer| { + if let (mut vec, Some(hpke_config)) = (acc, peer.hpke_config.as_ref()) { vec.push(hpke_config); Some(vec) } else { @@ -244,14 +217,8 @@ async fn ipa( let input = InputSource::from(&args.input); let query_type: QueryType; match (security_model, &query_style) { - (IpaSecurityModel::SemiHonest, IpaQueryStyle::SortInMpc) => { - query_type = QueryType::SemiHonestIpa(ipa_query_config.clone()); - } - (IpaSecurityModel::Malicious, IpaQueryStyle::SortInMpc) => { - query_type = QueryType::MaliciousIpa(ipa_query_config.clone()) - } (IpaSecurityModel::SemiHonest, IpaQueryStyle::Oprf) => { - query_type = QueryType::OprfIpa(ipa_query_config.clone()); + query_type = QueryType::OprfIpa(ipa_query_config); } (IpaSecurityModel::Malicious, IpaQueryStyle::Oprf) => { panic!("OPRF for malicious is not implemented as yet") @@ -274,7 +241,6 @@ async fn ipa( ipa_query_config.max_breakdown_key, &(match query_style { IpaQueryStyle::Oprf => CappingOrder::CapMostRecentFirst, - IpaQueryStyle::SortInMpc => CappingOrder::CapOldestFirst, }), ); @@ -292,17 +258,7 @@ async fn ipa( IpaQueryStyle::Oprf => { playbook_oprf_ipa::( input_rows, - &helper_clients, - query_id, - ipa_query_config, - key_registries.init_from(network), - ) - .await - } - IpaQueryStyle::SortInMpc => { - playbook_ipa::( - &input_rows, - &helper_clients, + helper_clients, query_id, ipa_query_config, key_registries.init_from(network), @@ -313,7 +269,7 @@ async fn ipa( if let Some(ref path) = args.output_file { // it will be sad to lose the results if file already exists. - let path = if Path::is_file(&path) { + let path = if Path::is_file(path) { let mut new_file_name = thread_rng() .sample_iter(&Alphanumeric) .take(5) @@ -357,7 +313,7 @@ fn apply_dp_noise(args: &Args, dp_args: &ApplyDpArgs) -> Result<(), Box>(); - let actual = secure_mul(input_rows, &helper_clients, query_id).await; + let actual = secure_mul(input_rows, helper_clients, query_id).await; validate(&expected, &actual); } async fn multiply(args: &Args, helper_clients: &[MpcHelperClient; 3]) { match args.input.field { - FieldType::Fp31 => multiply_in_field::(&args, helper_clients).await, - FieldType::Fp32BitPrime => multiply_in_field::(&args, helper_clients).await, + FieldType::Fp31 => multiply_in_field::(args, helper_clients).await, + FieldType::Fp32BitPrime => multiply_in_field::(args, helper_clients).await, }; } diff --git a/ipa-core/src/cli/noise.rs b/ipa-core/src/cli/noise.rs index b92f1eae3..b4cbb0af0 100644 --- a/ipa-core/src/cli/noise.rs +++ b/ipa-core/src/cli/noise.rs @@ -1,4 +1,5 @@ use std::{ + cmp::Ordering, collections::BTreeMap, fmt::{Debug, Display, Formatter}, }; @@ -41,7 +42,7 @@ pub struct NoisyOutput { /// This exists to be able to use f64 as key inside a map. We don't have to deal with infinities or /// NaN values for epsilons, so we can treat them as raw bytes for this purpose. -#[derive(Debug, Copy, Clone, PartialOrd)] +#[derive(Debug, Copy, Clone)] pub struct EpsilonBits(f64); #[cfg(feature = "enable-serde")] @@ -71,9 +72,15 @@ impl PartialEq for EpsilonBits { impl Eq for EpsilonBits {} +impl PartialOrd for EpsilonBits { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + impl Ord for EpsilonBits { fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.partial_cmp(other).unwrap() + self.0.partial_cmp(&other.0).unwrap() } } @@ -83,14 +90,18 @@ impl Display for EpsilonBits { } } +/// Apply DP noise to the given input. +/// +/// ## Panics +/// If DP parameters are not valid. pub fn apply>(input: I, args: &ApplyDpArgs) -> BTreeMap { let mut rng = args .seed - .map(StdRng::seed_from_u64) - .unwrap_or_else(StdRng::from_entropy); + .map_or_else(StdRng::from_entropy, StdRng::seed_from_u64); let mut result = BTreeMap::new(); for &epsilon in &args.epsilon { - let discrete_dp = InsecureDiscreteDp::new(epsilon, args.delta, args.cap as f64).unwrap(); + let discrete_dp = + InsecureDiscreteDp::new(epsilon, args.delta, f64::from(args.cap)).unwrap(); let mut v = input .as_ref() .iter() diff --git a/ipa-core/src/cli/playbook/input.rs b/ipa-core/src/cli/playbook/input.rs index 74bf03dcd..b5f429a72 100644 --- a/ipa-core/src/cli/playbook/input.rs +++ b/ipa-core/src/cli/playbook/input.rs @@ -6,11 +6,7 @@ use std::{ path::PathBuf, }; -use crate::{ - ff::{Field, GaloisField}, - ipa_test_input, - test_fixture::{input::GenericReportTestInput, ipa::TestRawDataRecord}, -}; +use crate::{ff::Field, test_fixture::ipa::TestRawDataRecord}; pub trait InputItem { fn from_str(s: &str) -> Self; @@ -29,26 +25,6 @@ impl InputItem for u64 { } } -impl InputItem for GenericReportTestInput { - fn from_str(s: &str) -> Self { - if let [ts, match_key, is_trigger_bit, breakdown_key, trigger_value] = - s.splitn(5, ',').collect::>()[..] - { - ipa_test_input!({ - timestamp: ts.parse::().unwrap(), - match_key: match_key.parse::().unwrap(), - is_trigger_report: is_trigger_bit.parse::().unwrap(), - breakdown_key: breakdown_key.parse::().unwrap(), - trigger_value: trigger_value.parse::().unwrap() - }; - (F, MK, BK) - ) - } else { - panic!("{s} is not a valid IPAInputTestRow") - } - } -} - impl InputItem for (I, I) { fn from_str(s: &str) -> Self { if let Some((left, right)) = s.split_once(',') { @@ -113,6 +89,10 @@ impl InputSource { .filter_map(|line| line.map(|l| T::from_str(&l)).ok()) } + /// Reads all the bytes from this instance and returns an owned buffer that contains them. + /// + /// ## Errors + /// if the underlying IO resource returns an error while reading from it. pub fn to_vec(mut self) -> Result, io::Error> { let mut buf = vec![]; self.read_to_end(&mut buf)?; diff --git a/ipa-core/src/cli/playbook/ipa.rs b/ipa-core/src/cli/playbook/ipa.rs index eb9d96a2d..7e218b859 100644 --- a/ipa-core/src/cli/playbook/ipa.rs +++ b/ipa-core/src/cli/playbook/ipa.rs @@ -7,7 +7,7 @@ use std::{ use futures_util::future::try_join_all; use generic_array::GenericArray; -use rand::{distributions::Standard, prelude::Distribution, rngs::StdRng}; +use rand::rngs::StdRng; use rand_core::SeedableRng; use tokio::time::sleep; use typenum::Unsigned; @@ -20,92 +20,18 @@ use crate::{ BodyStream, }, hpke::PublicKeyRegistry, - ipa_test_input, net::MpcHelperClient, - protocol::{ - ipa::IPAInputRow, ipa_prf::OPRFIPAInputRow, BreakdownKey, MatchKey, QueryId, Timestamp, - TriggerValue, - }, + protocol::{ipa_prf::OPRFIPAInputRow, BreakdownKey, QueryId, Timestamp, TriggerValue}, query::QueryStatus, - report::{KeyIdentifier, OprfReport, Report}, + report::{KeyIdentifier, OprfReport}, secret_sharing::{replicated::semi_honest::AdditiveShare, IntoShares}, - test_fixture::{input::GenericReportTestInput, ipa::TestRawDataRecord, Reconstruct}, + test_fixture::{ipa::TestRawDataRecord, Reconstruct}, }; -/// Semi-honest IPA protocol. -/// Returns aggregated values per breakdown key represented as index in the returned vector -#[allow(clippy::missing_panics_doc)] -pub async fn playbook_ipa( - records: &[TestRawDataRecord], - clients: &[MpcHelperClient; 3], - query_id: QueryId, - query_config: IpaQueryConfig, - encryption: Option<(KeyIdentifier, [&KR; 3])>, -) -> IpaQueryResult -where - F: PrimeField + IntoShares>, - Standard: Distribution, - IPAInputRow: Serializable, - TestRawDataRecord: IntoShares>, - AdditiveShare: Serializable, - KR: PublicKeyRegistry, -{ - let mut buffers: [_; 3] = std::array::from_fn(|_| Vec::new()); - let query_size = records.len(); - - if !query_config.plaintext_match_keys { - if let Some((key_id, key_registries)) = encryption { - const ESTIMATED_AVERAGE_REPORT_SIZE: usize = 80; // TODO: confirm/adjust - for buffer in &mut buffers { - buffer.reserve(query_size * ESTIMATED_AVERAGE_REPORT_SIZE); - } - - let mut rng = StdRng::from_entropy(); - let shares: [Vec>; 3] = records.iter().cloned().share(); - zip(&mut buffers, shares).zip(key_registries).for_each( - |((buf, shares), key_registry)| { - for share in shares { - share - .delimited_encrypt_to(key_id, key_registry, &mut rng, buf) - .unwrap(); - } - }, - ); - } else { - panic!("match key encryption was requested, but one or more helpers is missing a public key") - } - } else { - let sz = as Serializable>::Size::USIZE; - for buffer in &mut buffers { - buffer.resize(query_size * sz, 0u8); - } - - let inputs = records.iter().map(|x| { - ipa_test_input!( - { - timestamp: x.timestamp, - match_key: x.user_id, - is_trigger_report: x.is_trigger_report, - breakdown_key: x.breakdown_key, - trigger_value: x.trigger_value, - }; - (F, MatchKey, BreakdownKey) - ) - }); - let shares: [Vec>; 3] = inputs.share(); - zip(&mut buffers, shares).for_each(|(buf, shares)| { - for (share, chunk) in zip(shares, buf.chunks_mut(sz)) { - share.serialize(GenericArray::from_mut_slice(chunk)); - } - }); - } - - let inputs = buffers.map(BodyStream::from); - tracing::info!("Starting query after finishing encryption"); - - run_query_and_validate::(inputs, query_size, clients, query_id, query_config).await -} - +/// Executes the IPA v3 protocol. +/// +/// ## Panics +/// If report encryption fails pub async fn playbook_oprf_ipa( records: Vec, clients: &[MpcHelperClient; 3], @@ -121,29 +47,7 @@ where let mut buffers: [_; 3] = std::array::from_fn(|_| Vec::new()); let query_size = records.len(); - if !query_config.plaintext_match_keys { - if let Some((key_id, key_registries)) = encryption { - const ESTIMATED_AVERAGE_REPORT_SIZE: usize = 80; // TODO: confirm/adjust - for buffer in &mut buffers { - buffer.reserve(query_size * ESTIMATED_AVERAGE_REPORT_SIZE); - } - - let mut rng = StdRng::from_entropy(); - let shares: [Vec>; 3] = - records.iter().cloned().share(); - zip(&mut buffers, shares).zip(key_registries).for_each( - |((buf, shares), key_registry)| { - for share in shares { - share - .delimited_encrypt_to(key_id, key_registry, &mut rng, buf) - .unwrap(); - } - }, - ); - } else { - panic!("match key encryption was requested, but one or more helpers is missing a public key") - } - } else { + if query_config.plaintext_match_keys { let sz = as Serializable>::Size::USIZE; for buffer in &mut buffers { @@ -158,6 +62,28 @@ where share.serialize(GenericArray::from_mut_slice(chunk)); } }); + } else if let Some((key_id, key_registries)) = encryption { + const ESTIMATED_AVERAGE_REPORT_SIZE: usize = 80; // TODO: confirm/adjust + for buffer in &mut buffers { + buffer.reserve(query_size * ESTIMATED_AVERAGE_REPORT_SIZE); + } + + let mut rng = StdRng::from_entropy(); + let shares: [Vec>; 3] = + records.iter().cloned().share(); + zip(&mut buffers, shares) + .zip(key_registries) + .for_each(|((buf, shares), key_registry)| { + for share in shares { + share + .delimited_encrypt_to(key_id, key_registry, &mut rng, buf) + .unwrap(); + } + }); + } else { + panic!( + "match key encryption was requested, but one or more helpers is missing a public key" + ) } let inputs = buffers.map(BodyStream::from); @@ -166,6 +92,7 @@ where run_query_and_validate::(inputs, query_size, clients, query_id, query_config).await } +#[allow(clippy::disallowed_methods)] // allow try_join_all pub async fn run_query_and_validate( inputs: [BodyStream; 3], query_size: usize, diff --git a/ipa-core/src/cli/playbook/mod.rs b/ipa-core/src/cli/playbook/mod.rs index 4fe0ac6ca..672c76d39 100644 --- a/ipa-core/src/cli/playbook/mod.rs +++ b/ipa-core/src/cli/playbook/mod.rs @@ -11,12 +11,16 @@ pub use input::InputSource; pub use multiply::secure_mul; use tokio::time::sleep; -pub use self::ipa::{playbook_ipa, playbook_oprf_ipa}; +pub use self::ipa::playbook_oprf_ipa; use crate::{ config::{ClientConfig, NetworkConfig, PeerConfig}, net::{ClientIdentity, MpcHelperClient}, }; +/// Validates that the expected result matches the actual. +/// +/// ## Panics +/// If results don't match. pub fn validate<'a, I, S>(expected: I, actual: I) where I: IntoIterator, @@ -42,14 +46,14 @@ where let same = next_expected == next_actual; let color = if same { Color::Green } else { Color::Red }; table.add_row(vec![ - Cell::new(format!("{}", i)).fg(color), - Cell::new(format!("{:?}", next_expected)).fg(color), - Cell::new(format!("{:?}", next_actual)).fg(color), + Cell::new(format!("{i}")).fg(color), + Cell::new(format!("{next_expected:?}")).fg(color), + Cell::new(format!("{next_actual:?}")).fg(color), Cell::new(if same { "" } else { "X" }), ]); if !same { - mismatch.push((i, next_expected, next_actual)) + mismatch.push((i, next_expected, next_actual)); } i += 1; @@ -59,11 +63,14 @@ where assert!( mismatch.is_empty(), - "Expected and actual results don't match: {:?}", - mismatch + "Expected and actual results don't match: {mismatch:?}", ); } +/// Creates 3 clients to talk to MPC helpers. +/// +/// ## Panics +/// If configuration file `network_path` cannot be read from or if it does not conform to toml spec. pub async fn make_clients( network_path: Option<&Path>, scheme: Scheme, diff --git a/ipa-core/src/cli/playbook/multiply.rs b/ipa-core/src/cli/playbook/multiply.rs index 7a847e793..2ef5700db 100644 --- a/ipa-core/src/cli/playbook/multiply.rs +++ b/ipa-core/src/cli/playbook/multiply.rs @@ -17,7 +17,7 @@ use crate::{ /// Secure multiplication. Each input must be a valid tuple of field values. /// `(a, b)` will produce `a` * `b`. -#[allow(clippy::missing_panics_doc)] +#[allow(clippy::missing_panics_doc, clippy::disallowed_methods)] pub async fn secure_mul( // I couldn't make `share` work with `&[(F, F)]` input: Vec<(F, F)>, diff --git a/ipa-core/src/config.rs b/ipa-core/src/config.rs index 7794666d2..b38896f4a 100644 --- a/ipa-core/src/config.rs +++ b/ipa-core/src/config.rs @@ -426,13 +426,18 @@ impl Debug for Http2Configurator { #[cfg(all(test, unit_test))] mod tests { + use std::time::Duration; + use hpke::{kem::X25519HkdfSha256, Kem}; use hyper::Uri; use rand::rngs::StdRng; use rand_core::SeedableRng; - use super::*; - use crate::{config::HpkeClientConfig, helpers::HelperIdentity, net::test::TestConfigBuilder}; + use crate::{ + config::{ClientConfig, HpkeClientConfig, Http2Configurator, HttpClientConfigurator}, + helpers::HelperIdentity, + net::test::TestConfigBuilder, + }; const URI_1: &str = "http://localhost:3000"; const URI_2: &str = "http://localhost:3001"; diff --git a/ipa-core/src/ff/curve_points.rs b/ipa-core/src/ff/curve_points.rs index c89701ae4..7a92be3b7 100644 --- a/ipa-core/src/ff/curve_points.rs +++ b/ipa-core/src/ff/curve_points.rs @@ -196,9 +196,12 @@ mod test { use rand::{thread_rng, Rng}; use typenum::U32; - use super::*; use crate::{ - ff::{curve_points::RP25519, ec_prime_field::Fp25519, Serializable}, + ff::{ + curve_points::{NonCanonicalEncoding, RP25519}, + ec_prime_field::Fp25519, + Serializable, + }, secret_sharing::SharedValue, }; diff --git a/ipa-core/src/helpers/buffers/ordering_sender.rs b/ipa-core/src/helpers/buffers/ordering_sender.rs index d7e383036..1e77a98a2 100644 --- a/ipa-core/src/helpers/buffers/ordering_sender.rs +++ b/ipa-core/src/helpers/buffers/ordering_sender.rs @@ -4,7 +4,6 @@ use std::{ collections::VecDeque, fmt::Debug, marker::PhantomData, - mem::drop, num::NonZeroUsize, pin::Pin, task::{Context, Poll}, diff --git a/ipa-core/src/helpers/mod.rs b/ipa-core/src/helpers/mod.rs index 1d2989272..ced453615 100644 --- a/ipa-core/src/helpers/mod.rs +++ b/ipa-core/src/helpers/mod.rs @@ -556,9 +556,9 @@ mod tests { } mod role_assignment_tests { - use super::*; use crate::{ ff::Fp31, + helpers::{HelperIdentity, Role, RoleAssignment}, protocol::{basics::SecureMul, context::Context, RecordId}, rand::{thread_rng, Rng}, test_fixture::{Reconstruct, Runner, TestWorld, TestWorldConfig}, diff --git a/ipa-core/src/helpers/transport/in_memory/transport.rs b/ipa-core/src/helpers/transport/in_memory/transport.rs index a0fffa0f1..f23d586bc 100644 --- a/ipa-core/src/helpers/transport/in_memory/transport.rs +++ b/ipa-core/src/helpers/transport/in_memory/transport.rs @@ -369,18 +369,31 @@ impl Setup { #[cfg(all(test, unit_test))] mod tests { - use std::{io::ErrorKind, num::NonZeroUsize, panic::AssertUnwindSafe, sync::Mutex}; + use std::{ + collections::HashMap, + convert, io, + io::ErrorKind, + num::NonZeroUsize, + panic::AssertUnwindSafe, + sync::{Mutex, Weak}, + task::Poll, + }; use futures_util::{stream::poll_immediate, FutureExt, StreamExt}; use tokio::sync::{mpsc::channel, oneshot}; - use super::*; use crate::{ ff::{FieldType, Fp31}, helpers::{ - query::QueryType::TestMultiply, transport::in_memory::InMemoryNetwork, HelperIdentity, - OrderingSender, + query::{QueryConfig, QueryType::TestMultiply}, + transport::in_memory::{ + transport::{Addr, ConnectionTx, Error, InMemoryStream, InMemoryTransport}, + InMemoryNetwork, Setup, + }, + HelperIdentity, OrderingSender, RouteId, Transport, TransportCallbacks, }, + protocol::{step::Gate, QueryId}, + sync::Arc, }; const STEP: &str = "in-memory-transport"; diff --git a/ipa-core/src/helpers/transport/query/mod.rs b/ipa-core/src/helpers/transport/query/mod.rs index 15a8a5035..5cbaa7aaf 100644 --- a/ipa-core/src/helpers/transport/query/mod.rs +++ b/ipa-core/src/helpers/transport/query/mod.rs @@ -204,19 +204,11 @@ impl Debug for QueryInput { pub enum QueryType { #[cfg(any(test, feature = "test-fixture", feature = "cli"))] TestMultiply, - SemiHonestIpa(IpaQueryConfig), - MaliciousIpa(IpaQueryConfig), - SemiHonestSparseAggregate(SparseAggregateQueryConfig), - MaliciousSparseAggregate(SparseAggregateQueryConfig), OprfIpa(IpaQueryConfig), } impl QueryType { pub const TEST_MULTIPLY_STR: &'static str = "test-multiply"; - pub const SEMIHONEST_IPA_STR: &'static str = "semihonest-ipa"; - pub const MALICIOUS_IPA_STR: &'static str = "malicious-ipa"; - pub const SEMIHONEST_AGGREGATE_STR: &'static str = "semihonest-sparse-aggregate"; - pub const MALICIOUS_AGGREGATE_STR: &'static str = "malicious-sparse-aggregate"; pub const OPRF_IPA_STR: &'static str = "oprf_ipa"; } @@ -226,10 +218,6 @@ impl AsRef for QueryType { match self { #[cfg(any(test, feature = "cli", feature = "test-fixture"))] QueryType::TestMultiply => Self::TEST_MULTIPLY_STR, - QueryType::SemiHonestIpa(_) => Self::SEMIHONEST_IPA_STR, - QueryType::MaliciousIpa(_) => Self::MALICIOUS_IPA_STR, - QueryType::SemiHonestSparseAggregate(_) => Self::SEMIHONEST_AGGREGATE_STR, - QueryType::MaliciousSparseAggregate(_) => Self::MALICIOUS_AGGREGATE_STR, QueryType::OprfIpa(_) => Self::OPRF_IPA_STR, } } @@ -241,7 +229,7 @@ impl Step for QueryType {} #[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "clap", derive(clap::Args))] pub struct IpaQueryConfig { - #[cfg_attr(feature = "clap", arg(long, default_value = "5"))] + #[cfg_attr(feature = "clap", arg(long, default_value = "8"))] pub per_user_credit_cap: u32, #[cfg_attr(feature = "clap", arg(long, default_value = "5"))] pub max_breakdown_key: u32, @@ -262,7 +250,7 @@ pub struct IpaQueryConfig { impl Default for IpaQueryConfig { fn default() -> Self { Self { - per_user_credit_cap: 3, + per_user_credit_cap: 8, max_breakdown_key: 20, attribution_window_seconds: None, num_multi_bits: 3, diff --git a/ipa-core/src/helpers/transport/stream/axum_body.rs b/ipa-core/src/helpers/transport/stream/axum_body.rs index f21daa11a..fec8103b9 100644 --- a/ipa-core/src/helpers/transport/stream/axum_body.rs +++ b/ipa-core/src/helpers/transport/stream/axum_body.rs @@ -20,6 +20,7 @@ impl WrappedAxumBodyStream { /// /// In the real-world-infra configuration, that is the same as a `WrappedAxumBodyStream`. #[cfg(feature = "real-world-infra")] + #[must_use] pub fn new(inner: BodyStream) -> Self { Self::new_internal(inner) } diff --git a/ipa-core/src/helpers/transport/stream/input.rs b/ipa-core/src/helpers/transport/stream/input.rs index f008f1112..2eb1ca355 100644 --- a/ipa-core/src/helpers/transport/stream/input.rs +++ b/ipa-core/src/helpers/transport/stream/input.rs @@ -460,13 +460,16 @@ mod test { use super::*; mod unit_test { + use std::io; + use futures::{StreamExt, TryStreamExt}; use generic_array::GenericArray; + use typenum::Unsigned; - use super::*; use crate::{ error::Error, ff::{Fp31, Fp32BitPrime, Serializable}, + helpers::RecordsStream, secret_sharing::replicated::semi_honest::AdditiveShare, }; diff --git a/ipa-core/src/hpke/mod.rs b/ipa-core/src/hpke/mod.rs index 48d4c1303..523efeef8 100644 --- a/ipa-core/src/hpke/mod.rs +++ b/ipa-core/src/hpke/mod.rs @@ -162,15 +162,16 @@ pub(crate) fn seal_in_place<'a, R: CryptoRng + RngCore, K: PublicKeyRegistry>( #[cfg(all(test, unit_test))] mod tests { use generic_array::GenericArray; + use hpke::{aead::AeadTag, Serializable}; use rand::rngs::StdRng; use rand_core::{CryptoRng, RngCore, SeedableRng}; use typenum::Unsigned; - use super::*; use crate::{ ff::{Gf40Bit, Serializable as IpaSerializable}, - report::{Epoch, EventType}, - secret_sharing::replicated::ReplicatedSecretSharing, + hpke::{open_in_place, seal_in_place, CryptError, Info, IpaAead, KeyPair, KeyRegistry}, + report::{Epoch, EventType, KeyIdentifier}, + secret_sharing::replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, }; type XorReplicated = AdditiveShare; diff --git a/ipa-core/src/lib.rs b/ipa-core/src/lib.rs index b5fb7924a..547817339 100644 --- a/ipa-core/src/lib.rs +++ b/ipa-core/src/lib.rs @@ -104,15 +104,7 @@ pub(crate) mod test_executor { pub(crate) mod test_executor { use std::future::Future; - pub fn run_with(f: F) - where - F: Fn() -> Fut + Send + Sync + 'static, - Fut: Future, - { - run(f); - } - - pub fn run(f: F) -> T + pub fn run_with(f: F) -> T where F: Fn() -> Fut + Send + Sync + 'static, Fut: Future, @@ -126,6 +118,14 @@ pub(crate) mod test_executor { .unwrap() .block_on(f()) } + + pub fn run(f: F) -> T + where + F: Fn() -> Fut + Send + Sync + 'static, + Fut: Future, + { + run_with::<_, _, _, 1>(f) + } } macro_rules! mutually_incompatible { diff --git a/ipa-core/src/net/client/mod.rs b/ipa-core/src/net/client/mod.rs index d23f0041f..67296ba63 100644 --- a/ipa-core/src/net/client/mod.rs +++ b/ipa-core/src/net/client/mod.rs @@ -614,7 +614,7 @@ pub(crate) mod tests { query_id: expected_query_id, input_stream: expected_input.to_vec().into(), }; - client.query_input(data).await.unwrap() + client.query_input(data).await.unwrap(); }, cb, ) diff --git a/ipa-core/src/net/http_serde.rs b/ipa-core/src/net/http_serde.rs index 406ec9a48..72ad9ceb2 100644 --- a/ipa-core/src/net/http_serde.rs +++ b/ipa-core/src/net/http_serde.rs @@ -123,22 +123,6 @@ pub mod query { let query_type = match query_type.as_str() { #[cfg(any(test, feature = "cli", feature = "test-fixture"))] QueryType::TEST_MULTIPLY_STR => Ok(QueryType::TestMultiply), - QueryType::SEMIHONEST_IPA_STR => { - let Query(q) = req.extract().await?; - Ok(QueryType::SemiHonestIpa(q)) - } - QueryType::MALICIOUS_IPA_STR => { - let Query(q) = req.extract().await?; - Ok(QueryType::MaliciousIpa(q)) - } - QueryType::SEMIHONEST_AGGREGATE_STR => { - let Query(q) = req.extract().await?; - Ok(QueryType::SemiHonestSparseAggregate(q)) - } - QueryType::MALICIOUS_AGGREGATE_STR => { - let Query(q) = req.extract().await?; - Ok(QueryType::MaliciousSparseAggregate(q)) - } QueryType::OPRF_IPA_STR => { let Query(q) = req.extract().await?; Ok(QueryType::OprfIpa(q)) @@ -165,9 +149,7 @@ pub mod query { match self.query_type { #[cfg(any(test, feature = "test-fixture", feature = "cli"))] QueryType::TestMultiply => Ok(()), - QueryType::SemiHonestIpa(config) - | QueryType::MaliciousIpa(config) - | QueryType::OprfIpa(config) => { + QueryType::OprfIpa(config) => { write!( f, "&per_user_credit_cap={}&max_breakdown_key={}&num_multi_bits={}", @@ -182,16 +164,6 @@ pub mod query { write!(f, "&attribution_window_seconds={}", window.get())?; } - Ok(()) - } - QueryType::SemiHonestSparseAggregate(config) - | QueryType::MaliciousSparseAggregate(config) => { - write!( - f, - "&contribution_bits={}&num_contributions={}", - config.contribution_bits, config.num_contributions, - )?; - Ok(()) } } diff --git a/ipa-core/src/net/server/handlers/query/create.rs b/ipa-core/src/net/server/handlers/query/create.rs index 4e4d37389..903fbe10f 100644 --- a/ipa-core/src/net/server/handlers/query/create.rs +++ b/ipa-core/src/net/server/handlers/query/create.rs @@ -40,14 +40,14 @@ mod tests { Body, StatusCode, }; - use super::*; use crate::{ ff::FieldType, helpers::{ - query::{IpaQueryConfig, QueryConfig, QueryType, SparseAggregateQueryConfig}, + query::{IpaQueryConfig, QueryConfig, QueryType}, TransportCallbacks, }, net::{ + http_serde, server::handlers::query::test_helpers::{assert_req_fails_with, IntoFailingReq}, test::TestServer, }, @@ -89,7 +89,7 @@ mod tests { async fn create_test_ipa_no_attr_window() { create_test( QueryConfig::new( - QueryType::SemiHonestIpa(IpaQueryConfig { + QueryType::OprfIpa(IpaQueryConfig { per_user_credit_cap: 1, max_breakdown_key: 1, attribution_window_seconds: None, @@ -109,7 +109,7 @@ mod tests { create_test(QueryConfig { size: 1.try_into().unwrap(), field_type: FieldType::Fp32BitPrime, - query_type: QueryType::SemiHonestIpa(IpaQueryConfig { + query_type: QueryType::OprfIpa(IpaQueryConfig { per_user_credit_cap: 1, max_breakdown_key: 1, attribution_window_seconds: NonZeroU32::new(86_400), @@ -120,28 +120,6 @@ mod tests { .await; } - #[tokio::test] - async fn create_test_aggregate() { - create_test(QueryConfig { - size: 1.try_into().unwrap(), - field_type: FieldType::Fp31, - query_type: QueryType::SemiHonestSparseAggregate(SparseAggregateQueryConfig { - contribution_bits: 8.try_into().unwrap(), - num_contributions: 20, - }), - }) - .await; - create_test(QueryConfig { - size: 1.try_into().unwrap(), - field_type: FieldType::Fp31, - query_type: QueryType::MaliciousSparseAggregate(SparseAggregateQueryConfig { - contribution_bits: 8.try_into().unwrap(), - num_contributions: 20, - }), - }) - .await; - } - struct OverrideReq { field_type: String, query_type_params: String, @@ -237,7 +215,7 @@ mod tests { fn default() -> Self { Self { field_type: format!("{:?}", FieldType::Fp32BitPrime), - query_type: QueryType::SEMIHONEST_IPA_STR.to_string(), + query_type: QueryType::OPRF_IPA_STR.to_string(), per_user_credit_cap: "1".into(), max_breakdown_key: "1".into(), attribution_window_seconds: None, @@ -299,71 +277,4 @@ mod tests { }; assert_req_fails_with(req, StatusCode::UNPROCESSABLE_ENTITY).await; } - - struct OverrideAggregateReq { - field_type: String, - query_type: String, - contribution_bits: String, - num_contributions: String, - } - - impl IntoFailingReq for OverrideAggregateReq { - fn into_req(self, port: u16) -> Request { - let query = format!( - "query_type={}&contribution_bits={}&num_contributions={}", - self.query_type, self.contribution_bits, self.num_contributions, - ); - OverrideReq { - field_type: self.field_type, - query_type_params: query, - } - .into_req(port) - } - } - - impl Default for OverrideAggregateReq { - fn default() -> Self { - Self { - field_type: format!("{:?}", FieldType::Fp32BitPrime), - query_type: QueryType::SEMIHONEST_AGGREGATE_STR.to_string(), - contribution_bits: "8".into(), - num_contributions: "20".into(), - } - } - } - #[tokio::test] - async fn malformed_field_type_aggregate() { - let req = OverrideAggregateReq { - field_type: "invalid_field".into(), - ..Default::default() - }; - assert_req_fails_with(req, StatusCode::UNPROCESSABLE_ENTITY).await; - } - - #[tokio::test] - async fn malformed_query_type_aggregate() { - let req = OverrideAggregateReq { - query_type: "not_aggregate".into(), - ..Default::default() - }; - assert_req_fails_with(req, StatusCode::UNPROCESSABLE_ENTITY).await; - } - - #[tokio::test] - async fn malformed_contribution_bits_aggregate() { - let req = OverrideAggregateReq { - contribution_bits: "3".into(), - ..Default::default() - }; - assert_req_fails_with(req, StatusCode::UNPROCESSABLE_ENTITY).await; - } - - #[tokio::test] - async fn malformed_num_contributions_aggregate() { - let req = OverrideAggregateReq { - num_contributions: "-1".into(), - ..Default::default() - }; - assert_req_fails_with(req, StatusCode::UNPROCESSABLE_ENTITY).await; - } } diff --git a/ipa-core/src/net/server/handlers/query/input.rs b/ipa-core/src/net/server/handlers/query/input.rs index d1ea6621d..f926f4e33 100644 --- a/ipa-core/src/net/server/handlers/query/input.rs +++ b/ipa-core/src/net/server/handlers/query/input.rs @@ -26,14 +26,17 @@ pub fn router(transport: Arc) -> Router { #[cfg(all(test, unit_test))] mod tests { - use axum::http::Request; + use axum::{http::Request, Extension}; use hyper::{Body, StatusCode}; - use super::*; use crate::{ helpers::{query::QueryInput, BytesStream, TransportCallbacks}, net::{ - server::handlers::query::test_helpers::{assert_req_fails_with, IntoFailingReq}, + http_serde, + server::handlers::query::{ + input::handler, + test_helpers::{assert_req_fails_with, IntoFailingReq}, + }, test::TestServer, }, protocol::QueryId, diff --git a/ipa-core/src/net/server/handlers/query/prepare.rs b/ipa-core/src/net/server/handlers/query/prepare.rs index ec22b026e..bdb746bed 100644 --- a/ipa-core/src/net/server/handlers/query/prepare.rs +++ b/ipa-core/src/net/server/handlers/query/prepare.rs @@ -33,10 +33,9 @@ pub fn router(transport: Arc) -> Router { mod tests { use std::future::ready; - use axum::http::Request; + use axum::{http::Request, Extension}; use hyper::{Body, StatusCode}; - use super::*; use crate::{ ff::FieldType, helpers::{ @@ -44,8 +43,10 @@ mod tests { HelperIdentity, RoleAssignment, TransportCallbacks, }, net::{ + http_serde, server::{ handlers::query::{ + prepare::handler, test_helpers::{assert_req_fails_with, IntoFailingReq}, MaybeExtensionExt, }, diff --git a/ipa-core/src/net/server/handlers/query/results.rs b/ipa-core/src/net/server/handlers/query/results.rs index b974b8383..cb56e9315 100644 --- a/ipa-core/src/net/server/handlers/query/results.rs +++ b/ipa-core/src/net/server/handlers/query/results.rs @@ -30,15 +30,18 @@ pub fn router(transport: Arc) -> Router { mod tests { use std::future::ready; - use axum::http::Request; + use axum::{http::Request, Extension}; use hyper::StatusCode; - use super::*; use crate::{ ff::Fp31, helpers::TransportCallbacks, net::{ - server::handlers::query::test_helpers::{assert_req_fails_with, IntoFailingReq}, + http_serde, + server::handlers::query::{ + results::handler, + test_helpers::{assert_req_fails_with, IntoFailingReq}, + }, test::TestServer, }, protocol::QueryId, diff --git a/ipa-core/src/net/server/handlers/query/status.rs b/ipa-core/src/net/server/handlers/query/status.rs index 43608644e..f08a475e9 100644 --- a/ipa-core/src/net/server/handlers/query/status.rs +++ b/ipa-core/src/net/server/handlers/query/status.rs @@ -28,15 +28,17 @@ pub fn router(transport: Arc) -> Router { mod tests { use std::future::ready; - use axum::http::Request; + use axum::{http::Request, Extension, Json}; use hyper::StatusCode; - use super::*; use crate::{ helpers::TransportCallbacks, net::{ http_serde, - server::handlers::query::test_helpers::{assert_req_fails_with, IntoFailingReq}, + server::handlers::query::{ + status::handler, + test_helpers::{assert_req_fails_with, IntoFailingReq}, + }, test::TestServer, }, protocol::QueryId, diff --git a/ipa-core/src/net/test.rs b/ipa-core/src/net/test.rs index 414e808f2..c66a8d72c 100644 --- a/ipa-core/src/net/test.rs +++ b/ipa-core/src/net/test.rs @@ -268,6 +268,7 @@ impl TestServerBuilder { } #[cfg(all(test, web_test))] + #[must_use] pub fn use_http1(mut self) -> Self { self.use_http1 = true; self diff --git a/ipa-core/src/net/transport.rs b/ipa-core/src/net/transport.rs index 4ae71cf6e..fcdc63c33 100644 --- a/ipa-core/src/net/transport.rs +++ b/ipa-core/src/net/transport.rs @@ -281,8 +281,8 @@ mod tests { callbacks, ); server.start_on(Some(socket), ()).await; - let app = setup.connect(transport); - app + + setup.connect(transport) }, ), ) diff --git a/ipa-core/src/protocol/aggregation/input.rs b/ipa-core/src/protocol/aggregation/input.rs deleted file mode 100644 index d073cfb2d..000000000 --- a/ipa-core/src/protocol/aggregation/input.rs +++ /dev/null @@ -1,56 +0,0 @@ -use std::ops::Add; - -use generic_array::{ArrayLength, GenericArray}; -use typenum::Unsigned; - -use crate::{ - error::Error, - ff::{GaloisField, Serializable}, - secret_sharing::replicated::semi_honest::AdditiveShare as Replicated, -}; - -#[derive(Debug)] -#[cfg_attr(test, derive(Clone, PartialEq, Eq))] -pub struct SparseAggregateInputRow { - pub contribution_value: Replicated, - pub breakdown_key: Replicated, -} - -impl Serializable for SparseAggregateInputRow -where - Replicated: Serializable, - Replicated: Serializable, - as Serializable>::Size: Add< as Serializable>::Size>, - < as Serializable>::Size as Add< as Serializable>::Size>>::Output: - ArrayLength, -{ - type Size = < as Serializable>::Size as Add< - as Serializable>::Size, - >>::Output; - type DeserializationError = Error; - - fn serialize(&self, buf: &mut GenericArray) { - let cv_sz = as Serializable>::Size::USIZE; - let bk_sz = as Serializable>::Size::USIZE; - - self.contribution_value - .serialize(GenericArray::from_mut_slice(&mut buf[..cv_sz])); - self.breakdown_key - .serialize(GenericArray::from_mut_slice(&mut buf[cv_sz..cv_sz + bk_sz])); - } - - fn deserialize(buf: &GenericArray) -> Result { - let cv_sz = as Serializable>::Size::USIZE; - let bk_sz = as Serializable>::Size::USIZE; - - let value = Replicated::::deserialize(GenericArray::from_slice(&buf[..cv_sz])) - .map_err(|e| Error::ParseError(e.into()))?; - let breakdown_key = - Replicated::::deserialize(GenericArray::from_slice(&buf[cv_sz..cv_sz + bk_sz])) - .map_err(|e| Error::ParseError(e.into()))?; - Ok(Self { - contribution_value: value, - breakdown_key, - }) - } -} diff --git a/ipa-core/src/protocol/aggregation/mod.rs b/ipa-core/src/protocol/aggregation/mod.rs deleted file mode 100644 index 70e6a418f..000000000 --- a/ipa-core/src/protocol/aggregation/mod.rs +++ /dev/null @@ -1,314 +0,0 @@ -mod input; - -use futures::{stream::iter as stream_iter, Stream, TryStreamExt}; -use futures_util::StreamExt; -pub use input::SparseAggregateInputRow; - -use super::{context::Context, sort::bitwise_to_onehot, step::BitOpStep, RecordId}; -use crate::{ - error::Error, - ff::{Field, GaloisField, Gf2, PrimeField, Serializable}, - protocol::{ - context::{UpgradableContext, UpgradedContext, Validator}, - modulus_conversion::convert_bits, - BasicProtocols, - }, - secret_sharing::{ - replicated::{ - malicious::{DowngradeMalicious, ExtendableField}, - semi_honest::AdditiveShare as Replicated, - ReplicatedSecretSharing, - }, - BitDecomposed, Linear as LinearSecretSharing, LinearRefOps, - }, - seq_join::seq_join, -}; - -// TODO: Use `#[derive(Step)]` once the protocol is implemented and the bench test is enabled. -// Once that is done, run `collect_steps.py` to generate `steps.txt` that includes these steps. - -pub(crate) enum Step { - Validator, - ConvertValueBits, - ConvertBreakdownKeyBits, - ComputeEqualityChecks, - CheckTimesValue, -} -impl crate::protocol::step::Step for Step {} -impl AsRef for Step { - fn as_ref(&self) -> &str { - match self { - Step::Validator => "validator", - Step::ConvertValueBits => "convert_value_bits", - Step::ConvertBreakdownKeyBits => "convert_breakdown_key_bits", - Step::ComputeEqualityChecks => "convert_equality_key_bits", - Step::CheckTimesValue => "check_times_values", - } - } -} -#[cfg(feature = "compact-gate")] -impl super::step::StepNarrow for crate::protocol::step::Compact { - fn narrow(&self, _step: &Step) -> Self { - unimplemented!("compact gate is not supported in unit tests") - } -} - -/// Binary-share aggregation protocol for a sparse breakdown key vector input. -/// It takes a tuple of two vectors, `contribution_values` and `breakdown_keys`, -/// and aggregate each value to the corresponding histogram bucket specified by -/// the breakdown key. Since breakdown keys are secret shared, we need to create -/// a vector of Z2 shares for each record indicating which bucket the value -/// should be aggregated to. The output is a vector of Zp shares - a histogram -/// of the aggregated values. -/// -/// # Errors -/// Propagates errors from multiplications -pub async fn sparse_aggregate<'a, C, S, SB, F, CV, BK>( - sh_ctx: C, - input_rows: &[SparseAggregateInputRow], - num_buckets: usize, -) -> Result>, Error> -where - C: UpgradableContext, - C::UpgradedContext: UpgradedContext, - S: LinearSecretSharing - + BasicProtocols, F> - + Serializable - + DowngradeMalicious> - + 'static, - for<'r> &'r S: LinearRefOps<'r, S, F>, - C::UpgradedContext: UpgradedContext, - SB: LinearSecretSharing + BasicProtocols, Gf2> + 'static, - F: PrimeField + ExtendableField, - CV: GaloisField, - BK: GaloisField, -{ - let validator = sh_ctx.narrow(&Step::Validator).validator::(); - let ctx = validator.context().set_total_records(input_rows.len()); - let contributions = input_rows.iter().map(|row| &row.contribution_value); - let breakdowns = input_rows.iter().map(|row| &row.breakdown_key); - - // convert the input from `[Z2]^u` into `[Zp]^u` - let (converted_value_bits, converted_breakdown_key_bits) = ( - upgrade_bit_shares( - &ctx.narrow(&Step::ConvertValueBits), - contributions, - CV::BITS, - ), - upgrade_bit_shares( - &ctx.narrow(&Step::ConvertBreakdownKeyBits), - breakdowns, - BK::BITS, - ), - ); - - let output = sparse_aggregate_values_per_bucket( - ctx, - converted_value_bits, - converted_breakdown_key_bits, - num_buckets, - ) - .await?; - - validator.validate(output).await -} - -/// This protocol assumes that devices and/or browsers have applied per-user -/// capping. -/// -/// # Errors -/// propagates errors from multiplications -#[tracing::instrument(name = "aggregate_values_per_bucket", skip_all)] -pub async fn sparse_aggregate_values_per_bucket( - ctx: C, - contribution_values: I1, - breakdown_keys: I2, - num_buckets: usize, -) -> Result, Error> -where - F: PrimeField, - I1: Stream, Error>> + Send, - I2: Stream, Error>> + Send, - C: UpgradedContext, - S: LinearSecretSharing + BasicProtocols + Serializable + 'static, - for<'a> &'a S: LinearRefOps<'a, S, F>, -{ - let equality_check_ctx = ctx.narrow(&Step::ComputeEqualityChecks); - - // Generate N streams for each bucket specified by the `num_buckets`. - // A stream is pipeline of contribution values multiplied by the "equality bit". An equality - // bit is a bit that is a share of 1 if the breakdown key matches the bucket, or 0 otherwise. - let streams = seq_join( - ctx.active_work(), - breakdown_keys - .zip(contribution_values) - .enumerate() - .map(|(i, (bk, v))| { - let eq_ctx = &equality_check_ctx; - let c = ctx.clone(); - async move { - let equality_checks = bitwise_to_onehot(eq_ctx.clone(), i, &bk?).await?; - equality_bits_times_value(&c, equality_checks, num_buckets, v?, i).await - } - }), - ); - // for each bucket stream, sum up the contribution values - streams - .try_fold(vec![S::ZERO; num_buckets], |mut acc, bucket| async move { - for (i, b) in bucket.into_iter().enumerate() { - acc[i] += &b; - } - Ok(acc) - }) - .await -} - -async fn equality_bits_times_value( - ctx: &C, - check_bits: BitDecomposed, - num_buckets: usize, - value_bits: BitDecomposed, - record_id: usize, -) -> Result, Error> -where - F: PrimeField, - C: UpgradedContext, - S: LinearSecretSharing + BasicProtocols + Serializable + 'static, - for<'a> &'a S: LinearRefOps<'a, S, F>, -{ - let check_times_value_ctx = ctx.narrow(&Step::CheckTimesValue); - - ctx.try_join( - check_bits - .into_iter() - .take(num_buckets) - .enumerate() - .map(|(check_idx, check)| { - let step = BitOpStep::from(check_idx); - let c = check_times_value_ctx.narrow(&step); - let record_id = RecordId::from(record_id); - let v = value_bits.to_additive_sharing_in_large_field(); - async move { check.multiply(&v, c, record_id).await } - }), - ) - .await -} - -fn upgrade_bit_shares<'a, F, C, S, I, G>( - ctx: &C, - input_rows: I, - num_bits: u32, -) -> impl Stream, Error>> + 'a -where - F: PrimeField, - C: UpgradedContext + 'a, - S: LinearSecretSharing + BasicProtocols + Serializable + 'static, - I: Iterator> + Send + 'a, - G: GaloisField, -{ - let gf2_bits = input_rows.map(move |row| { - BitDecomposed::decompose(num_bits, |idx| { - Replicated::new( - Gf2::truncate_from(row.left()[idx]), - Gf2::truncate_from(row.right()[idx]), - ) - }) - }); - - convert_bits( - ctx.narrow(&Step::ConvertValueBits), - stream_iter(gf2_bits), - 0..num_bits, - ) -} - -#[cfg(all(test, unit_test))] -mod tests { - use super::sparse_aggregate; - use crate::{ - ff::{Field, Fp32BitPrime, GaloisField, Gf3Bit, Gf8Bit}, - protocol::aggregation::SparseAggregateInputRow, - secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, SharedValue}, - test_fixture::{Reconstruct, Runner, TestWorld}, - }; - - fn create_input_vec( - input: &[(Replicated, Replicated)], - ) -> Vec> - where - BK: GaloisField, - CV: GaloisField, - { - input - .iter() - .map(|x| SparseAggregateInputRow { - breakdown_key: x.0.clone(), - contribution_value: x.1.clone(), - }) - .collect::>() - } - - #[tokio::test] - pub async fn aggregate() { - type BK = Gf3Bit; - type CV = Gf8Bit; - - const EXPECTED: &[u128] = &[28, 0, 0, 6, 1, 0, 0, 8]; - const NUM_BUCKETS: usize = 1 << BK::BITS; - const INPUT: &[(u32, u32)] = &[ - // (breakdown_key, contribution_value) - (0, 0), - (0, 0), - (0, 18), - (0, 0), - (0, 0), - (3, 5), - (0, 0), - (4, 1), - (0, 0), - (0, 0), - (7, 2), - (0, 0), - (0, 0), - (0, 0), - (0, 10), - (3, 1), - (0, 0), - (7, 6), - (0, 0), - ]; - - let bitwise_input = INPUT - .iter() - .map(|(bk, value)| (BK::truncate_from(*bk), CV::truncate_from(*value))); - - let world = TestWorld::default(); - let result = world - .semi_honest(bitwise_input.clone(), |ctx, shares| async move { - sparse_aggregate::<_, _, _, Fp32BitPrime, CV, BK>( - ctx, - &create_input_vec(&shares), - NUM_BUCKETS, - ) - .await - .unwrap() - }) - .await - .reconstruct(); - assert_eq!(result, EXPECTED); - - let result = world - .malicious(bitwise_input.clone(), |ctx, shares| async move { - sparse_aggregate::<_, _, _, Fp32BitPrime, CV, BK>( - ctx, - &create_input_vec(&shares), - NUM_BUCKETS, - ) - .await - .unwrap() - }) - .await - .reconstruct(); - assert_eq!(result, EXPECTED); - } -} diff --git a/ipa-core/src/protocol/attribution/accumulate_credit.rs b/ipa-core/src/protocol/attribution/accumulate_credit.rs deleted file mode 100644 index 1effcf532..000000000 --- a/ipa-core/src/protocol/attribution/accumulate_credit.rs +++ /dev/null @@ -1,319 +0,0 @@ -use std::num::NonZeroU32; - -use ipa_macros::Step; - -use super::{ - do_the_binary_tree_thing, - input::{AccumulateCreditInputRow, AccumulateCreditOutputRow}, -}; -use crate::{ - error::Error, - ff::Field, - protocol::{context::Context, BasicProtocols, RecordId}, - secret_sharing::Linear as LinearSecretSharing, -}; - -/// -/// When `PER_USER_CAP` is set to one, this function is called -/// In this case, `trigger_value` is ignored entirely. Instead, each `trigger_report` counts as one. -/// So in the event that a `source report` is followed by multiple `trigger reports`, only one will count. -/// As such, this function can be simplified a great deal. All that matters is when a `source report` is -/// immediately followed by a `trigger report` from the same `match key`. As such, each row only needs to -/// be compared to the following row. This is done by multiplying the `is_trigger_report` by the `helper_bit`, -/// which is what `stop_bits` is. -/// If there are multiple attributed conversions from the same `match key` they will be removed in the -/// next stage; `user capping`. -/// -/// This method implements "last touch" attribution, so only the last `source report` before a `trigger report` -/// will receive any credit. -async fn accumulate_credit_cap_one<'a, F, C, T>( - ctx: C, - input: &'a [AccumulateCreditInputRow], - stop_bits: &'a [T], - attribution_window_seconds: Option, -) -> Result> + 'a, Error> -where - F: Field, - C: Context, - T: LinearSecretSharing + BasicProtocols, -{ - // if `attribution_window_seconds` is not set, we use `stop_bits` directly. Otherwise, we need to invalidate - // reports that are outside the attribution window by multiplying them by `active_bit`. active_bit is - // 0 if the trigger report's time-delta to the nearest source report is greater than the attribution window. - let attributed_trigger_reports_in_window = if attribution_window_seconds.is_none() { - stop_bits.to_vec() - } else { - let memoize_context = ctx - .narrow(&Step::ActiveBitTimesStopBit) - .set_total_records(input.len() - 1); - ctx.try_join( - input - .iter() - .skip(1) - .zip(stop_bits) - .enumerate() - .map(|(i, (x, sb))| { - let c = memoize_context.clone(); - let record_id = RecordId::from(i); - async move { x.active_bit.multiply(sb, c, record_id).await } - }), - ) - .await? - }; - - let output = input - .iter() - .zip(attributed_trigger_reports_in_window) - .map(|(x, bit)| { - AccumulateCreditOutputRow::new(x.is_trigger_report.clone(), x.helper_bit.clone(), bit) - }); - - Ok(output) -} - -/// The accumulation step operates on a sorted list with O(log N) iterations, where N is the input length. -/// It is the first step of the Oblivious Attribution protocol, and subsequent steps of all attribution models -/// (i.e., last touch, equal credit) use an output produced by this step. During each iteration, it accesses each -/// list element once, establishing a tree-like structure in which, starting from the leaf nodes, each node -/// accesses and accumulates data of its children. By increasing the distance between the interacting nodes during -/// each iteration by a factor of two, we ensure that each node only accumulates the value of each successor only once. -/// -/// -/// # Errors -/// -/// Fails if the multiplication fails. -#[tracing::instrument(name = "accumulate_credit", skip_all)] -pub async fn accumulate_credit( - ctx: C, - input: &[AccumulateCreditInputRow], - stop_bits: &[T], - per_user_credit_cap: u32, - attribution_window_seconds: Option, -) -> Result>, Error> -where - F: Field, - C: Context, - T: LinearSecretSharing + BasicProtocols, -{ - if per_user_credit_cap == 1 { - return Ok( - accumulate_credit_cap_one(ctx, input, stop_bits, attribution_window_seconds) - .await? - .collect::>(), - ); - } - - let mut credits = input - .iter() - .map(|x| x.trigger_value.clone()) - .collect::>(); - - // 2. Accumulate (up to 4 multiplications) - // - // For each iteration (`log2(input.len())`), we access each node in the - // list to accumulate values. The accumulation can be optimized to the - // following arithmetic circuit. - // - // b = current.stop_bit * successor.helper_bit * successor.trigger_bit; - // new_credit[current_index] = current.credit + b * successor.credit; - // new_stop_bit[current_index] = b * successor.stop_bit; - // - // Each list element interacts with exactly one other element in each - // iteration, and the interaction do not depend on the calculation results - // of other elements, allowing the algorithm to be executed in parallel. - - // generate powers of 2 that fit into input len. If num_rows is 15, this will produce [1, 2, 4, 8] - do_the_binary_tree_thing(ctx, stop_bits.to_vec(), &mut credits).await?; - - let output = input - .iter() - .enumerate() - .map(|(i, x)| { - AccumulateCreditOutputRow::new( - x.is_trigger_report.clone(), - x.helper_bit.clone(), - credits[i].clone(), - ) - }) - .collect::>(); - - Ok(output) -} - -#[derive(Step)] -pub(crate) enum Step { - ActiveBitTimesStopBit, -} - -#[cfg(all(test, unit_test))] -mod tests { - use std::num::NonZeroU32; - - use crate::{ - accumulation_test_input, - ff::Fp32BitPrime, - protocol::{ - attribution::{ - accumulate_credit::accumulate_credit, compute_stop_bits, - input::AccumulateCreditInputRow, - }, - context::{UpgradableContext, Validator}, - BreakdownKey, MatchKey, - }, - secret_sharing::replicated::semi_honest::AdditiveShare as Replicated, - test_fixture::{input::GenericReportTestInput, Reconstruct, Runner, TestWorld}, - }; - - async fn accumulate_credit_test( - input: Vec>, - cap: u32, - attribution_window_seconds: Option, - ) -> Vec { - type InputType = Vec>>; - TestWorld::default() - .semi_honest(input.into_iter(), |ctx, input: InputType| async move { - let validator = &ctx.validator::(); - let ctx = validator.context(); // Ignore the validator for this test. - - let (itb, hb): (Vec<_>, Vec<_>) = input - .iter() - .map(|x| (x.is_trigger_report.clone(), x.helper_bit.clone())) - .unzip(); - // Note that computing stop bits requires that the first helper bit be skipped. - let stop_bits = compute_stop_bits(ctx.clone(), &itb, &hb[1..]) - .await - .unwrap() - .collect::>(); - - accumulate_credit(ctx, &input, &stop_bits, cap, attribution_window_seconds) - .await - .unwrap() - }) - .await - // We only need the trigger values. - .map(|share| { - share - .into_iter() - .map(|r| r.trigger_value) - .collect::>() - }) - .reconstruct() - } - - // If the cap > 1, the protocol proceeds with the normal binary-tree prefix-sum thing. - #[tokio::test] - pub async fn accumulate_basic() { - const EXPECTED: &[u128; 21] = &[ - 0, 0, 19, 19, 9, 7, 6, 1, 0, 0, 0, 10, 15, 15, 12, 0, 10, 10, 4, 6, 6, - ]; - const PER_USER_CAP: u32 = 3; // can be anything but 1 - const ATTRIBUTION_WINDOW: Option = None; // no attribution window = all reports are valid - - let input: Vec> = accumulation_test_input!( - [ - { is_trigger_report: 0, helper_bit: 0, active_bit: 1, credit: 0 }, // 0 - { is_trigger_report: 0, helper_bit: 0, active_bit: 1, credit: 0 }, // 0 - { is_trigger_report: 0, helper_bit: 1, active_bit: 1, credit: 0 }, // 19 - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 10 }, // 19 - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 2 }, // 9 - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 1 }, // 7 - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 5 }, // 6 - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 1 }, // 1 - { is_trigger_report: 1, helper_bit: 1, active_bit: 0, credit: 0 }, // 0 - { is_trigger_report: 1, helper_bit: 1, active_bit: 0, credit: 0 }, // 0 - { is_trigger_report: 0, helper_bit: 0, active_bit: 1, credit: 0 }, // 0 - { is_trigger_report: 1, helper_bit: 0, active_bit: 1, credit: 10 }, // 10 - { is_trigger_report: 0, helper_bit: 0, active_bit: 1, credit: 0 }, // 0 (!) or 15? - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 3 }, // 15 - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 12 }, // 12 - { is_trigger_report: 0, helper_bit: 1, active_bit: 1, credit: 0 }, // 0 - { is_trigger_report: 0, helper_bit: 1, active_bit: 1, credit: 0 }, // 10 - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 6 }, // 10 - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 4 }, // 4 - { is_trigger_report: 0, helper_bit: 1, active_bit: 1, credit: 0 }, // 6 - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 6 }, // 6 - ]; - (Fp32BitPrime, MatchKey, BreakdownKey) - ); - let result = accumulate_credit_test(input, PER_USER_CAP, ATTRIBUTION_WINDOW).await; - assert_eq!(result, EXPECTED); - } - - /// If the cap = 1 and attribution_window_seconds = 0, then the expected result is the same as - /// `is_trigger_report` * `helper_bit` (= `stop_bit`). In other words, it counts all matching - /// trigger reports. - #[tokio::test] - pub async fn accumulate_cap_of_one_without_attribution_window() { - const EXPECTED: &[u128; 20] = &[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1]; - const PER_USER_CAP: u32 = 1; - const ATTRIBUTION_WINDOW_SECONDS: Option = None; - - let input: Vec> = accumulation_test_input!( - [ - { is_trigger_report: 0, helper_bit: 0, active_bit: 1, credit: 0 }, - { is_trigger_report: 0, helper_bit: 0, active_bit: 1, credit: 0 }, - { is_trigger_report: 0, helper_bit: 1, active_bit: 1, credit: 0 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 10 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 2 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 1 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 5 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 1 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 0, credit: 0 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 0, credit: 0 }, - { is_trigger_report: 0, helper_bit: 0, active_bit: 1, credit: 0 }, - { is_trigger_report: 1, helper_bit: 0, active_bit: 1, credit: 10 }, - { is_trigger_report: 0, helper_bit: 0, active_bit: 1, credit: 0 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 3 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 12 }, - { is_trigger_report: 0, helper_bit: 1, active_bit: 1, credit: 0 }, - { is_trigger_report: 0, helper_bit: 1, active_bit: 1, credit: 0 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 6 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 4 }, - { is_trigger_report: 0, helper_bit: 1, active_bit: 1, credit: 0 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 6 }, - ]; - (Fp32BitPrime, MatchKey, BreakdownKey) - ); - let result = accumulate_credit_test(input, PER_USER_CAP, ATTRIBUTION_WINDOW_SECONDS).await; - assert_eq!(result, EXPECTED); - } - - /// If the cap = 1 and attribution_window_seconds > 0, then the expected result is the same as - /// `is_trigger_report` * `helper_bit` * `active_bit`. In other words, it counts all matching - /// trigger reports that are within the given attribution window. - #[tokio::test] - pub async fn accumulate_cap_of_one_with_attribution_window() { - const EXPECTED: &[u128; 20] = &[0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1]; - const PER_USER_CAP: u32 = 1; - const ATTRIBUTION_WINDOW_SECONDS: Option = NonZeroU32::new(1); - - let input: Vec> = accumulation_test_input!( - [ - { is_trigger_report: 0, helper_bit: 0, active_bit: 1, credit: 0 }, - { is_trigger_report: 0, helper_bit: 0, active_bit: 1, credit: 0 }, - { is_trigger_report: 0, helper_bit: 1, active_bit: 1, credit: 0 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 10 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 2 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 1 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 5 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 1 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 0, credit: 0 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 0, credit: 0 }, - { is_trigger_report: 0, helper_bit: 0, active_bit: 1, credit: 0 }, - { is_trigger_report: 1, helper_bit: 0, active_bit: 1, credit: 10 }, - { is_trigger_report: 0, helper_bit: 0, active_bit: 1, credit: 0 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 3 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 12 }, - { is_trigger_report: 0, helper_bit: 1, active_bit: 1, credit: 0 }, - { is_trigger_report: 0, helper_bit: 1, active_bit: 1, credit: 0 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 6 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 4 }, - { is_trigger_report: 0, helper_bit: 1, active_bit: 1, credit: 0 }, - { is_trigger_report: 1, helper_bit: 1, active_bit: 1, credit: 6 }, - ]; - (Fp32BitPrime, MatchKey, BreakdownKey) - ); - let result = accumulate_credit_test(input, PER_USER_CAP, ATTRIBUTION_WINDOW_SECONDS).await; - assert_eq!(result, EXPECTED); - } -} diff --git a/ipa-core/src/protocol/attribution/aggregate_credit.rs b/ipa-core/src/protocol/attribution/aggregate_credit.rs deleted file mode 100644 index 1a0a877f1..000000000 --- a/ipa-core/src/protocol/attribution/aggregate_credit.rs +++ /dev/null @@ -1,200 +0,0 @@ -extern crate ipa_macros; - -use futures::stream::{iter as stream_iter, StreamExt, TryStreamExt}; -use ipa_macros::Step; - -use crate::{ - error::Error, - ff::{Gf2, PrimeField, Serializable}, - protocol::{ - context::{UpgradableContext, UpgradedContext, Validator}, - ipa_prf::prf_sharding::bucket::move_single_value_to_bucket, - modulus_conversion::convert_bits, - sort::generate_permutation::ShuffledPermutationWrapper, - BasicProtocols, RecordId, - }, - secret_sharing::{ - replicated::{ - malicious::{DowngradeMalicious, ExtendableField}, - semi_honest::AdditiveShare as Replicated, - }, - BitDecomposed, Linear as LinearSecretSharing, - }, - seq_join::seq_join, -}; - -/// Aggregation step for Oblivious Attribution protocol. -/// # Panics -/// It probably won't -/// -/// # Errors -/// propagates errors from multiplications -#[tracing::instrument(name = "aggregate_credit", skip_all)] -// instrumenting this function makes the return type look bad to Clippy -#[allow(clippy::type_complexity)] -pub async fn aggregate_credit( - validator: V, - breakdown_keys: IB, - capped_credits: IC, - max_breakdown_key: u32, -) -> Result<(V, Vec), Error> -where - V: Validator, - C: UpgradableContext = V>, - C::UpgradedContext: UpgradedContext, - F: PrimeField + ExtendableField, - IB: IntoIterator>> + ExactSizeIterator + Send, - IB::IntoIter: Send, - IC: IntoIterator + ExactSizeIterator + Send, - IC::IntoIter: Send, - S: LinearSecretSharing + BasicProtocols, F> + Serializable + 'static, - ShuffledPermutationWrapper>: DowngradeMalicious>, -{ - let m_ctx = validator.context(); - let res = - simple_aggregate_credit(m_ctx, breakdown_keys, capped_credits, max_breakdown_key).await?; - Ok((validator, res)) -} - -async fn simple_aggregate_credit( - ctx: C, - breakdown_keys: IB, - capped_credits: IC, - max_breakdown_key: u32, -) -> Result, Error> -where - F: PrimeField, - IB: IntoIterator>> + ExactSizeIterator + Send, - IB::IntoIter: Send, - IC: IntoIterator + ExactSizeIterator + Send, - IC::IntoIter: Send, - C: UpgradedContext, - S: LinearSecretSharing + BasicProtocols + Serializable + 'static, -{ - let record_count = breakdown_keys.len(); - let valid_bits_count = u32::BITS - (max_breakdown_key - 1).leading_zeros(); - - let move_value_to_bucket_context = ctx - .narrow(&Step::MoveValueToBucket) - .set_total_records(record_count); - - let converted_bk = convert_bits( - ctx.narrow(&Step::ModConvBreakdownKeyBits) - .set_total_records(record_count), - stream_iter(breakdown_keys), - 0..valid_bits_count, - ); - - let increments = seq_join( - ctx.active_work(), - converted_bk - .zip(stream_iter(capped_credits)) - .enumerate() - .map(|(i, (bk, cred))| { - let ctx = move_value_to_bucket_context.clone(); - async move { - move_single_value_to_bucket( - ctx, - RecordId::from(i), - bk.unwrap(), - cred, - usize::try_from(max_breakdown_key).unwrap(), - true, - ) - .await - } - }), - ); - - let aggregate = increments - .try_fold( - vec![S::ZERO; max_breakdown_key as usize], - |mut acc, row| async move { - for (i, incr) in row.into_iter().enumerate() { - acc[i] += &incr; - } - Ok(acc) - }, - ) - .await?; - Ok(aggregate) -} - -#[derive(Step)] -pub(crate) enum Step { - MoveValueToBucket, - ModConvBreakdownKeyBits, -} - -#[cfg(all(test, unit_test))] -mod tests { - use super::aggregate_credit; - use crate::{ - ff::{Field, Fp32BitPrime, Gf2}, - protocol::context::UpgradableContext, - secret_sharing::BitDecomposed, - test_fixture::{Reconstruct, Runner, TestWorld}, - }; - - #[tokio::test] - pub async fn aggregate() { - const MAX_BREAKDOWN_KEY: u32 = 8; - - const EXPECTED: &[u128] = &[0, 0, 12, 0, 18, 6, 0, 0]; - - // (breakdown_key, credit) - const INPUT: &[(u32, u32)] = &[ - (3, 0), - (4, 0), - (4, 18), - (0, 0), - (0, 0), - (0, 0), - (0, 0), - (0, 0), - (1, 0), - (0, 0), - (2, 2), - (0, 0), - (0, 0), - (2, 0), - (2, 10), - (0, 0), - (0, 0), - (5, 6), - (0, 0), - ]; - - let world = TestWorld::default(); - let result = world - .semi_honest( - INPUT.iter().map(|&(bk, credit)| { - ( - // decomposed breakdown key - BitDecomposed::decompose( - u32::BITS - (MAX_BREAKDOWN_KEY - 1).leading_zeros(), - |i| Gf2::try_from((u128::from(bk) >> i) & 1).unwrap(), - ), - // credit - Fp32BitPrime::truncate_from(credit), - ) - }), - |ctx, shares| async move { - let (bk_shares, credit_shares): (Vec<_>, Vec<_>) = shares.into_iter().unzip(); - let validator = ctx.validator::(); - let (_validator, output) = aggregate_credit( - validator, // note: not upgrading any inputs, so semi-honest only. - bk_shares.into_iter(), - credit_shares.into_iter(), - MAX_BREAKDOWN_KEY, - ) - .await - .unwrap(); - output - }, - ) - .await - .reconstruct(); - assert_eq!(result, EXPECTED); - } -} diff --git a/ipa-core/src/protocol/attribution/apply_attribution_window.rs b/ipa-core/src/protocol/attribution/apply_attribution_window.rs deleted file mode 100644 index 3bfef6c12..000000000 --- a/ipa-core/src/protocol/attribution/apply_attribution_window.rs +++ /dev/null @@ -1,297 +0,0 @@ -use std::{ - iter::{repeat, zip}, - num::NonZeroU32, -}; - -use ipa_macros::Step; - -use super::{ - do_the_binary_tree_thing, - input::{ApplyAttributionWindowInputRow, ApplyAttributionWindowOutputRow}, -}; -use crate::{ - error::Error, - ff::{Field, PrimeField}, - protocol::{ - boolean::{greater_than_constant, random_bits_generator::RandomBitsGenerator}, - context::{Context, UpgradedContext}, - BasicProtocols, RecordId, - }, - secret_sharing::{Linear as LinearSecretSharing, LinearRefOps}, -}; - -/// This protocol applies the specified attribution window to trigger events. All trigger values of -/// events that are outside the window will be replaced with 0, hence will not be attributed to -/// corresponding source events in the later aggregation stages. -/// -/// # Errors -/// Fails if sub-protocols fails. -#[tracing::instrument(name = "apply_window", skip_all)] -pub async fn apply_attribution_window( - ctx: C, - input: &[ApplyAttributionWindowInputRow], - stop_bits: &[S], - attribution_window_seconds: Option, -) -> Result>, Error> -where - F: PrimeField, - C: UpgradedContext, - S: LinearSecretSharing + BasicProtocols + 'static, - for<'a> &'a S: LinearRefOps<'a, S, F>, -{ - if let Some(attribution_window_seconds) = attribution_window_seconds { - let mut t_deltas = prefix_sum_time_deltas(&ctx, input, stop_bits).await?; - - let result = zero_out_expired_trigger_values( - &ctx, - input, - &mut t_deltas, - attribution_window_seconds.get(), - ) - .await?; - - Ok(input - .iter() - .zip(result) - .map(|(x, (active_bit, value))| { - ApplyAttributionWindowOutputRow::new( - x.is_trigger_report.clone(), - x.helper_bit.clone(), - active_bit, - value, - ) - }) - .collect::>()) - } else { - // attribution window is not set, skip the entire protocol - Ok(input - .iter() - .map(|x| { - ApplyAttributionWindowOutputRow::new( - x.is_trigger_report.clone(), - x.helper_bit.clone(), - S::ZERO, - x.trigger_value.clone(), - ) - }) - .collect::>()) - } -} - -/// Computes time deltas from each trigger event to its nearest matching source event. -/// -/// # Errors -/// Fails if the multiplication fails. -async fn prefix_sum_time_deltas( - ctx: &C, - input: &[ApplyAttributionWindowInputRow], - stop_bits: &[T], -) -> Result, Error> -where - F: Field, - C: Context, - T: LinearSecretSharing + BasicProtocols, - for<'a> &'a T: LinearRefOps<'a, T, F>, -{ - let num_rows = input.len(); - - // First, create a vector of timedeltas. This vector contains non-zero values only for - // rows with `stop_bit` = 1, meaning that the row is a trigger event, and has the same - // match key as the event one above. - let t_delta_context = ctx - .narrow(&Step::InitializeTimeDelta) - .set_total_records(num_rows - 1); - let mut t_delta = std::iter::once(T::ZERO) - .chain( - ctx.try_join( - zip(input.iter(), input.iter().skip(1)) - .zip(stop_bits) - .enumerate() - .map(|(i, ((prev, curr), b))| { - let c = t_delta_context.clone(); - let record_id = RecordId::from(i); - let delta = &curr.timestamp - &prev.timestamp; - async move { delta.multiply(b, c, record_id).await } - }), - ) - .await?, - ) - .rev() - .collect::>(); - - // TODO: Change the input/output to iterators - do_the_binary_tree_thing( - ctx.clone(), - stop_bits.iter().rev().cloned().collect(), - &mut t_delta, - ) - .await?; - t_delta.reverse(); - - Ok(t_delta) -} - -/// Creates a vector of tuples. The right elements are trigger values where values are -/// set to `0` if the time delta from their nearest source event exceed the specified -/// attribution window cap. Each of the left elements is a share of {0, 1} indicating -/// whether the corresponding credit is valid (1) or has been zero'ed-out (0). -/// -/// This protocol executes the bit-decomposition protocol in order to compare shares -/// of time deltas in `F`. -/// -/// # Errors -/// Fails if the bit-decomposition, bitwise comparison, or multiplication fails. -async fn zero_out_expired_trigger_values( - ctx: &C, - input: &[ApplyAttributionWindowInputRow], - time_delta: &mut [S], - cap: u32, -) -> Result, Error> -where - F: PrimeField, - C: UpgradedContext, - S: LinearSecretSharing + BasicProtocols, - for<'a> &'a S: LinearRefOps<'a, S, F>, -{ - let ctx = ctx.set_total_records(input.len()); - let random_bits_generator = - RandomBitsGenerator::new(ctx.narrow(&Step::RandomBitsForBitDecomposition)); - let rbg = &random_bits_generator; - let cmp_ctx = ctx.narrow(&Step::TimeDeltaLessThanCap); - let mul_ctx = ctx.narrow(&Step::CompareBitTimesTriggerValue); - - // Compare the accumulated timestamp deltas with the specified attribution window - // cap value, and zero-out trigger event values that exceed the cap. - ctx.try_join( - zip(input, time_delta) - .zip(repeat(S::share_known_value(&ctx, F::ONE))) - .enumerate() - .map(|(i, ((row, delta), one))| { - let c1 = cmp_ctx.clone(); - let c2 = mul_ctx.clone(); - let record_id = RecordId::from(i); - - async move { - let compare_bit = - one - &greater_than_constant(c1, record_id, rbg, delta, cap.into()).await?; - let new_value = row - .trigger_value - .multiply(&compare_bit, c2, record_id) - .await?; - Ok((compare_bit, new_value)) - } - }), - ) - .await -} - -#[derive(Step)] -pub(crate) enum Step { - InitializeTimeDelta, - RandomBitsForBitDecomposition, - TimeDeltaLessThanCap, - CompareBitTimesTriggerValue, -} - -#[cfg(all(test, unit_test))] -mod tests { - use std::{iter::zip, num::NonZeroU32}; - - use crate::{ - attribution_window_test_input, - ff::{Field, Fp32BitPrime}, - protocol::{ - attribution::{ - apply_attribution_window::apply_attribution_window, - compute_stop_bits, - input::{ApplyAttributionWindowInputRow, ApplyAttributionWindowOutputRow}, - }, - context::{UpgradableContext, Validator}, - BreakdownKey, MatchKey, - }, - secret_sharing::replicated::semi_honest::AdditiveShare as Replicated, - test_fixture::{input::GenericReportTestInput, Reconstruct, Runner, TestWorld}, - }; - - #[tokio::test] - pub async fn attribution_window() { - const EXPECTED_TRIGGER_VALUES: &[u128; 23] = &[ - 0, 0, 0, 10, 2, 1, 5, 1, 0, 0, 0, 10, 0, 3, 12, 0, 0, 6, 4, 0, 6, 1, 0, - ]; - const EXPECTED_ACTIVE_BITS: &[u128; 23] = &[ - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - ]; - const ATTRIBUTION_WINDOW: Option = NonZeroU32::new(600); - let input: Vec> = attribution_window_test_input!( - [ - { timestamp: 500, is_trigger_report: 0, helper_bit: 0, breakdown_key: 3, credit: 0 }, // delta: 0 - { timestamp: 100, is_trigger_report: 0, helper_bit: 0, breakdown_key: 4, credit: 0 }, // delta: 0 reset - { timestamp: 130, is_trigger_report: 0, helper_bit: 1, breakdown_key: 4, credit: 0 }, // delta: 0 reset - { timestamp: 150, is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 10 },// delta: 20 - { timestamp: 250, is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 2 }, // delta: 120 - { timestamp: 310, is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 1 }, // delta: 180 - { timestamp: 420, is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 5 }, // delta: 290 - { timestamp: 540, is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 1 }, // delta: 410 - { timestamp: 890, is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 3 }, // delta: 760 - { timestamp: 920, is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 5 }, // delta: 790 - { timestamp: 110, is_trigger_report: 0, helper_bit: 0, breakdown_key: 1, credit: 0 }, // delta: 0 reset - { timestamp: 310, is_trigger_report: 1, helper_bit: 0, breakdown_key: 0, credit: 10 },// delta: n/a - { timestamp: 270, is_trigger_report: 0, helper_bit: 0, breakdown_key: 2, credit: 0 }, // delta: 0 reset - { timestamp: 390, is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 3 }, // delta: 120 - { timestamp: 420, is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 12 },// delta: 150 - { timestamp: 530, is_trigger_report: 0, helper_bit: 1, breakdown_key: 2, credit: 0 }, // delta: 0 reset - { timestamp: 790, is_trigger_report: 0, helper_bit: 1, breakdown_key: 2, credit: 0 }, // delta: 0 reset - { timestamp: 990, is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 6 }, // delta: 200 - { timestamp: 1100, is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 4 },// delta: 310 - { timestamp: 1200, is_trigger_report: 0, helper_bit: 1, breakdown_key: 5, credit: 0 },// delta: 0 reset - { timestamp: 1490, is_trigger_report: 1, helper_bit: 1, breakdown_key: 5, credit: 6 },// delta: 290 - { timestamp: 1800, is_trigger_report: 1, helper_bit: 1, breakdown_key: 5, credit: 1 },// delta: 600 - { timestamp: 1960, is_trigger_report: 1, helper_bit: 1, breakdown_key: 5, credit: 3 },// delta: 760 - ]; - (Fp32BitPrime, MatchKey, BreakdownKey) - ); - let input_len = input.len(); - - let world = TestWorld::default(); - let result: [Vec>>; 3] = world - .semi_honest( - input.into_iter(), - |ctx, input: Vec>>| async move { - let validator = ctx.validator(); - let ctx = validator.context(); - let (itb, hb): (Vec<_>, Vec<_>) = input.iter().map(|x| (x.is_trigger_report.clone(), x.helper_bit.clone())).unzip(); - let stop_bits = compute_stop_bits(ctx.clone(), &itb, &hb).await.unwrap().collect::>(); - - apply_attribution_window(ctx, &input, &stop_bits, ATTRIBUTION_WINDOW) - .await - .unwrap() - }, - ) - .await; - - assert_eq!(result[0].len(), input_len); - assert_eq!(result[1].len(), input_len); - assert_eq!(result[2].len(), input_len); - assert_eq!(result[0].len(), EXPECTED_TRIGGER_VALUES.len()); - - for (i, (value, active_bit)) in - zip(EXPECTED_TRIGGER_VALUES, EXPECTED_ACTIVE_BITS).enumerate() - { - let v = [ - &result[0][i].trigger_value, - &result[1][i].trigger_value, - &result[2][i].trigger_value, - ] - .reconstruct(); - let b = [ - &result[0][i].active_bit, - &result[1][i].active_bit, - &result[2][i].active_bit, - ] - .reconstruct(); - - assert_eq!(v.as_u128(), *value); - assert_eq!(b.as_u128(), *active_bit); - } - } -} diff --git a/ipa-core/src/protocol/attribution/credit_capping.rs b/ipa-core/src/protocol/attribution/credit_capping.rs deleted file mode 100644 index 9d4c0f120..000000000 --- a/ipa-core/src/protocol/attribution/credit_capping.rs +++ /dev/null @@ -1,597 +0,0 @@ -use std::iter::{repeat, zip}; - -use futures::{ - stream::{iter, once}, - StreamExt, TryStreamExt, -}; -use ipa_macros::Step; - -use super::{do_the_binary_tree_thing, input::CreditCappingInputRow, prefix_or_binary_tree_style}; -use crate::{ - error::Error, - ff::{Field, PrimeField}, - protocol::{ - basics::{if_else, SecureMul}, - boolean::{greater_than_constant, random_bits_generator::RandomBitsGenerator}, - context::{Context, UpgradedContext}, - BasicProtocols, RecordId, - }, - secret_sharing::{Linear as LinearSecretSharing, LinearRefOps}, - seq_join::seq_join, -}; - -/// User-level credit capping protocol. -/// -/// ## Errors -/// Fails if the multiplication protocol fails, or if the `cap` is larger than -/// 1/2 of the prime number. -#[tracing::instrument(name = "user_capping", skip_all)] -pub async fn credit_capping( - ctx: C, - input: &[CreditCappingInputRow], - cap: u32, -) -> Result, Error> -where - F: PrimeField, - C: UpgradedContext, - S: LinearSecretSharing + BasicProtocols, - for<'a> &'a S: LinearRefOps<'a, S, F>, -{ - if cap == 1 { - return Ok(credit_capping_max_one(ctx, input) - .await? - .collect::>()); - } - let input_len = input.len(); - - if (u128::from(cap) * 2) >= F::PRIME.into() { - return Err(crate::error::Error::InvalidQueryParameter(format!( - "The cap {cap} must be less than 1/2 of the prime modulus to make overflow detectable, and propagable." - ).into())); - } - - // - // Step 1. Initialize a local vector for the capping computation. - // - // * `original_credits` will have credit values of only source events - // - let original_credits = mask_source_credits(input, ctx.set_total_records(input_len)).await?; - - // - // Step 2. Cap each report's value to `cap` - // - // Returns a vector of report values that are capped at `cap`. The cap is known to be - // less than 1/2 of the prime number used for the field. - // - // This initial capping step is applied to each report value individually, rather than - // to the prefixed sum of matching report values in the later steps. This is required to - // detect a possible overflow in the `credit_prefix_sum` step, which leads to an individual's - // contribution to exceed the cap. (issue #520) - // - // This step ensures that the prefixed summed report values computed in `credit_prefix_sum` - // step will have at least one row with a value that is larger than the cap and less than - // the prime number, if overflows were to happen. - // - // For example, if the prime number is 31 and the cap is 15, then the reversed prefixed sum - // of [].., 15, 15, 15] will be [..., 15, 30, 15]. Then `is_credit_larger_than_cap` step will - // catch that the second to last row is larger than the cap. - // - // This step alone does not prevent the overflow from happening, but if we compute the - // reversed prefix-OR of the `is_credit_larger_than_cap` step, then we can apply the cap to - // all rows that precede the most recent row with a value larger than the cap. - // - let capped_credits = report_level_capping(ctx.clone(), &original_credits, cap).await?; - - // - // Step 3. Compute user-level reversed prefix-sums - // - let prefix_summed_credits = - credit_prefix_sum(ctx.clone(), input, capped_credits.iter()).await?; - - // - // Step 4. Compute `prefix_summed_credits` >? `cap` - // - // `exceeds_cap_bits` = 1 if `prefix_summed_credits` > `cap` - // - let exceeds_cap_bits = - is_credit_larger_than_cap(ctx.clone(), &prefix_summed_credits, cap).await?; - - // - // Step 5. Compute the reversed prefix-OR of `exceeds_cap_bits` - // - // - // This step ensures that once the comparison "credit > cap" is true, then the true value - // will be propagated to all the rows that precede the row with the true value. The next - // step `compute_final_credits` will then check these bits and set the credit to zero. - // - let prefix_or_exceeds_cap_bits = - propagate_overflow_detection(ctx.clone(), input, exceeds_cap_bits).await?; - - // - // Step 6. Compute user-level capped credits. - // - // This protocol caps the user-level credits from the oldest report to the newest report, - // meaning that older reports will be capped if the user's contribution has already exceeded - // the cap. We can change the logic to do the opposite, i.e. cap the newest reports first, by - // reversing the order of the input. - // - compute_final_credits( - ctx, - input, - &prefix_summed_credits, - &prefix_or_exceeds_cap_bits, - &capped_credits, - cap, - ) - .await -} - -/// -/// User-level credit capping protocol that is run when `PER_USER_CAP == 1` -/// -/// In this mode, `trigger_value` is completely ignored. Each trigger event counts as just one. -/// -/// Since each user can *at most* contribute just one, if there are multiple attributed conversions -/// from the same `match key`, we need some way of deciding which one to keep. This current implementation -/// only keeps the *last attributed conversion*. -/// This is implemented by virtue of computing a prefix-OR of all of the attributed conversions from -/// a given `match-key`, starting at each row. -/// In the final step, each row is compared with the prefix-OR of the following row. If the following row -/// is from the same `match-key`, and the prefix-OR indicates that there is *at least one* attributed conversion -/// in the following rows, then the contribution is "capped", which in this context means set to zero. -/// In this way, only the final attributed conversion will not be "capped". -async fn credit_capping_max_one( - ctx: C, - input: &[CreditCappingInputRow], -) -> Result + '_, Error> -where - F: Field, - C: Context, - S: LinearSecretSharing + BasicProtocols, -{ - let input_len = input.len(); - - let uncapped_credits = mask_source_credits(input, ctx.set_total_records(input_len)).await?; - - let helper_bits = input - .iter() - .skip(1) - .map(|x| x.helper_bit.clone()) - .collect::>(); - - let prefix_ors = - prefix_or_binary_tree_style(ctx.clone(), &helper_bits[1..], &uncapped_credits[1..], true) - .await?; - - let prefix_or_times_helper_bit_ctx = ctx - .narrow(&Step::PrefixOrTimesHelperBit) - .set_total_records(input.len() - 1); - let ever_any_subsequent_credit = ctx - .try_join(prefix_ors.iter().zip(helper_bits.iter()).enumerate().map( - |(i, (prefix_or, helper_bit))| { - let record_id = RecordId::from(i); - let c = prefix_or_times_helper_bit_ctx.clone(); - async move { prefix_or.multiply(helper_bit, c, record_id).await } - }, - )) - .await?; - - let potentially_cap_ctx = ctx - .narrow(&Step::IfCurrentExceedsCapOrElse) - .set_total_records(input.len() - 1); - let capped_credits = ctx - .try_join( - uncapped_credits - .iter() - .zip(ever_any_subsequent_credit.iter()) - .enumerate() - .map(|(i, (uncapped_credit, any_subsequent_credit))| { - let record_id = RecordId::from(i); - let c = potentially_cap_ctx.clone(); - let one = S::share_known_value(&c, F::ONE); - async move { - uncapped_credit - .multiply(&(one - any_subsequent_credit), c, record_id) - .await - } - }), - ) - .await?; - - // Because the capping process produces fewer rows than the full list, - // we use the uncapped values for the remainder. - // This is safe because these rows cannot exceed the cap. - let capped_count = capped_credits.len(); - Ok(capped_credits - .into_iter() - .chain(uncapped_credits.into_iter().skip(capped_count))) -} - -async fn mask_source_credits( - input: &[CreditCappingInputRow], - ctx: C, -) -> Result, Error> -where - F: Field, - C: Context, - T: LinearSecretSharing + BasicProtocols, -{ - ctx.try_join( - input - .iter() - .zip(zip( - repeat(ctx.narrow(&Step::MaskSourceCredits)), - repeat(T::share_known_value(&ctx, F::ONE)), - )) - .enumerate() - .map(|(i, (x, (ctx, one)))| async move { - x.trigger_value - .multiply(&(one - &x.is_trigger_report), ctx, RecordId::from(i)) - .await - }), - ) - .await -} - -async fn report_level_capping( - ctx: C, - original_credits: &[S], - cap: u32, -) -> Result, Error> -where - F: PrimeField, - C: UpgradedContext, - S: LinearSecretSharing + BasicProtocols, - for<'a> &'a S: LinearRefOps<'a, S, F>, -{ - let share_of_cap = S::share_known_value(&ctx, F::truncate_from(cap)); - let cap_ref = &share_of_cap; - let exceeds_cap_bits = - is_credit_larger_than_cap(ctx.narrow(&Step::ReportLevelCapping), original_credits, cap) - .await?; - - let if_else_ctx = ctx - .narrow(&Step::IfReportCreditExceedsCapOrElse) - .set_total_records(original_credits.len()); - - ctx.try_join(zip(original_credits, exceeds_cap_bits.iter()).enumerate().map( - |(i, (original_credit, exceeds_cap_bit))| { - let record_id = RecordId::from(i); - let c = if_else_ctx.clone(); - async move { if_else(c, record_id, exceeds_cap_bit, cap_ref, original_credit).await } - }, - )) - .await -} - -async fn credit_prefix_sum<'a, F, C, T, I>( - ctx: C, - input: &[CreditCappingInputRow], - original_credits: I, -) -> Result, Error> -where - F: Field, - C: Context, - T: LinearSecretSharing + SecureMul + 'a, - I: Iterator, -{ - let helper_bits = input - .iter() - .skip(1) - .map(|x| x.helper_bit.clone()) - .collect::>(); - - let mut credits = original_credits.cloned().collect::>(); - - do_the_binary_tree_thing(ctx, helper_bits, &mut credits).await?; - - Ok(credits) -} - -async fn is_credit_larger_than_cap( - ctx: C, - prefix_summed_credits: &[S], - cap: u32, -) -> Result, Error> -where - F: PrimeField, - C: UpgradedContext, - S: LinearSecretSharing + BasicProtocols, - for<'a> &'a S: LinearRefOps<'a, S, F>, -{ - let ctx_ref = &ctx; - let ctx = ctx.set_total_records(prefix_summed_credits.len()); - let random_bits_generator = - RandomBitsGenerator::new(ctx.narrow(&Step::RandomBitsForComparison)); - let rbg = &random_bits_generator; - - ctx_ref - .try_join( - prefix_summed_credits - .iter() - .zip(zip(repeat(ctx), repeat(cap))) - .enumerate() - .map(|(i, (credit, (ctx, cap)))| { - greater_than_constant( - ctx.narrow(&Step::IsCapLessThanCurrentContribution), - RecordId::from(i), - rbg, - credit, - cap.into(), - ) - }), - ) - .await -} - -async fn propagate_overflow_detection( - ctx: C, - input: &[CreditCappingInputRow], - exceeds_cap_bits: Vec, -) -> Result, Error> -where - F: PrimeField, - C: UpgradedContext, - T: LinearSecretSharing + BasicProtocols, -{ - let helper_bits = input - .iter() - .map(|x| x.helper_bit.clone()) - .collect::>(); - - prefix_or_binary_tree_style( - ctx.narrow(&Step::PrefixOrCompareBits), - &helper_bits[1..], - &exceeds_cap_bits, - false, - ) - .await -} - -async fn compute_final_credits( - ctx: C, - input: &[CreditCappingInputRow], - prefix_summed_credits: &[T], - exceeds_cap_bits: &[T], - original_credits: &[T], - cap: u32, -) -> Result, Error> -where - F: Field, - C: Context, - T: LinearSecretSharing + BasicProtocols, - for<'a> &'a T: LinearRefOps<'a, T, F>, -{ - let num_rows = input.len(); - let cap_share = T::share_known_value(&ctx, F::try_from(cap.into()).unwrap()); - let cap = &cap_share; - - // This method implements the logic below: - // - // if current_credit_exceeds_cap { - // if next_event_has_same_match_key { - // if next_credit_exceeds_cap { - // 0 - // } else { - // cap - next_prefix_summed_credit - // } - // } else { - // cap - // } - // } else { - // current_credit - // } - - let capped = zip( - repeat(ctx.set_total_records(num_rows - 1)).enumerate(), - zip( - zip( - // Take the original credit at the current line - // and the prefix-summed credit at the next line. - zip(original_credits, &prefix_summed_credits[1..]), - // Then the exceeds cap bits on both lines. - exceeds_cap_bits.windows(2), - ), - // Get the helper bit from the next line. - input[1..].iter().map(|i| &i.helper_bit), - ), - ) - .map( - |( - (i, ctx), - ( - ((original_credit, next_prefix_summed_credit), exceeds_cap), - next_event_has_same_match_key, - ), - )| async move { - let record_id = RecordId::from(i); - let current_prefix_summed_credit_exceeds_cap = &exceeds_cap[0]; - let next_credit_exceeds_cap = &exceeds_cap[1]; - - let remaining_budget = if_else( - ctx.narrow(&Step::IfNextEventHasSameMatchKeyOrElse), - record_id, - next_event_has_same_match_key, - &if_else( - ctx.narrow(&Step::IfNextExceedsCapOrElse), - record_id, - next_credit_exceeds_cap, - &T::ZERO, - &(cap - next_prefix_summed_credit), - ) - .await?, - cap, - ) - .await?; - - let capped_credit = if_else( - ctx.narrow(&Step::IfCurrentExceedsCapOrElse), - record_id, - current_prefix_summed_credit_exceeds_cap, - &remaining_budget, - original_credit, - ) - .await?; - - Ok::<_, Error>(capped_credit) - }, - ); - - let last = original_credits.last().ok_or(Error::Internal).cloned(); - - seq_join(ctx.active_work(), iter(capped)) - .chain(once(async { last })) - .try_collect() - .await -} - -#[derive(Step)] -pub(crate) enum Step { - MaskSourceCredits, - ReportLevelCapping, - IfReportCreditExceedsCapOrElse, - RandomBitsForComparison, - IsCapLessThanCurrentContribution, - IfCurrentExceedsCapOrElse, - IfNextExceedsCapOrElse, - IfNextEventHasSameMatchKeyOrElse, - PrefixOrTimesHelperBit, - PrefixOrCompareBits, -} - -#[cfg(all(test, unit_test))] -mod tests { - use crate::{ - credit_capping_test_input, - ff::{Field, Fp32BitPrime, PrimeField}, - protocol::{ - attribution::{credit_capping::credit_capping, input::CreditCappingInputRow}, - context::{UpgradableContext, Validator}, - BreakdownKey, MatchKey, - }, - secret_sharing::replicated::semi_honest::AdditiveShare as Replicated, - test_fixture::{input::GenericReportTestInput, Reconstruct, Runner, TestWorld}, - }; - - async fn run_credit_capping_test( - input: Vec>, - cap: u32, - ) -> [Vec>; 3] { - let world = TestWorld::default(); - world - .semi_honest( - input.into_iter(), - |ctx, input: Vec>>| async move { - let validator = ctx.validator(); // We're not running validation for this in this case. - let ctx = validator.context(); - credit_capping(ctx, &input, cap).await.unwrap() - }, - ) - .await - } - - #[tokio::test] - pub async fn basic() { - const CAP: u32 = 18; - const EXPECTED: &[u128; 19] = &[0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 10, 0, 0, 6, 0]; - - let input: Vec> = credit_capping_test_input!( - [ - { is_trigger_report: 0, helper_bit: 0, breakdown_key: 3, credit: 0 }, - { is_trigger_report: 0, helper_bit: 0, breakdown_key: 4, credit: 0 }, - { is_trigger_report: 0, helper_bit: 1, breakdown_key: 4, credit: 19 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 19 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 9 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 7 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 6 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 1 }, - { is_trigger_report: 0, helper_bit: 0, breakdown_key: 1, credit: 0 }, - { is_trigger_report: 1, helper_bit: 0, breakdown_key: 0, credit: 10 }, - { is_trigger_report: 0, helper_bit: 0, breakdown_key: 2, credit: 15 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 15 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 12 }, - { is_trigger_report: 0, helper_bit: 1, breakdown_key: 2, credit: 0 }, - { is_trigger_report: 0, helper_bit: 1, breakdown_key: 2, credit: 10 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 10 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 4 }, - { is_trigger_report: 0, helper_bit: 1, breakdown_key: 5, credit: 6 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 6 }, - ]; - (Fp32BitPrime, MatchKey, BreakdownKey) - ); - - let result = run_credit_capping_test(input, CAP).await; - let result: Vec = result.reconstruct(); - let result = result.into_iter().map(|v| v.as_u128()).collect::>(); - assert_eq!(result, EXPECTED); - } - - #[tokio::test] - #[should_panic( - expected = "must be less than 1/2 of the prime modulus to make overflow detectable, and propagable" - )] - pub async fn invalid_cap_value() { - // Input doesn't matter here, since the test should panic before the computation starts. - let input: Vec> = credit_capping_test_input!( - [ - { is_trigger_report: 0, helper_bit: 0, breakdown_key: 1, credit: 2 }, - ]; - (Fp32BitPrime, MatchKey, BreakdownKey) - ); - - // This should panic because the cap value is greater than the (prime / 2). - run_credit_capping_test(input, (Fp32BitPrime::PRIME / 2) + 1).await; - } - - // This test case is to test where `exceeds_cap_bit` yields alternating {0, 1} bits. - // See #520 for more details. - #[tokio::test] - pub async fn wrapping_add_attack_case_1() { - const MINUS_TWO: u32 = Fp32BitPrime::PRIME - 2; - const CAP: u32 = 2; - const EXPECTED: &[u128; 8] = &[0, 0, 0, 0, 0, 0, 2, 0]; - - let input: Vec> = credit_capping_test_input!( - [ - { is_trigger_report: 0, helper_bit: 0, breakdown_key: 1, credit: 2 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 2 }, - { is_trigger_report: 0, helper_bit: 1, breakdown_key: 1, credit: MINUS_TWO }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: MINUS_TWO }, - { is_trigger_report: 0, helper_bit: 1, breakdown_key: 1, credit: 2 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 2 }, - { is_trigger_report: 0, helper_bit: 1, breakdown_key: 1, credit: MINUS_TWO }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: MINUS_TWO }, - ]; - (Fp32BitPrime, MatchKey, BreakdownKey) - ); - - let result = run_credit_capping_test(input, CAP).await; - assert_eq!(result.reconstruct(), EXPECTED); - } - - // This test case is to test where `exceeds_cap_bit` yields all 0's. - // See #520 for more details. - #[tokio::test] - pub async fn wrapping_add_attack_case_2() { - const MINUS_TWO: u32 = Fp32BitPrime::PRIME - 2; - const CAP: u32 = 2; - const EXPECTED: &[u128; 8] = &[0, 0, 0, 0, 0, 0, 2, 0]; - - let input: Vec> = credit_capping_test_input!( - [ - { is_trigger_report: 0, helper_bit: 0, breakdown_key: 1, credit: MINUS_TWO }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: MINUS_TWO }, - { is_trigger_report: 0, helper_bit: 1, breakdown_key: 1, credit: 2 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 2 }, - { is_trigger_report: 0, helper_bit: 1, breakdown_key: 1, credit: MINUS_TWO }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: MINUS_TWO }, - { is_trigger_report: 0, helper_bit: 1, breakdown_key: 1, credit: 2 }, - { is_trigger_report: 1, helper_bit: 1, breakdown_key: 0, credit: 2 }, - ]; - (Fp32BitPrime, MatchKey, BreakdownKey) - ); - - let result = run_credit_capping_test(input, CAP).await; - assert_eq!(result.reconstruct(), EXPECTED); - } -} diff --git a/ipa-core/src/protocol/attribution/input.rs b/ipa-core/src/protocol/attribution/input.rs deleted file mode 100644 index 18d056027..000000000 --- a/ipa-core/src/protocol/attribution/input.rs +++ /dev/null @@ -1,172 +0,0 @@ -use std::marker::PhantomData; - -#[cfg(test)] -use async_trait::async_trait; -#[cfg(test)] -use futures::future::try_join4; - -#[cfg(test)] -use crate::{ - error::Error, - helpers::Role, - protocol::{basics::Reshare, context::Context, RecordId}, -}; -use crate::{ff::Field, secret_sharing::Linear as LinearSecretSharing}; - -// -// `apply_attribution_window` protocol -// -#[derive(Debug)] -pub struct ApplyAttributionWindowInputRow> { - pub timestamp: S, - pub is_trigger_report: S, - pub helper_bit: S, - pub trigger_value: S, - _marker: PhantomData, -} - -impl> ApplyAttributionWindowInputRow { - pub fn new(timestamp: S, is_trigger_report: S, helper_bit: S, trigger_value: S) -> Self { - Self { - timestamp, - is_trigger_report, - helper_bit, - trigger_value, - _marker: PhantomData, - } - } -} - -pub type ApplyAttributionWindowOutputRow = AccumulateCreditInputRow; - -// -// `accumulate_credit` protocol -// - -#[derive(Debug)] -pub struct AccumulateCreditInputRow> { - pub is_trigger_report: S, - pub helper_bit: S, - pub active_bit: S, - pub trigger_value: S, - _marker: PhantomData, -} - -impl> AccumulateCreditInputRow { - pub fn new(is_trigger_report: S, helper_bit: S, active_bit: S, trigger_value: S) -> Self { - Self { - is_trigger_report, - helper_bit, - active_bit, - trigger_value, - _marker: PhantomData, - } - } -} - -#[cfg(test)] -#[async_trait] -impl Reshare for AccumulateCreditInputRow -where - F: Field, - S: LinearSecretSharing + Reshare, - C: Context, -{ - async fn reshare<'fut>( - &self, - ctx: C, - record_id: RecordId, - to_helper: Role, - ) -> Result - where - C: 'fut, - { - let f_trigger_bit = self.is_trigger_report.reshare( - ctx.narrow(&AttributionResharableStep::IsTriggerReport), - record_id, - to_helper, - ); - let f_helper_bit = self.helper_bit.reshare( - ctx.narrow(&AttributionResharableStep::HelperBit), - record_id, - to_helper, - ); - let f_value = self.trigger_value.reshare( - ctx.narrow(&AttributionResharableStep::TriggerValue), - record_id, - to_helper, - ); - let f_active_bit = self.active_bit.reshare( - ctx.narrow(&AttributionResharableStep::ActiveBit), - record_id, - to_helper, - ); - - let (is_trigger_report, helper_bit, trigger_value, active_bit) = - try_join4(f_trigger_bit, f_helper_bit, f_value, f_active_bit).await?; - - Ok(AccumulateCreditInputRow::new( - is_trigger_report, - helper_bit, - active_bit, - trigger_value, - )) - } -} - -pub type AccumulateCreditOutputRow = CreditCappingInputRow; - -// -// `credit_capping` protocol -// -#[derive(Debug)] -pub struct CreditCappingInputRow> { - pub is_trigger_report: T, - pub helper_bit: T, - pub trigger_value: T, - _marker: PhantomData, -} - -impl> CreditCappingInputRow { - pub fn new(is_trigger_report: T, helper_bit: T, trigger_value: T) -> Self { - Self { - is_trigger_report, - helper_bit, - trigger_value, - _marker: PhantomData, - } - } -} - -// `Resharable` trait of the `AttributionResharableStep` is only used for testing. -// For these steps that are not executed as a part of the main protocols, we can't -// use `#[derive(Step)]` since the steps do not appear in `steps.txt`. Hide these -// steps behind `test` and manually implement AsRef and `NoCommsStep` for them. -#[cfg(test)] -pub(crate) enum AttributionResharableStep { - IsTriggerReport, - HelperBit, - TriggerValue, - ActiveBit, -} -#[cfg(test)] -impl crate::protocol::step::Step for AttributionResharableStep {} -#[cfg(test)] -impl AsRef for AttributionResharableStep { - fn as_ref(&self) -> &'static str { - match self { - AttributionResharableStep::IsTriggerReport => "is_trigger_report", - AttributionResharableStep::HelperBit => "helper_bit", - AttributionResharableStep::TriggerValue => "trigger_value", - AttributionResharableStep::ActiveBit => "active_bit", - } - } -} -#[cfg(all(feature = "compact-gate", test))] -impl crate::protocol::step::StepNarrow - for crate::protocol::step::Compact -{ - fn narrow(&self, _step: &AttributionResharableStep) -> Self { - unimplemented!("compact gate is not supported in unit tests") - } -} diff --git a/ipa-core/src/protocol/attribution/mod.rs b/ipa-core/src/protocol/attribution/mod.rs deleted file mode 100644 index d3a117da5..000000000 --- a/ipa-core/src/protocol/attribution/mod.rs +++ /dev/null @@ -1,449 +0,0 @@ -pub mod accumulate_credit; -pub mod aggregate_credit; -pub mod apply_attribution_window; -pub mod credit_capping; -pub mod input; - -use std::iter::{once as iter_once, zip}; - -use futures::{ - future::try_join, - stream::{iter as stream_iter, TryStreamExt}, -}; -use ipa_macros::Step; - -use self::{ - accumulate_credit::accumulate_credit, aggregate_credit::aggregate_credit, - apply_attribution_window::apply_attribution_window, credit_capping::credit_capping, - input::ApplyAttributionWindowInputRow, -}; -use crate::{ - error::Error, - ff::{Field, Gf2, PrimeField, Serializable}, - helpers::query::IpaQueryConfig, - protocol::{ - basics::SecureMul, - boolean::{bitwise_equal::bitwise_equal_gf2, or::or}, - context::{Context, UpgradableContext, UpgradedContext, Validator}, - ipa::{ArithmeticallySharedIPAInputs, BinarySharedIPAInputs}, - modulus_conversion::convert_bits, - sort::generate_permutation::ShuffledPermutationWrapper, - BasicProtocols, RecordId, - }, - secret_sharing::{ - replicated::{ - malicious::{DowngradeMalicious, ExtendableField}, - semi_honest::AdditiveShare as Replicated, - }, - Linear as LinearSecretSharing, LinearRefOps, - }, - seq_join::assert_send, -}; - -/// Performs a set of attribution protocols on the sorted IPA input. -/// -/// # Errors -/// propagates errors from multiplications -#[tracing::instrument(name = "attribute", skip_all)] -pub async fn secure_attribution( - validator: V, - binary_validator: VB, - arithmetically_shared_values: Vec>, - binary_shared_values: Vec>, - config: IpaQueryConfig, -) -> Result>, Error> -where - V: Validator, - VB: Validator, - C: UpgradableContext = V>, - C::UpgradedContext: UpgradedContext, - S: LinearSecretSharing - + BasicProtocols, F> - + Serializable - + DowngradeMalicious> - + 'static, - for<'a> &'a S: LinearRefOps<'a, S, F>, - C::UpgradedContext: UpgradedContext + Context, - SB: LinearSecretSharing - + BasicProtocols, Gf2> - + DowngradeMalicious> - + 'static, - for<'a> &'a SB: LinearRefOps<'a, SB, Gf2>, - F: PrimeField + ExtendableField, - ShuffledPermutationWrapper>: DowngradeMalicious>, -{ - let row_count = arithmetically_shared_values.len(); - assert_eq!(row_count, binary_shared_values.len()); - let m_ctx = validator.context(); - let m_binary_ctx = binary_validator.context(); - - // There are one fewer helper bits than there are input rows. Same for stop bits. - // This propagates throughout aggregation (all the code understands this). - // And a breakdown for the last row isn't necessary because an impression on that row can't convert. - // So we drop the last breakdown key right away. - let helper_bits_gf2 = compute_helper_bits_gf2(m_binary_ctx, &binary_shared_values).await?; - let breakdown_key_bits_gf2: Vec<_> = binary_shared_values - .iter() - .map(|x| x.breakdown_key.clone()) - .take(row_count - 1) - .collect(); - - let (validated_helper_bits_gf2, validated_breakdown_key_bits_gf2) = binary_validator - .validate((helper_bits_gf2, breakdown_key_bits_gf2)) - .await?; - - let convert_ctx = m_ctx - .narrow(&AttributionStep::ConvertHelperBits) - .set_total_records(validated_helper_bits_gf2.len()); - let helper_bits = convert_bits(convert_ctx, stream_iter(validated_helper_bits_gf2), 0..1) - .map_ok(|b| b.into_iter().next().unwrap()) // TODO: simplify single-bit conversion - .try_collect::>() - .await?; - - let is_trigger_bits = arithmetically_shared_values - .iter() - .map(|x| x.is_trigger_bit.clone()) - .collect::>(); - let stop_bits = compute_stop_bits(m_ctx.clone(), &is_trigger_bits, &helper_bits) - .await? - .collect::>(); - - // Semantically, `helper_bit` indicates if the preceding row has the same value of `match_key`. - // For the first row, this cannot be the case as there is no preceding row, so we just provide a zero. - debug_assert_eq!(arithmetically_shared_values.len(), helper_bits.len() + 1); - let attribution_input_rows = zip( - arithmetically_shared_values, - iter_once(S::ZERO).chain(helper_bits), - ) - .map(|(arithmetic, hb)| { - ApplyAttributionWindowInputRow::new( - arithmetic.timestamp, - arithmetic.is_trigger_bit, - hb, - arithmetic.trigger_value, - ) - }) - .collect::>(); - - let windowed_reports = apply_attribution_window( - m_ctx.narrow(&AttributionStep::ApplyAttributionWindow), - &attribution_input_rows, - &stop_bits, - config.attribution_window_seconds, - ) - .await?; - - let accumulated_credits = accumulate_credit( - m_ctx.narrow(&AttributionStep::AccumulateCredit), - &windowed_reports, - &stop_bits, - config.per_user_credit_cap, - config.attribution_window_seconds, - ) - .await?; - - let user_capped_credits = credit_capping( - m_ctx.narrow(&AttributionStep::PerformUserCapping), - &accumulated_credits, - config.per_user_credit_cap, - ) - .await?; - - let (validator, output) = aggregate_credit( - validator, - validated_breakdown_key_bits_gf2.into_iter(), - user_capped_credits.into_iter(), - config.max_breakdown_key, - ) - .await?; - - //Validate before returning the result to the report collector - validator.validate(output).await -} - -#[derive(Step)] -pub(crate) enum AttributionStep { - ConvertHelperBits, - ApplyAttributionWindow, - AccumulateCredit, - PerformUserCapping, -} - -/// -/// Computes a "prefix-OR" operation starting on each element in the list. -/// Stops as soon as `helper_bits` indicates the following rows are not from -/// the same `match key`. -/// -/// `should_add_on_first_iteration` is a performance optimization. -/// If the caller has foreknowledge that there will never be any two adjacent -/// rows, *both* containing a 1, then it is safe to pass `true`, which will -/// simply add values on the first iteration (thereby saving one multiplication -/// per row). If the caller does not know of any such guarantee, `false` should -/// be passed. -/// -/// ## Errors -/// Fails if the multiplication protocol fails. -/// -/// ## Panics -/// Nah, it doesn't. -/// -pub async fn prefix_or_binary_tree_style( - ctx: C, - stop_bits: &[S], - uncapped_credits: &[S], - should_add_on_first_iteration: bool, -) -> Result, Error> -where - F: Field, - C: Context, - S: LinearSecretSharing + BasicProtocols, -{ - assert_eq!(stop_bits.len() + 1, uncapped_credits.len()); - - let num_rows = uncapped_credits.len(); - - let mut uncapped_credits = uncapped_credits.to_owned(); - - // This vector is updated in each iteration to help accumulate credits - // and determine when to stop accumulating. - let mut stop_bits = stop_bits.to_owned(); - - // Each loop the "step size" is doubled. This produces a "binary tree" like behavior - for (depth, step_size) in std::iter::successors(Some(1_usize), |prev| prev.checked_mul(2)) - .take_while(|&v| v < num_rows) - .enumerate() - { - let first_iteration = step_size == 1; - let end = num_rows - step_size; - let next_end = usize::saturating_sub(num_rows, 2 * step_size); - let depth_i_ctx = ctx.narrow(&InteractionPatternStep::from(depth)); - let new_credit_ctx = depth_i_ctx - .narrow(&Step::CurrentStopBitTimesSuccessorCredit) - .set_total_records(end); - let credit_or_ctx = depth_i_ctx - .narrow(&Step::CurrentCreditOrCreditUpdate) - .set_total_records(end); - let new_stop_bit_ctx = depth_i_ctx - .narrow(&Step::CurrentStopBitTimesSuccessorStopBit) - .set_total_records(next_end); - let mut credit_update_futures = Vec::with_capacity(end); - let mut stop_bit_futures = Vec::with_capacity(end); - - for i in 0..end { - let c1 = new_credit_ctx.clone(); - let c2 = new_stop_bit_ctx.clone(); - let c3 = credit_or_ctx.clone(); - let record_id = RecordId::from(i); - let current_stop_bit = &stop_bits[i]; - let sibling_credit = &uncapped_credits[i + step_size]; - let current_credit = &uncapped_credits[i]; - - credit_update_futures.push(async move { - let credit_update = current_stop_bit - .multiply(sibling_credit, c1, record_id) - .await?; - if first_iteration && should_add_on_first_iteration { - Ok(credit_update + current_credit) - } else { - or(c3, record_id, current_credit, &credit_update).await - } - }); - if i < next_end { - let sibling_stop_bit = &stop_bits[i + step_size]; - stop_bit_futures.push(async move { - current_stop_bit - .multiply(sibling_stop_bit, c2, record_id) - .await - }); - } - } - - let (stop_bit_updates, credit_updates) = try_join( - assert_send(ctx.try_join(stop_bit_futures)), - assert_send(ctx.try_join(credit_update_futures)), - ) - .await?; - - stop_bit_updates - .into_iter() - .enumerate() - .for_each(|(i, stop_bit_update)| { - stop_bits[i] = stop_bit_update; - }); - credit_updates - .into_iter() - .enumerate() - .for_each(|(i, credit_update)| { - uncapped_credits[i] = credit_update; - }); - } - Ok(uncapped_credits) -} - -/// -/// Computes `SUM(credits[i] through credits[i + n])` where `n` is the number of "matching rows", as indicated by the `helper_bits` -/// This result is saved as `credits\[i\]`. -/// -/// Helper bits should be a sharing of either `1` or `0` for each row, indicating if that row "matches" the row preceding it. -/// -/// ## Errors -/// Fails if the multiplication protocol fails. -/// -/// ## Panics -/// Nah, it doesn't. -/// -pub async fn do_the_binary_tree_thing( - ctx: C, - mut stop_bits: Vec, - values: &mut [S], -) -> Result<(), Error> -where - F: Field, - C: Context, - S: LinearSecretSharing + SecureMul, -{ - let num_rows = values.len(); - - // Each loop the "step size" is doubled. This produces a "binary tree" like behavior - for (depth, step_size) in std::iter::successors(Some(1_usize), |prev| prev.checked_mul(2)) - .take_while(|&v| v < num_rows) - .enumerate() - { - let end = num_rows - step_size; - let next_end = usize::saturating_sub(num_rows, 2 * step_size); - let depth_i_ctx = ctx.narrow(&InteractionPatternStep::from(depth)); - let new_value_ctx = depth_i_ctx - .narrow(&Step::CurrentStopBitTimesSuccessorCredit) - .set_total_records(end); - let new_stop_bit_ctx = depth_i_ctx - .narrow(&Step::CurrentStopBitTimesSuccessorStopBit) - .set_total_records(next_end); - let mut value_update_futures = Vec::with_capacity(end); - let mut stop_bit_futures = Vec::with_capacity(end); - - for i in 0..end { - let c1 = new_value_ctx.clone(); - let c2 = new_stop_bit_ctx.clone(); - let record_id = RecordId::from(i); - let current_stop_bit = &stop_bits[i]; - let sibling_value = &values[i + step_size]; - value_update_futures.push(async move { - current_stop_bit - .multiply(sibling_value, c1, record_id) - .await - }); - if i < next_end { - let sibling_stop_bit = &stop_bits[i + step_size]; - stop_bit_futures.push(async move { - current_stop_bit - .multiply(sibling_stop_bit, c2, record_id) - .await - }); - } - } - - let (stop_bit_updates, value_updates) = try_join( - assert_send(ctx.try_join(stop_bit_futures)), - assert_send(ctx.try_join(value_update_futures)), - ) - .await?; - - stop_bit_updates - .into_iter() - .enumerate() - .for_each(|(i, stop_bit_update)| { - stop_bits[i] = stop_bit_update; - }); - value_updates - .into_iter() - .enumerate() - .for_each(|(i, value_update)| { - values[i] += &value_update; - }); - } - Ok(()) -} - -/// Stop Bits are boolean values (1 or 0) and indicate if values should continue to accumulate, or not. -/// In the case of attribution, multiple trigger reports might all be attributed to a single source -/// report in the case that there is a source report followed by multiple trigger reports, all having -/// the same value of match key. -/// -/// Stop bits are the AND (i.e., multiply) of "is trigger bit" and "helper bit" from the same row. -/// Note, the `helper_bits` provided here skip the first row as that value is known already. -/// The output of the function also skips this first row. -async fn compute_stop_bits( - ctx: C, - is_trigger_bits: &[S], - helper_bits: &[S], -) -> Result, Error> -where - F: Field, - S: LinearSecretSharing + BasicProtocols, - C: Context, -{ - let stop_bits_ctx = ctx - .narrow(&Step::ComputeStopBits) - .set_total_records(is_trigger_bits.len() - 1); - - // Note that the helper bits provided to this function skip the first row, - // so this functions starts from the second row of trigger bits. - let futures = zip(&is_trigger_bits[1..], helper_bits).enumerate().map( - |(i, (is_trigger_bit, helper_bit))| { - let c = stop_bits_ctx.clone(); - let record_id = RecordId::from(i); - async move { is_trigger_bit.multiply(helper_bit, c, record_id).await } - }, - ); - Ok(ctx.try_join(futures).await?.into_iter()) -} - -async fn compute_helper_bits_gf2( - ctx: C, - binary_shared_values: &[BinarySharedIPAInputs], -) -> Result, Error> -where - C: Context, - S: LinearSecretSharing + BasicProtocols, - for<'a> &'a S: LinearRefOps<'a, S, Gf2>, -{ - let narrowed_ctx = ctx - .narrow(&Step::ComputeHelperBits) - .set_total_records(binary_shared_values.len() - 1); - - ctx.try_join( - binary_shared_values - .windows(2) - .enumerate() - .map(|(i, rows)| { - let c = narrowed_ctx.clone(); - let record_id = RecordId::from(i); - async move { - bitwise_equal_gf2(c, record_id, &rows[0].match_key, &rows[1].match_key).await - } - }), - ) - .await -} - -#[derive(Step)] -#[allow(clippy::enum_variant_names)] -pub(in crate::protocol) enum Step { - CurrentStopBitTimesSuccessorCredit, - CurrentStopBitTimesSuccessorStopBit, - CurrentCreditOrCreditUpdate, - ComputeHelperBits, - ComputeStopBits, -} - -#[derive(Step)] -pub(crate) enum InteractionPatternStep { - #[dynamic(64)] - Depth(usize), -} - -impl From for InteractionPatternStep { - fn from(v: usize) -> Self { - Self::Depth(v) - } -} diff --git a/ipa-core/src/protocol/basics/mod.rs b/ipa-core/src/protocol/basics/mod.rs index 92ebdbfc2..f4db7fc9b 100644 --- a/ipa-core/src/protocol/basics/mod.rs +++ b/ipa-core/src/protocol/basics/mod.rs @@ -1,17 +1,17 @@ pub mod apply_permutation; +#[cfg(feature = "descriptive-gate")] pub mod check_zero; mod if_else; pub(crate) mod mul; -mod partial_reveal; mod reshare; mod reveal; mod share_known_value; pub mod sum_of_product; +#[cfg(feature = "descriptive-gate")] pub use check_zero::check_zero; pub use if_else::if_else; pub use mul::{MultiplyZeroPositions, SecureMul, ZeroPositions}; -pub use partial_reveal::PartialReveal; pub use reshare::Reshare; pub use reveal::Reveal; pub use share_known_value::ShareKnownValue; @@ -19,16 +19,14 @@ pub use sum_of_product::SumOfProducts; use crate::{ ff::Field, - protocol::{ - context::{Context, UpgradedMaliciousContext}, - RecordId, - }, - secret_sharing::{ - replicated::{ - malicious::{AdditiveShare as MaliciousAdditiveShare, ExtendableField}, - semi_honest::AdditiveShare, - }, - SecretSharing, SharedValue, + protocol::{context::Context, RecordId}, + secret_sharing::{replicated::semi_honest::AdditiveShare, SecretSharing, SharedValue}, +}; +#[cfg(feature = "descriptive-gate")] +use crate::{ + protocol::context::UpgradedMaliciousContext, + secret_sharing::replicated::malicious::{ + AdditiveShare as MaliciousReplicated, ExtendableField, }, }; @@ -36,7 +34,6 @@ pub trait BasicProtocols: SecretSharing + Reshare + Reveal - + PartialReveal + SecureMul + ShareKnownValue + SumOfProducts @@ -45,7 +42,8 @@ pub trait BasicProtocols: impl BasicProtocols for AdditiveShare {} +#[cfg(feature = "descriptive-gate")] impl<'a, F: ExtendableField> BasicProtocols, F> - for MaliciousAdditiveShare + for MaliciousReplicated { } diff --git a/ipa-core/src/protocol/basics/mul/malicious.rs b/ipa-core/src/protocol/basics/mul/malicious.rs index 3e3710cb4..04f46e59c 100644 --- a/ipa-core/src/protocol/basics/mul/malicious.rs +++ b/ipa-core/src/protocol/basics/mul/malicious.rs @@ -1,3 +1,4 @@ +use async_trait::async_trait; use futures::future::try_join; use ipa_macros::Step; @@ -19,6 +20,7 @@ use crate::{ pub(crate) enum Step { DuplicateMultiply, RandomnessForValidation, + ReshareRx, } /// @@ -109,6 +111,23 @@ where Ok(malicious_ab) } +/// Implement secure multiplication for malicious contexts with replicated secret sharing. +#[async_trait] +impl<'a, F: ExtendableField> SecureMul> for MaliciousReplicated { + async fn multiply_sparse<'fut>( + &self, + rhs: &Self, + ctx: UpgradedMaliciousContext<'a, F>, + record_id: RecordId, + zeros_at: MultiplyZeroPositions, + ) -> Result + where + UpgradedMaliciousContext<'a, F>: 'fut, + { + multiply(ctx, record_id, self, rhs, zeros_at).await + } +} + #[cfg(all(test, unit_test))] mod test { use crate::{ diff --git a/ipa-core/src/protocol/basics/mul/mod.rs b/ipa-core/src/protocol/basics/mul/mod.rs index b8924343a..acab715c2 100644 --- a/ipa-core/src/protocol/basics/mul/mod.rs +++ b/ipa-core/src/protocol/basics/mul/mod.rs @@ -2,20 +2,10 @@ use async_trait::async_trait; use crate::{ error::Error, - ff::Field, - protocol::{ - context::{Context, UpgradedMaliciousContext}, - RecordId, - }, - secret_sharing::{ - replicated::{ - malicious::{AdditiveShare as MaliciousReplicated, ExtendableField}, - semi_honest::AdditiveShare as Replicated, - }, - FieldSimd, - }, + protocol::{context::Context, RecordId}, }; +#[cfg(feature = "descriptive-gate")] pub(crate) mod malicious; mod semi_honest; pub(in crate::protocol) mod sparse; @@ -49,44 +39,3 @@ pub trait SecureMul: Send + Sync + Sized { where C: 'fut; } - -/// looks like clippy disagrees with itself on whether this attribute is useless or not. -use {malicious::multiply as malicious_mul, semi_honest::multiply as semi_honest_mul}; - -/// Implement secure multiplication for semi-honest contexts with replicated secret sharing. -#[async_trait] -impl SecureMul for Replicated -where - C: Context, - F: Field + FieldSimd, -{ - async fn multiply_sparse<'fut>( - &self, - rhs: &Self, - ctx: C, - record_id: RecordId, - zeros_at: MultiplyZeroPositions, - ) -> Result - where - C: 'fut, - { - semi_honest_mul(ctx, record_id, self, rhs, zeros_at).await - } -} - -/// Implement secure multiplication for malicious contexts with replicated secret sharing. -#[async_trait] -impl<'a, F: ExtendableField> SecureMul> for MaliciousReplicated { - async fn multiply_sparse<'fut>( - &self, - rhs: &Self, - ctx: UpgradedMaliciousContext<'a, F>, - record_id: RecordId, - zeros_at: MultiplyZeroPositions, - ) -> Result - where - UpgradedMaliciousContext<'a, F>: 'fut, - { - malicious_mul(ctx, record_id, self, rhs, zeros_at).await - } -} diff --git a/ipa-core/src/protocol/basics/mul/semi_honest.rs b/ipa-core/src/protocol/basics/mul/semi_honest.rs index fec513f7c..303027deb 100644 --- a/ipa-core/src/protocol/basics/mul/semi_honest.rs +++ b/ipa-core/src/protocol/basics/mul/semi_honest.rs @@ -1,3 +1,5 @@ +use async_trait::async_trait; + use crate::{ error::Error, ff::Field, @@ -89,6 +91,26 @@ where Ok(Replicated::new_arr(lhs, rhs)) } +/// Implement secure multiplication for semi-honest contexts with replicated secret sharing. +#[async_trait] +impl super::SecureMul for Replicated +where + C: Context, + F: Field + FieldSimd, +{ + async fn multiply_sparse<'fut>( + &self, + rhs: &Self, + ctx: C, + record_id: RecordId, + zeros_at: MultiplyZeroPositions, + ) -> Result + where + C: 'fut, + { + multiply(ctx, record_id, self, rhs, zeros_at).await + } +} #[cfg(all(test, unit_test))] mod test { use std::{ diff --git a/ipa-core/src/protocol/basics/partial_reveal.rs b/ipa-core/src/protocol/basics/partial_reveal.rs deleted file mode 100644 index 770100afd..000000000 --- a/ipa-core/src/protocol/basics/partial_reveal.rs +++ /dev/null @@ -1,129 +0,0 @@ -use async_trait::async_trait; -use futures::future::try_join; - -use crate::{ - error::Error, - helpers::{Direction, Role}, - protocol::{ - context::{Context, UpgradedMaliciousContext}, - RecordBinding, RecordId, - }, - secret_sharing::{ - replicated::{ - malicious::{AdditiveShare as MaliciousReplicated, ExtendableField}, - semi_honest::AdditiveShare as Replicated, - }, - SharedValue, - }, -}; - -/// Trait for partial reveal protocol to open a shared secret to all helpers except helper `left_out` inside the MPC ring. -#[async_trait] -pub trait PartialReveal: Sized { - type Output; - /// reveal the secret to all helpers in MPC circuit. Note that after method is called, - /// it must be assumed that the secret value has been revealed to at least one of the helpers. - /// Even in case when method never terminates, returns an error, etc. - async fn partial_reveal<'fut>( - &self, - ctx: C, - record_binding: B, - left_out: Role, - ) -> Result, Error> - where - C: 'fut; -} - -/// Similar to reveal, however one helper party does not receive the output -/// ![Reveal steps][reveal] -/// Each helper sends their left share to the right helper. The helper then reconstructs their secret by adding the three shares -/// i.e. their own shares and received share. -#[async_trait] -// #[embed_doc_image("reveal", "images/reveal.png")] -impl PartialReveal for Replicated { - type Output = V; - - async fn partial_reveal<'fut>( - &self, - ctx: C, - record_id: RecordId, - left_out: Role, - ) -> Result, Error> - where - C: 'fut, - { - let (left, right) = self.as_tuple(); - - // send except to left_out - if ctx.role().peer(Direction::Right) != left_out { - ctx.send_channel(ctx.role().peer(Direction::Right)) - .send(record_id, left) - .await?; - } - - if ctx.role() == left_out { - Ok(None) - } else { - let share = ctx - .recv_channel(ctx.role().peer(Direction::Left)) - .receive(record_id) - .await?; - - Ok(Some(left + right + share)) - } - } -} - -#[async_trait] -impl<'a, F: ExtendableField> PartialReveal, RecordId> - for MaliciousReplicated -{ - type Output = F; - - async fn partial_reveal<'fut>( - &self, - ctx: UpgradedMaliciousContext<'a, F>, - record_id: RecordId, - left_out: Role, - ) -> Result, Error> - where - UpgradedMaliciousContext<'a, F>: 'fut, - { - use crate::secret_sharing::replicated::malicious::ThisCodeIsAuthorizedToDowngradeFromMalicious; - - let (left, right) = self.x().access_without_downgrade().as_tuple(); - let left_sender = ctx.send_channel(ctx.role().peer(Direction::Left)); - let left_receiver = ctx.recv_channel::(ctx.role().peer(Direction::Left)); - let right_sender = ctx.send_channel(ctx.role().peer(Direction::Right)); - let right_receiver = ctx.recv_channel::(ctx.role().peer(Direction::Right)); - - // Send share to helpers to the right and left - // send except to left_out - if ctx.role().peer(Direction::Left) != left_out { - left_sender.send(record_id, right).await?; - } - if ctx.role().peer(Direction::Right) != left_out { - right_sender.send(record_id, left).await?; - } - if ctx.role() == left_out { - Ok(None) - } else { - let (share_from_left, share_from_right) = try_join( - left_receiver.receive(record_id), - right_receiver.receive(record_id), - ) - .await?; - - if share_from_left == share_from_right { - Ok(Some(left + right + share_from_left)) - } else { - Err(Error::MaliciousRevealFailed) - } - } - } -} - -#[cfg(all(test, unit_test))] -mod tests { - // No tests :(, see 'protocol/ipa_prf/boolean_ops/share_conversion_aby.rs' -} diff --git a/ipa-core/src/protocol/basics/reshare.rs b/ipa-core/src/protocol/basics/reshare.rs index 70b65c1c3..e2bdec483 100644 --- a/ipa-core/src/protocol/basics/reshare.rs +++ b/ipa-core/src/protocol/basics/reshare.rs @@ -2,30 +2,27 @@ use std::iter::{repeat, zip}; use async_trait::async_trait; use embed_doc_image::embed_doc_image; -use futures::future::try_join; use crate::{ error::Error, ff::Field, helpers::{Direction, Role}, - protocol::{ - context::{Context, UpgradedMaliciousContext}, - prss::SharedRandomness, - sort::{ - apply_sort::shuffle::InnerVectorElementStep, - ReshareStep::{RandomnessForValidation, ReshareRx}, - }, - NoRecord, RecordBinding, RecordId, + protocol::{context::Context, prss::SharedRandomness, NoRecord, RecordBinding, RecordId}, + secret_sharing::replicated::{ + semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing, }, - secret_sharing::{ - replicated::{ - malicious::{AdditiveShare as MaliciousReplicated, ExtendableField}, - semi_honest::AdditiveShare as Replicated, - ReplicatedSecretSharing, - }, - BitDecomposed, +}; +#[cfg(feature = "descriptive-gate")] +use crate::{ + protocol::basics::mul::malicious::Step::{RandomnessForValidation, ReshareRx}, + protocol::context::SpecialAccessToUpgradedContext, + protocol::context::UpgradedMaliciousContext, + secret_sharing::replicated::malicious::ThisCodeIsAuthorizedToDowngradeFromMalicious, + secret_sharing::replicated::malicious::{ + AdditiveShare as MaliciousReplicated, ExtendableField, }, }; + #[embed_doc_image("reshare", "images/sort/reshare.png")] /// Trait for reshare protocol to renew shares of a secret value for all 3 helpers. /// @@ -106,6 +103,7 @@ impl Reshare for Replicated { } } +#[cfg(feature = "descriptive-gate")] #[async_trait] /// For malicious reshare, we run semi honest reshare protocol twice, once for x and another for rx and return the results /// # Errors @@ -122,10 +120,7 @@ impl<'a, F: ExtendableField> Reshare, RecordId> where UpgradedMaliciousContext<'a, F>: 'fut, { - use crate::{ - protocol::context::SpecialAccessToUpgradedContext, - secret_sharing::replicated::malicious::ThisCodeIsAuthorizedToDowngradeFromMalicious, - }; + use futures::future::try_join; let random_constant_ctx = ctx.narrow(&RandomnessForValidation); let (rx, x) = try_join( @@ -142,30 +137,6 @@ impl<'a, F: ExtendableField> Reshare, RecordId> } } -#[async_trait] -impl Reshare for BitDecomposed -where - S: Reshare + Send + Sync, -{ - async fn reshare<'fut>( - self: &BitDecomposed, - ctx: C, - record_binding: RecordId, - to_helper: Role, - ) -> Result, Error> - where - C: 'fut, - { - BitDecomposed::try_from( - ctx.parallel_join(self.iter().enumerate().map(|(i, x)| { - let c = ctx.narrow(&InnerVectorElementStep::from(i)); - async move { x.reshare(c, record_binding, to_helper).await } - })) - .await?, - ) - } -} - #[async_trait] impl Reshare for Vec where @@ -265,13 +236,15 @@ mod tests { ff::{Field, Fp32BitPrime, Gf2, Gf32Bit}, helpers::{Direction, Role}, protocol::{ - basics::Reshare, + basics::{ + mul::malicious::Step::{RandomnessForValidation, ReshareRx}, + Reshare, + }, context::{ Context, SemiHonestContext, UpgradableContext, UpgradedContext, UpgradedMaliciousContext, Validator, }, prss::SharedRandomness, - sort::ReshareStep::{RandomnessForValidation, ReshareRx}, RecordId, }, rand::{thread_rng, Rng}, diff --git a/ipa-core/src/protocol/basics/reveal.rs b/ipa-core/src/protocol/basics/reveal.rs index 672c8a473..c35a1ffea 100644 --- a/ipa-core/src/protocol/basics/reveal.rs +++ b/ipa-core/src/protocol/basics/reveal.rs @@ -1,24 +1,17 @@ -use std::iter::{repeat, zip}; - use async_trait::async_trait; use embed_doc_image::embed_doc_image; -use futures::future::try_join; use crate::{ error::Error, - ff::Field, - helpers::Direction, - protocol::{ - context::{Context, UpgradedMaliciousContext}, - sort::generate_permutation::ShuffledPermutationWrapper, - NoRecord, RecordBinding, RecordId, - }, - secret_sharing::{ - replicated::{ - malicious::{AdditiveShare as MaliciousReplicated, ExtendableField}, - semi_honest::AdditiveShare as Replicated, - }, - SecretSharing, SharedValue, + helpers::{Direction, Role}, + protocol::{context::Context, RecordBinding, RecordId}, + secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, SharedValue}, +}; +#[cfg(feature = "descriptive-gate")] +use crate::{ + protocol::context::UpgradedMaliciousContext, + secret_sharing::replicated::malicious::{ + AdditiveShare as MaliciousReplicated, ExtendableField, }, }; @@ -32,6 +25,16 @@ pub trait Reveal: Sized { async fn reveal<'fut>(&self, ctx: C, record_binding: B) -> Result where C: 'fut; + + /// partial reveal protocol to open a shared secret to all helpers except helper `left_out` inside the MPC ring. + async fn partial_reveal<'fut>( + &self, + ctx: C, + record_binding: B, + left_out: Role, + ) -> Result, Error> + where + C: 'fut; } /// This implements a semi-honest reveal algorithm for replicated secret sharing. @@ -68,12 +71,44 @@ impl Reveal for Replicated { Ok(left + right + share) } + + /// TODO: implement reveal through partial reveal where `left_out` is optional + async fn partial_reveal<'fut>( + &self, + ctx: C, + record_id: RecordId, + left_out: Role, + ) -> Result, Error> + where + C: 'fut, + { + let (left, right) = self.as_tuple(); + + // send except to left_out + if ctx.role().peer(Direction::Right) != left_out { + ctx.send_channel(ctx.role().peer(Direction::Right)) + .send(record_id, left) + .await?; + } + + if ctx.role() == left_out { + Ok(None) + } else { + let share = ctx + .recv_channel(ctx.role().peer(Direction::Left)) + .receive(record_id) + .await?; + + Ok(Some(left + right + share)) + } + } } /// This implements the malicious reveal protocol over replicated secret sharings. /// It works similarly to semi-honest reveal, the key difference is that each helper sends its share /// to both helpers (right and left) and upon receiving 2 shares from peers it validates that they /// indeed match. +#[cfg(feature = "descriptive-gate")] #[async_trait] impl<'a, F: ExtendableField> Reveal, RecordId> for MaliciousReplicated @@ -88,6 +123,8 @@ impl<'a, F: ExtendableField> Reveal, RecordId> where UpgradedMaliciousContext<'a, F>: 'fut, { + use futures::future::try_join; + use crate::secret_sharing::replicated::malicious::ThisCodeIsAuthorizedToDowngradeFromMalicious; let (left, right) = self.x().access_without_downgrade().as_tuple(); @@ -115,40 +152,49 @@ impl<'a, F: ExtendableField> Reveal, RecordId> Err(Error::MaliciousRevealFailed) } } -} -#[async_trait] -impl Reveal for ShuffledPermutationWrapper -where - F: Field, - S: SecretSharing + Reveal, - C: Context, -{ - type Output = Vec; - - /// Given a vector containing secret shares of a permutation, this returns a revealed permutation. - /// This executes `reveal` protocol on each row of the vector and then constructs a `Permutation` object - /// from the revealed rows. - /// # Errors - /// If we cant convert F to u128 - /// # Panics - /// If we cant convert F to u128 - async fn reveal<'fut>(&self, ctx: C, _: NoRecord) -> Result, Error> { - let ctx_ref = &ctx; - let ctx = ctx.set_total_records(self.perm.len()); - let revealed_permutation = ctx_ref - .try_join(zip(repeat(ctx), self.perm.iter()).enumerate().map( - |(index, (ctx, value))| async move { - let reveal_value = value.reveal(ctx, RecordId::from(index)).await; - - // safety: we wouldn't use fields larger than 64 bits and there are checks that enforce it - // in the field module - reveal_value.map(|val| val.as_u128().try_into().unwrap()) - }, - )) + async fn partial_reveal<'fut>( + &self, + ctx: UpgradedMaliciousContext<'a, F>, + record_id: RecordId, + left_out: Role, + ) -> Result, Error> + where + UpgradedMaliciousContext<'a, F>: 'fut, + { + use futures::future::try_join; + + use crate::secret_sharing::replicated::malicious::ThisCodeIsAuthorizedToDowngradeFromMalicious; + + let (left, right) = self.x().access_without_downgrade().as_tuple(); + let left_sender = ctx.send_channel(ctx.role().peer(Direction::Left)); + let left_receiver = ctx.recv_channel::(ctx.role().peer(Direction::Left)); + let right_sender = ctx.send_channel(ctx.role().peer(Direction::Right)); + let right_receiver = ctx.recv_channel::(ctx.role().peer(Direction::Right)); + + // Send share to helpers to the right and left + // send except to left_out + if ctx.role().peer(Direction::Left) != left_out { + left_sender.send(record_id, right).await?; + } + if ctx.role().peer(Direction::Right) != left_out { + right_sender.send(record_id, left).await?; + } + if ctx.role() == left_out { + Ok(None) + } else { + let (share_from_left, share_from_right) = try_join( + left_receiver.receive(record_id), + right_receiver.receive(record_id), + ) .await?; - Ok(revealed_permutation) + if share_from_left == share_from_right { + Ok(Some(left + right + share_from_left)) + } else { + Err(Error::MaliciousRevealFailed) + } + } } } diff --git a/ipa-core/src/protocol/basics/share_known_value.rs b/ipa-core/src/protocol/basics/share_known_value.rs index cd36f33e9..95df6375a 100644 --- a/ipa-core/src/protocol/basics/share_known_value.rs +++ b/ipa-core/src/protocol/basics/share_known_value.rs @@ -1,16 +1,20 @@ use crate::{ ff::Field, helpers::Role, - protocol::context::{Context, UpgradedContext, UpgradedMaliciousContext}, + protocol::context::Context, secret_sharing::{ - replicated::{ - malicious::{AdditiveShare as MaliciousReplicated, ExtendableField}, - semi_honest::AdditiveShare as Replicated, - ReplicatedSecretSharing, - }, + replicated::{semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing}, SharedValue, }, }; +#[cfg(feature = "descriptive-gate")] +use crate::{ + protocol::context::UpgradedContext, + protocol::context::UpgradedMaliciousContext, + secret_sharing::replicated::malicious::{ + AdditiveShare as MaliciousReplicated, ExtendableField, + }, +}; /// Produce a share of some pre-determined constant. /// @@ -30,6 +34,7 @@ impl ShareKnownValue for Replicated { } } +#[cfg(feature = "descriptive-gate")] impl<'a, F: ExtendableField> ShareKnownValue, F> for MaliciousReplicated { diff --git a/ipa-core/src/protocol/basics/sum_of_product/malicious.rs b/ipa-core/src/protocol/basics/sum_of_product/malicious.rs index feb19e41e..a5126314d 100644 --- a/ipa-core/src/protocol/basics/sum_of_product/malicious.rs +++ b/ipa-core/src/protocol/basics/sum_of_product/malicious.rs @@ -1,3 +1,4 @@ +use async_trait::async_trait; use futures::future::try_join; use ipa_macros::Step; @@ -5,6 +6,7 @@ use crate::{ error::Error, helpers::Direction, protocol::{ + basics::SumOfProducts, context::{Context, UpgradedMaliciousContext}, prss::SharedRandomness, RecordId, @@ -144,6 +146,23 @@ where Ok(malicious_ab) } +#[async_trait] +impl<'a, F: ExtendableField> SumOfProducts> + for MaliciousReplicated +{ + async fn sum_of_products<'fut>( + ctx: UpgradedMaliciousContext<'a, F>, + record_id: RecordId, + a: &[Self], + b: &[Self], + ) -> Result + where + 'a: 'fut, + { + sum_of_products(ctx, record_id, a, b).await + } +} + #[cfg(all(test, unit_test))] mod test { use super::sum_of_products; diff --git a/ipa-core/src/protocol/basics/sum_of_product/mod.rs b/ipa-core/src/protocol/basics/sum_of_product/mod.rs index 18937eff1..8554dafa3 100644 --- a/ipa-core/src/protocol/basics/sum_of_product/mod.rs +++ b/ipa-core/src/protocol/basics/sum_of_product/mod.rs @@ -2,17 +2,10 @@ use async_trait::async_trait; use crate::{ error::Error, - ff::Field, - protocol::{ - context::{Context, UpgradedMaliciousContext}, - RecordId, - }, - secret_sharing::replicated::{ - malicious::{AdditiveShare as MaliciousReplicated, ExtendableField}, - semi_honest::AdditiveShare as Replicated, - }, + protocol::{context::Context, RecordId}, }; +#[cfg(feature = "descriptive-gate")] pub(crate) mod malicious; mod semi_honest; @@ -27,35 +20,3 @@ pub trait SumOfProducts: Sized { where C: 'fut; } - -#[async_trait] -impl SumOfProducts for Replicated { - async fn sum_of_products<'fut>( - ctx: C, - record_id: RecordId, - a: &[Self], - b: &[Self], - ) -> Result - where - C: 'fut, - { - semi_honest::sum_of_products(ctx, record_id, a, b).await - } -} - -#[async_trait] -impl<'a, F: ExtendableField> SumOfProducts> - for MaliciousReplicated -{ - async fn sum_of_products<'fut>( - ctx: UpgradedMaliciousContext<'a, F>, - record_id: RecordId, - a: &[Self], - b: &[Self], - ) -> Result - where - 'a: 'fut, - { - malicious::sum_of_products(ctx, record_id, a, b).await - } -} diff --git a/ipa-core/src/protocol/basics/sum_of_product/semi_honest.rs b/ipa-core/src/protocol/basics/sum_of_product/semi_honest.rs index c16b386ee..cee2f518a 100644 --- a/ipa-core/src/protocol/basics/sum_of_product/semi_honest.rs +++ b/ipa-core/src/protocol/basics/sum_of_product/semi_honest.rs @@ -1,3 +1,5 @@ +use async_trait::async_trait; + use crate::{ error::Error, ff::Field, @@ -66,6 +68,21 @@ where Ok(Replicated::new(lhs, rhs)) } +#[async_trait] +impl super::SumOfProducts for Replicated { + async fn sum_of_products<'fut>( + ctx: C, + record_id: RecordId, + a: &[Self], + b: &[Self], + ) -> Result + where + C: 'fut, + { + sum_of_products(ctx, record_id, a, b).await + } +} + #[cfg(all(test, unit_test))] mod test { use super::sum_of_products; diff --git a/ipa-core/src/protocol/boolean/mod.rs b/ipa-core/src/protocol/boolean/mod.rs index f69190d26..0522fcaae 100644 --- a/ipa-core/src/protocol/boolean/mod.rs +++ b/ipa-core/src/protocol/boolean/mod.rs @@ -13,17 +13,22 @@ use crate::{ }; pub mod bitwise_equal; + +#[cfg(feature = "descriptive-gate")] pub mod bitwise_less_than_prime; +#[cfg(feature = "descriptive-gate")] pub mod comparison; pub mod generate_random_bits; pub mod or; +#[cfg(feature = "descriptive-gate")] pub mod random_bits_generator; +#[cfg(feature = "descriptive-gate")] pub mod solved_bits; mod xor; -pub use comparison::greater_than_constant; -pub use solved_bits::RandomBitsShare; pub use xor::{xor, xor_sparse}; +#[cfg(feature = "descriptive-gate")] +pub use {comparison::greater_than_constant, solved_bits::RandomBitsShare}; /// Converts the given number to a sequence of `{0,1} ⊆ F`, and creates a /// local replicated share. @@ -93,6 +98,7 @@ where /// # Errors /// This does multiplications which can have errors +#[cfg(feature = "descriptive-gate")] pub(crate) async fn any_ones(ctx: C, record_id: RecordId, x: &[S]) -> Result where F: Field, diff --git a/ipa-core/src/protocol/context/mod.rs b/ipa-core/src/protocol/context/mod.rs index 3231cf0d9..69cd66934 100644 --- a/ipa-core/src/protocol/context/mod.rs +++ b/ipa-core/src/protocol/context/mod.rs @@ -1,12 +1,18 @@ +#[cfg(feature = "descriptive-gate")] pub mod malicious; pub mod prss; pub mod semi_honest; pub mod upgrade; + +/// Validators are not used in IPA v3 yet. Once we make use of MAC-based validation, +/// this flag can be removed +#[allow(dead_code)] pub mod validator; use std::num::NonZeroUsize; use async_trait::async_trait; +#[cfg(feature = "descriptive-gate")] pub use malicious::{Context as MaliciousContext, Upgraded as UpgradedMaliciousContext}; use prss::{InstrumentedIndexedSharedRandomness, InstrumentedSequentialSharedRandomness}; pub use semi_honest::{Context as SemiHonestContext, Upgraded as UpgradedSemiHonestContext}; @@ -274,11 +280,18 @@ mod tests { }; use typenum::Unsigned; - use super::*; use crate::{ ff::{Field, Fp31, Serializable}, - helpers::Direction, - protocol::{context::validator::Step::MaliciousProtocol, prss::SharedRandomness, RecordId}, + helpers::{Direction, Role}, + protocol::{ + context::{ + validator::Step::MaliciousProtocol, Context, UpgradableContext, UpgradedContext, + Validator, + }, + prss::SharedRandomness, + step::{Gate, StepNarrow}, + RecordId, + }, secret_sharing::replicated::{ malicious::{AdditiveShare as MaliciousReplicated, ExtendableField}, semi_honest::AdditiveShare as Replicated, diff --git a/ipa-core/src/protocol/context/upgrade.rs b/ipa-core/src/protocol/context/upgrade.rs index 67a275fff..52a41e6df 100644 --- a/ipa-core/src/protocol/context/upgrade.rs +++ b/ipa-core/src/protocol/context/upgrade.rs @@ -10,14 +10,13 @@ use crate::{ protocol::{ basics::ZeroPositions, context::UpgradedContext, - ipa::ArithmeticallySharedIPAInputs, modulus_conversion::BitConversionTriple, step::{BitOpStep, Gate, Step, StepNarrow}, NoRecord, RecordBinding, RecordId, }, secret_sharing::{ replicated::{malicious::ExtendableField, semi_honest::AdditiveShare as Replicated}, - BitDecomposed, Linear as LinearSecretSharing, + Linear as LinearSecretSharing, }, }; @@ -28,6 +27,8 @@ use crate::{ /// and outer vectors in a `Vec>` is an error. Instead, one level of iteration can use the /// record ID and the other can use something like a `BitOpStep`. /// +/// +#[cfg_attr(not(feature = "descriptive-gate"), doc = "```ignore")] /// ```no_run /// use ipa_core::protocol::{context::{UpgradeContext, UpgradeToMalicious, UpgradedMaliciousContext as C}, NoRecord, RecordId}; /// use ipa_core::ff::Fp32BitPrime as F; @@ -163,12 +164,6 @@ where } } -#[derive(Step)] -pub(crate) enum Upgrade2DVectors { - #[dynamic(64)] - Upgrade2d(usize), -} - #[async_trait] impl<'a, C, F, I, M> UpgradeToMalicious<'a, I, Vec> for UpgradeContext<'a, C, F, NoRecord> where @@ -194,31 +189,6 @@ where } } -#[async_trait] -impl<'a, C, F, T, M> UpgradeToMalicious<'a, BitDecomposed, BitDecomposed> - for UpgradeContext<'a, C, F, RecordId> -where - C: UpgradedContext, - F: ExtendableField, - T: Send + 'static, - M: Send + 'static, - for<'u> UpgradeContext<'u, C, F, RecordId>: UpgradeToMalicious<'u, T, M>, -{ - async fn upgrade(self, input: BitDecomposed) -> Result, Error> { - let ctx_ref = &self.ctx; - let record_id = self.record_binding; - BitDecomposed::try_from( - self.ctx - .parallel_join(input.into_iter().enumerate().map(|(i, share)| async move { - UpgradeContext::new(ctx_ref.narrow(&Upgrade2DVectors::Upgrade2d(i)), record_id) - .upgrade(share) - .await - })) - .await?, - ) - } -} - #[async_trait] impl<'a, C, F> UpgradeToMalicious<'a, Replicated, C::Share> for UpgradeContext<'a, C, F, RecordId> @@ -250,103 +220,6 @@ impl> IPAModulusConvertedInputRowWrapper - UpgradeToMalicious< - 'a, - ArithmeticallySharedIPAInputs>, - ArithmeticallySharedIPAInputs, - > for UpgradeContext<'a, C, F, RecordId> -where - C: UpgradedContext, - C::Share: LinearSecretSharing, - F: ExtendableField, -{ - async fn upgrade( - self, - input: ArithmeticallySharedIPAInputs>, - ) -> Result, Error> { - let (is_trigger_bit, trigger_value, timestamp) = try_join3( - self.ctx - .narrow(&UpgradeModConvStep::UpgradeModConv1) - .upgrade_one( - self.record_binding, - input.is_trigger_bit, - ZeroPositions::Pvvv, - ), - self.ctx - .narrow(&UpgradeModConvStep::UpgradeModConv2) - .upgrade_one( - self.record_binding, - input.trigger_value, - ZeroPositions::Pvvv, - ), - self.ctx - .narrow(&UpgradeModConvStep::UpgradeModConv3) - .upgrade_one(self.record_binding, input.timestamp, ZeroPositions::Pvvv), - ) - .await?; - - Ok(ArithmeticallySharedIPAInputs::new( - timestamp, - is_trigger_bit, - trigger_value, - )) - } -} - -#[async_trait] -impl<'a, C, F> - UpgradeToMalicious< - 'a, - IPAModulusConvertedInputRowWrapper>, - IPAModulusConvertedInputRowWrapper, - > for UpgradeContext<'a, C, F, RecordId> -where - C: UpgradedContext, - C::Share: LinearSecretSharing, - F: ExtendableField, -{ - async fn upgrade( - self, - input: IPAModulusConvertedInputRowWrapper>, - ) -> Result, Error> { - let (is_trigger_bit, trigger_value, timestamp) = try_join3( - self.ctx - .narrow(&UpgradeModConvStep::UpgradeModConv1) - .upgrade_one( - self.record_binding, - input.is_trigger_bit, - ZeroPositions::Pvvv, - ), - self.ctx - .narrow(&UpgradeModConvStep::UpgradeModConv2) - .upgrade_one( - self.record_binding, - input.trigger_value, - ZeroPositions::Pvvv, - ), - self.ctx - .narrow(&UpgradeModConvStep::UpgradeModConv3) - .upgrade_one(self.record_binding, input.timestamp, ZeroPositions::Pvvv), - ) - .await?; - - Ok(IPAModulusConvertedInputRowWrapper::new( - timestamp, - is_trigger_bit, - trigger_value, - )) - } -} - // Impl to upgrade a single `Replicated` using a non-record-bound context. Used for tests. #[cfg(test)] #[async_trait] @@ -371,7 +244,7 @@ where // This could also work on a record-bound context, but it's only used in one place for tests where // that's not currently required. -#[cfg(test)] +#[cfg(all(test, feature = "descriptive-gate"))] impl<'a, C: UpgradedContext, F: ExtendableField> UpgradeContext<'a, C, F, NoRecord> { pub(super) async fn upgrade_sparse( self, diff --git a/ipa-core/src/protocol/context/validator.rs b/ipa-core/src/protocol/context/validator.rs index c733363ec..d38473a33 100644 --- a/ipa-core/src/protocol/context/validator.rs +++ b/ipa-core/src/protocol/context/validator.rs @@ -5,19 +5,12 @@ use std::{ }; use async_trait::async_trait; -use futures::future::try_join; -use ipa_macros::Step; use crate::{ error::Error, ff::Field, - helpers::Direction, protocol::{ - basics::{check_zero, Reveal}, - context::{ - Base, Context, MaliciousContext, SemiHonestContext, UpgradableContext, - UpgradedMaliciousContext, UpgradedSemiHonestContext, - }, + context::{Base, SemiHonestContext, UpgradableContext, UpgradedSemiHonestContext}, prss::SharedRandomness, RecordId, }, @@ -26,7 +19,15 @@ use crate::{ semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing, }, - sync::{Arc, Mutex, Weak}, + sync::{Mutex, Weak}, +}; +#[cfg(feature = "descriptive-gate")] +use crate::{ + helpers::Direction, + protocol::basics::Reveal, + protocol::context::Context, + protocol::context::{MaliciousContext, UpgradedMaliciousContext}, + sync::Arc, }; #[async_trait] @@ -69,7 +70,7 @@ impl Debug for SemiHonest<'_, F> { /// Steps used by the validation component of malicious protocol execution. /// In addition to these, an implicit step is used to initialize the value of `r`. -#[derive(Step)] +#[cfg_attr(feature = "descriptive-gate", derive(ipa_macros::Step))] pub(crate) enum Step { /// For the execution of the malicious protocol. MaliciousProtocol, @@ -77,7 +78,7 @@ pub(crate) enum Step { Validate, } -#[derive(Step)] +#[cfg_attr(feature = "descriptive-gate", derive(ipa_macros::Step))] pub(crate) enum ValidateStep { /// Propagate the accumulated values of `u` and `w`. PropagateUAndW, @@ -194,6 +195,7 @@ impl MaliciousAccumulator { } } +#[cfg(feature = "descriptive-gate")] pub struct Malicious<'a, F: ExtendableField> { r_share: Replicated, u_and_w: Arc>>, @@ -201,6 +203,7 @@ pub struct Malicious<'a, F: ExtendableField> { validate_ctx: Base<'a>, } +#[cfg(feature = "descriptive-gate")] #[async_trait] impl<'a, F: ExtendableField> Validator, F> for Malicious<'a, F> { /// Get a copy of the context that can be used for malicious protocol execution. @@ -233,7 +236,8 @@ impl<'a, F: ExtendableField> Validator, F> for Malicious<'a .validate_ctx .narrow(&ValidateStep::CheckZero) .set_total_records(1); - let is_valid = check_zero(check_zero_ctx, RecordId::FIRST, &t).await?; + let is_valid = + crate::protocol::basics::check_zero(check_zero_ctx, RecordId::FIRST, &t).await?; if is_valid { // Yes, we're allowed to downgrade here. @@ -245,6 +249,7 @@ impl<'a, F: ExtendableField> Validator, F> for Malicious<'a } } +#[cfg(feature = "descriptive-gate")] impl<'a, F: ExtendableField> Malicious<'a, F> { #[must_use] #[allow(clippy::needless_pass_by_value)] @@ -278,6 +283,8 @@ impl<'a, F: ExtendableField> Malicious<'a, F> { async fn propagate_u_and_w( &self, ) -> Result<(Replicated, Replicated), Error> { + use futures::future::try_join; + let propagate_ctx = self .validate_ctx .narrow(&ValidateStep::PropagateUAndW) @@ -304,6 +311,7 @@ impl<'a, F: ExtendableField> Malicious<'a, F> { } } +#[cfg(feature = "descriptive-gate")] impl Debug for Malicious<'_, F> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!(f, "MaliciousValidator<{:?}>", type_name::()) diff --git a/ipa-core/src/protocol/dp/distributions.rs b/ipa-core/src/protocol/dp/distributions.rs index 3cff35214..a5e9fa5a6 100644 --- a/ipa-core/src/protocol/dp/distributions.rs +++ b/ipa-core/src/protocol/dp/distributions.rs @@ -74,10 +74,10 @@ impl From for RoundedBoxMuller { mod tests { use std::iter::repeat_with; - use rand::{distributions::Distribution, thread_rng}; + use rand::{distributions::Distribution, thread_rng, Rng}; use rand_core::RngCore; - use super::*; + use crate::protocol::dp::distributions::{is_close, BoxMuller}; #[test] fn dp_normal_distribution_sample_standard() { diff --git a/ipa-core/src/protocol/ipa/mod.rs b/ipa-core/src/protocol/ipa/mod.rs deleted file mode 100644 index e7030e2c3..000000000 --- a/ipa-core/src/protocol/ipa/mod.rs +++ /dev/null @@ -1,1185 +0,0 @@ -use std::{iter::zip, marker::PhantomData, ops::Add}; - -use async_trait::async_trait; -use futures::{ - future::{try_join, try_join3}, - stream::iter as stream_iter, -}; -use generic_array::{ArrayLength, GenericArray}; -use ipa_macros::Step; -use typenum::Unsigned; - -use crate::{ - error::Error, - ff::{ArrayAccess, Field, Gf2, PrimeField, Serializable}, - helpers::{query::IpaQueryConfig, Role}, - protocol::{ - attribution::secure_attribution, - basics::Reshare, - context::{ - Context, UpgradableContext, UpgradeContext, UpgradeToMalicious, UpgradedContext, - Validator, - }, - modulus_conversion::BitConversionTriple, - sort::{ - apply_sort::apply_sort_permutation, - generate_permutation::{ - generate_permutation_and_reveal_shuffled, ShuffledPermutationWrapper, - }, - }, - BasicProtocols, RecordId, - }, - secret_sharing::{ - replicated::{ - malicious::{DowngradeMalicious, ExtendableField}, - semi_honest::AdditiveShare as Replicated, - ReplicatedSecretSharing, - }, - BitDecomposed, Linear as LinearSecretSharing, LinearRefOps, SharedValue, - }, -}; - -#[derive(Step)] -pub(crate) enum Step { - GenSortPermutationFromMatchKeys, - ApplySortPermutation, - AfterConvertAllBits, - UpgradeMatchKeyBits, - UpgradeBreakdownKeyBits, - BinaryValidator, -} - -#[derive(Step)] -pub(crate) enum IPAInputRowResharableStep { - Timestamp, - MatchKeyShares, - TriggerBit, - BreakdownKey, - TriggerValue, -} - -#[derive(Debug)] -#[cfg_attr(test, derive(Clone, PartialEq, Eq))] -pub struct IPAInputRow { - pub timestamp: Replicated, - pub mk_shares: Replicated, - pub is_trigger_bit: Replicated, - pub breakdown_key: Replicated, - pub trigger_value: Replicated, -} - -impl Serializable for IPAInputRow -where - Replicated: Serializable, - Replicated: Serializable, - Replicated: Serializable, - as Serializable>::Size: Add< as Serializable>::Size>, - as Serializable>::Size: - Add< - < as Serializable>::Size as Add< - as Serializable>::Size, - >>::Output, - >, - as Serializable>::Size: Add< - < as Serializable>::Size as Add< - < as Serializable>::Size as Add< - as Serializable>::Size, - >>::Output, - >>::Output, - >, - as Serializable>::Size: Add< - < as Serializable>::Size as Add< - < as Serializable>::Size as Add< - < as Serializable>::Size as Add< - as Serializable>::Size, - >>::Output, - >>::Output, - >>::Output, - >, - < as Serializable>::Size as Add< - < as Serializable>::Size as Add< - < as Serializable>::Size as Add< - < as Serializable>::Size as Add< - as Serializable>::Size, - >>::Output, - >>::Output, - >>::Output, - >>::Output: ArrayLength, -{ - type Size = < as Serializable>::Size as Add< - < as Serializable>::Size as Add< - < as Serializable>::Size as Add< - < as Serializable>::Size as Add< - as Serializable>::Size, - >>::Output, - >>::Output, - >>::Output, - >>::Output; - type DeserializationError = Error; - - fn serialize(&self, buf: &mut GenericArray) { - let mk_sz = as Serializable>::Size::USIZE; - let bk_sz = as Serializable>::Size::USIZE; - let f_sz = as Serializable>::Size::USIZE; - - self.timestamp - .serialize(GenericArray::from_mut_slice(&mut buf[..f_sz])); - self.mk_shares - .serialize(GenericArray::from_mut_slice(&mut buf[f_sz..f_sz + mk_sz])); - self.is_trigger_bit.serialize(GenericArray::from_mut_slice( - &mut buf[f_sz + mk_sz..f_sz + mk_sz + f_sz], - )); - self.breakdown_key.serialize(GenericArray::from_mut_slice( - &mut buf[f_sz + mk_sz + f_sz..f_sz + mk_sz + f_sz + bk_sz], - )); - self.trigger_value.serialize(GenericArray::from_mut_slice( - &mut buf[f_sz + mk_sz + f_sz + bk_sz..], - )); - } - - fn deserialize(buf: &GenericArray) -> Result { - let mk_sz = as Serializable>::Size::USIZE; - let bk_sz = as Serializable>::Size::USIZE; - let f_sz = as Serializable>::Size::USIZE; - - let timestamp = Replicated::::deserialize(GenericArray::from_slice(&buf[..f_sz])) - .map_err(|e| Error::ParseError(e.into()))?; - let mk_shares = - Replicated::::deserialize(GenericArray::from_slice(&buf[f_sz..f_sz + mk_sz])) - .map_err(|e| Error::ParseError(e.into()))?; - let is_trigger_bit = Replicated::::deserialize(GenericArray::from_slice( - &buf[f_sz + mk_sz..f_sz + mk_sz + f_sz], - )) - .map_err(|e| Error::ParseError(e.into()))?; - let breakdown_key = Replicated::::deserialize(GenericArray::from_slice( - &buf[f_sz + mk_sz + f_sz..f_sz + mk_sz + f_sz + bk_sz], - )) - .map_err(|e| Error::ParseError(e.into()))?; - let trigger_value = Replicated::::deserialize(GenericArray::from_slice( - &buf[f_sz + mk_sz + f_sz + bk_sz..], - )) - .map_err(|e| Error::ParseError(e.into()))?; - - Ok(Self { - timestamp, - mk_shares, - is_trigger_bit, - breakdown_key, - trigger_value, - }) - } -} - -impl IPAInputRow -where - IPAInputRow: Serializable, -{ - /// Splits the given slice into chunks aligned with the size of this struct and returns an - /// iterator that produces deserialized instances. - /// - /// ## Panics - /// Panics if the slice buffer is not aligned with the size of this struct. - pub fn from_byte_slice( - input: &[u8], - ) -> impl Iterator::DeserializationError>> + '_ { - assert_eq!( - 0, - input.len() % as Serializable>::Size::USIZE, - "input is not aligned" - ); - input - .chunks( as Serializable>::Size::USIZE) - .map(|chunk| IPAInputRow::::deserialize(GenericArray::from_slice(chunk))) - } -} - -pub struct ArithmeticallySharedIPAInputs> { - pub timestamp: S, - pub is_trigger_bit: S, - pub trigger_value: S, - _marker: PhantomData, -} - -impl> ArithmeticallySharedIPAInputs { - pub fn new(timestamp: S, is_trigger_bit: S, trigger_value: S) -> Self { - Self { - timestamp, - is_trigger_bit, - trigger_value, - _marker: PhantomData, - } - } -} - -#[async_trait] -impl Reshare for ArithmeticallySharedIPAInputs -where - F: Field, - S: LinearSecretSharing + Reshare, - C: Context, -{ - async fn reshare<'fut>( - &self, - ctx: C, - record_id: RecordId, - to_helper: Role, - ) -> Result - where - C: 'fut, - { - let f_timestamp = self.timestamp.reshare( - ctx.narrow(&IPAInputRowResharableStep::Timestamp), - record_id, - to_helper, - ); - let f_is_trigger_bit = self.is_trigger_bit.reshare( - ctx.narrow(&IPAInputRowResharableStep::TriggerBit), - record_id, - to_helper, - ); - let f_trigger_value = self.trigger_value.reshare( - ctx.narrow(&IPAInputRowResharableStep::TriggerValue), - record_id, - to_helper, - ); - - let (timestamp, is_trigger_bit, trigger_value) = - try_join3(f_timestamp, f_is_trigger_bit, f_trigger_value).await?; - - Ok(ArithmeticallySharedIPAInputs::new( - timestamp, - is_trigger_bit, - trigger_value, - )) - } -} - -pub struct BinarySharedIPAInputs> { - pub match_key: BitDecomposed, - pub breakdown_key: BitDecomposed, -} - -impl> BinarySharedIPAInputs { - #[must_use] - pub fn new(match_key: BitDecomposed, breakdown_key: BitDecomposed) -> Self { - Self { - match_key, - breakdown_key, - } - } -} - -#[async_trait] -impl Reshare for BinarySharedIPAInputs -where - T: LinearSecretSharing + Reshare, - C: Context, -{ - async fn reshare<'fut>( - &self, - ctx: C, - record_id: RecordId, - to_helper: Role, - ) -> Result - where - C: 'fut, - { - let (match_key, breakdown_key) = try_join( - self.match_key.reshare( - ctx.narrow(&IPAInputRowResharableStep::MatchKeyShares), - record_id, - to_helper, - ), - self.breakdown_key.reshare( - ctx.narrow(&IPAInputRowResharableStep::BreakdownKey), - record_id, - to_helper, - ), - ) - .await?; - - Ok(BinarySharedIPAInputs::new(match_key, breakdown_key)) - } -} - -/// IPA Protocol -/// -/// We return `Replicated` as output since there is compute after this and in `aggregate_credit`, last communication operation was sort. -/// # Errors -/// Propagates errors from multiplications -/// # Panics -/// Propagates errors from multiplications -#[allow(clippy::too_many_lines)] -pub async fn ipa<'a, C, S, SB, F, MK, BK>( - sh_ctx: C, - input_rows: &[IPAInputRow], - config: IpaQueryConfig, -) -> Result>, Error> -where - C: UpgradableContext, - C::UpgradedContext: UpgradedContext, - S: LinearSecretSharing - + BasicProtocols, F> - + Reshare, RecordId> - + Serializable - + DowngradeMalicious> - + 'static, - for<'r> &'r S: LinearRefOps<'r, S, F>, - C::UpgradedContext: UpgradedContext, - SB: LinearSecretSharing - + BasicProtocols, Gf2> - + DowngradeMalicious> - + 'static, - for<'r> &'r SB: LinearRefOps<'r, SB, Gf2>, - F: PrimeField + ExtendableField, - MK: SharedValue + ArrayAccess, - BK: SharedValue + ArrayAccess, - ShuffledPermutationWrapper>: DowngradeMalicious>, - for<'u> UpgradeContext<'u, C::UpgradedContext, F, RecordId>: UpgradeToMalicious<'u, BitConversionTriple>, BitConversionTriple> - + UpgradeToMalicious< - 'u, - ArithmeticallySharedIPAInputs>, - ArithmeticallySharedIPAInputs, - >, -{ - // TODO: We are sorting, which suggests there's limited value in trying to stream the input. - // However, we immediately copy the complete input into separate vectors for different pieces - // (MK, BK, credit), so streaming could still be beneficial. - - let mk_shares: Vec<_> = input_rows.iter().map(|x| x.mk_shares.clone()).collect(); - - let sort_permutation = generate_permutation_and_reveal_shuffled( - sh_ctx.narrow(&Step::GenSortPermutationFromMatchKeys), - stream_iter(mk_shares), - config.num_multi_bits, - MK::BITS, - ) - .await - .unwrap(); - - let validator = sh_ctx.narrow(&Step::AfterConvertAllBits).validator(); - let m_ctx = validator.context(); - - let gf2_match_key_bits = get_gf2_match_key_bits(input_rows); - let gf2_breakdown_key_bits = get_gf2_breakdown_key_bits(input_rows); - - let binary_validator = sh_ctx.narrow(&Step::BinaryValidator).validator::(); - let binary_m_ctx = binary_validator.context(); - - let (upgraded_gf2_match_key_bits, upgraded_gf2_breakdown_key_bits) = try_join( - binary_m_ctx - .narrow(&Step::UpgradeMatchKeyBits) - .upgrade(gf2_match_key_bits), - binary_m_ctx - .narrow(&Step::UpgradeBreakdownKeyBits) - .upgrade(gf2_breakdown_key_bits), - ) - .await?; - - let arithmetically_shared_values = input_rows - .iter() - .map(|input_row| { - ArithmeticallySharedIPAInputs::new( - input_row.timestamp.clone(), - input_row.is_trigger_bit.clone(), - input_row.trigger_value.clone(), - ) - }) - .collect::>(); - - let arithmetically_shared_values = m_ctx.upgrade(arithmetically_shared_values).await?; - - let binary_shared_values = zip(upgraded_gf2_match_key_bits, upgraded_gf2_breakdown_key_bits) - .map(|(match_key, breakdown_key)| BinarySharedIPAInputs::new(match_key, breakdown_key)) - .collect::>(); - - let (arithmetically_shared_values, binary_shared_values) = try_join( - apply_sort_permutation( - m_ctx.narrow(&Step::ApplySortPermutation), - arithmetically_shared_values, - &sort_permutation, - ), - apply_sort_permutation( - binary_m_ctx.narrow(&Step::ApplySortPermutation), - binary_shared_values, - &sort_permutation, - ), - ) - .await?; - - secure_attribution( - validator, - binary_validator, - arithmetically_shared_values, - binary_shared_values, - config, - ) - .await -} - -fn get_gf2_match_key_bits( - input_rows: &[IPAInputRow], -) -> Vec>> -where - F: PrimeField, - MK: SharedValue + ArrayAccess, - BK: SharedValue + ArrayAccess, -{ - input_rows - .iter() - .map(|row| { - BitDecomposed::decompose(MK::BITS, |i| { - Replicated::new( - Gf2::truncate_from(row.mk_shares.left().get(i.try_into().unwrap()).unwrap()), - Gf2::truncate_from(row.mk_shares.right().get(i.try_into().unwrap()).unwrap()), - ) - }) - }) - .collect::>() -} - -fn get_gf2_breakdown_key_bits( - input_rows: &[IPAInputRow], -) -> Vec>> -where - F: PrimeField, - MK: SharedValue + ArrayAccess, - BK: SharedValue + ArrayAccess, -{ - input_rows - .iter() - .map(|row| { - BitDecomposed::decompose(BK::BITS, |i| { - Replicated::new( - Gf2::truncate_from( - row.breakdown_key.left().get(i.try_into().unwrap()).unwrap(), - ), - Gf2::truncate_from( - row.breakdown_key - .right() - .get(i.try_into().unwrap()) - .unwrap(), - ), - ) - }) - }) - .collect::>() -} - -#[cfg(all( - test, - any(unit_test, all(feature = "shuttle", not(feature = "multi-threading"))) -))] -pub mod tests { - use std::num::NonZeroU32; - - use super::ipa; - use crate::{ - ff::{Field, Fp31, Fp32BitPrime}, - helpers::{query::IpaQueryConfig, GatewayConfig}, - ipa_test_input, - protocol::{BreakdownKey, MatchKey}, - rand::{thread_rng, Rng}, - test_executor::{run, run_with}, - test_fixture::{ - input::GenericReportTestInput, - ipa::{ipa_in_the_clear, test_ipa, CappingOrder, IpaSecurityModel}, - logging, EventGenerator, EventGeneratorConfig, Reconstruct, Runner, TestWorld, - TestWorldConfig, - }, - }; - - #[test] - fn semi_honest() { - const PER_USER_CAP: u32 = 3; - const EXPECTED: &[u128] = &[0, 2, 3, 0, 0, 0, 0, 0]; - const MAX_BREAKDOWN_KEY: u32 = 8; - const NUM_MULTI_BITS: u32 = 3; - - run(|| async { - let world = TestWorld::default(); - - let records: Vec> = ipa_test_input!( - [ - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 2, trigger_value: 0 }, - { timestamp: 0, match_key: 68362, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 0, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 5 }, - { timestamp: 0, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 2 }, - ]; - (Fp31, MatchKey, BreakdownKey) - ); - - let result: Vec<_> = world - .semi_honest(records.into_iter(), |ctx, input_rows| async move { - ipa::<_, _, _, Fp31, MatchKey, BreakdownKey>( - ctx, - &input_rows, - IpaQueryConfig::no_window(PER_USER_CAP, MAX_BREAKDOWN_KEY, NUM_MULTI_BITS), - ) - .await - .unwrap() - }) - .await - .reconstruct(); - assert_eq!(result, EXPECTED); - }); - } - - #[test] - fn malicious() { - const PER_USER_CAP: u32 = 3; - const EXPECTED: &[u128] = &[0, 2, 3]; - const MAX_BREAKDOWN_KEY: u32 = 3; - const NUM_MULTI_BITS: u32 = 3; - - run(|| async { - let world = TestWorld::default(); - - let records: Vec> = ipa_test_input!( - [ - { timestamp: 1, match_key: 12345, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 2, match_key: 12345, is_trigger_report: 0, breakdown_key: 2, trigger_value: 0 }, - { timestamp: 3, match_key: 68362, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 4, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 5 }, - { timestamp: 5, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 2 }, - ]; - (Fp31, MatchKey, BreakdownKey) - ); - - let result: Vec<_> = world - .semi_honest(records.into_iter(), |ctx, input_rows| async move { - ipa::<_, _, _, _, MatchKey, BreakdownKey>( - ctx, - &input_rows, - IpaQueryConfig::no_window(PER_USER_CAP, MAX_BREAKDOWN_KEY, NUM_MULTI_BITS), - ) - .await - .unwrap() - }) - .await - .reconstruct(); - assert_eq!(result, EXPECTED); - }); - } - - #[test] - fn semi_honest_with_attribution_window() { - const PER_USER_CAP: u32 = 3; - const EXPECTED: &[u128] = &[0, 0, 3, 0, 0, 0, 0, 0]; - const MAX_BREAKDOWN_KEY: u32 = 8; - const ATTRIBUTION_WINDOW_SECONDS: u32 = 10; - const NUM_MULTI_BITS: u32 = 3; - - run(|| async { - let world = TestWorld::default(); - - let records: Vec> = ipa_test_input!( - [ - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 2, match_key: 12345, is_trigger_report: 0, breakdown_key: 2, trigger_value: 0 }, // A - { timestamp: 3, match_key: 68362, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, // B - { timestamp: 12, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 5 }, // Attributed to A (12 - 2) - { timestamp: 15, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 2 }, // Not Attributed to B because it's outside the window (15 - 3) - ]; - (Fp31, MatchKey, BreakdownKey) - ); - - let result: Vec<_> = world - .semi_honest(records.into_iter(), |ctx, input_rows| async move { - ipa::<_, _, _, Fp31, MatchKey, BreakdownKey>( - ctx, - &input_rows, - IpaQueryConfig::new( - PER_USER_CAP, - MAX_BREAKDOWN_KEY, - ATTRIBUTION_WINDOW_SECONDS, - NUM_MULTI_BITS, - ), - ) - .await - .unwrap() - }) - .await - .reconstruct(); - assert_eq!(result, EXPECTED); - }); - } - - #[test] - fn malicious_with_attribution_window() { - const PER_USER_CAP: u32 = 3; - const EXPECTED: &[u128] = &[0, 0, 3]; - const MAX_BREAKDOWN_KEY: u32 = 3; - const ATTRIBUTION_WINDOW_SECONDS: u32 = 10; - const NUM_MULTI_BITS: u32 = 3; - - run_with::<_, _, 10>(|| async { - let world = TestWorld::default(); - - let records: Vec> = ipa_test_input!( - [ - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 2, match_key: 12345, is_trigger_report: 0, breakdown_key: 2, trigger_value: 0 }, // A - { timestamp: 3, match_key: 68362, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, // B - { timestamp: 12, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 5 }, // Attributed to A (12 - 2) - { timestamp: 15, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 2 }, // Not Attributed to B because it's outside the window (15 - 3) - ]; - (Fp31, MatchKey, BreakdownKey) - ); - - let result: Vec<_> = world - .malicious(records.into_iter(), |ctx, input_rows| async move { - ipa::<_, _, _, _, MatchKey, BreakdownKey>( - ctx, - &input_rows, - IpaQueryConfig::new( - PER_USER_CAP, - MAX_BREAKDOWN_KEY, - ATTRIBUTION_WINDOW_SECONDS, - NUM_MULTI_BITS, - ), - ) - .await - .unwrap() - }) - .await - .reconstruct(); - assert_eq!(result, EXPECTED); - }); - } - - #[test] - fn cap_of_one() { - const PER_USER_CAP: u32 = 1; - const EXPECTED: &[u128] = &[0, 1, 0, 0, 0, 1, 1]; - const MAX_BREAKDOWN_KEY: u32 = 7; - const NUM_MULTI_BITS: u32 = 3; - - run_with::<_, _, 10>(|| async { - let world = TestWorld::default(); - - let records: Vec> = ipa_test_input!( - [ - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 0, trigger_value: 0 }, // Irrelevant - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, // A - { timestamp: 0, match_key: 68362, is_trigger_report: 0, breakdown_key: 2, trigger_value: 0 }, // B - { timestamp: 0, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // This will be attributed to A - { timestamp: 0, match_key: 77777, is_trigger_report: 1, breakdown_key: 1, trigger_value: 0 }, // Irrelevant - { timestamp: 0, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // This will be attributed to B, but will be capped - { timestamp: 0, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // Irrelevant - { timestamp: 0, match_key: 68362, is_trigger_report: 0, breakdown_key: 3, trigger_value: 0 }, // C - { timestamp: 0, match_key: 77777, is_trigger_report: 0, breakdown_key: 4, trigger_value: 0 }, // Irrelevant - { timestamp: 0, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // This will be attributed to C, but will be capped - { timestamp: 0, match_key: 81818, is_trigger_report: 0, breakdown_key: 6, trigger_value: 0 }, // E - { timestamp: 0, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // Irrelevant - { timestamp: 0, match_key: 81818, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // This will be attributed to E - { timestamp: 0, match_key: 68362, is_trigger_report: 0, breakdown_key: 5, trigger_value: 0 }, // D - { timestamp: 0, match_key: 99999, is_trigger_report: 0, breakdown_key: 6, trigger_value: 0 }, // Irrelevant - { timestamp: 0, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // This will be attributed to D - ]; - (Fp31, MatchKey, BreakdownKey) - ); - - let result: Vec<_> = world - .semi_honest(records.clone().into_iter(), |ctx, input_rows| async move { - ipa::<_, _, _, Fp31, MatchKey, BreakdownKey>( - ctx, - &input_rows, - IpaQueryConfig::no_window(PER_USER_CAP, MAX_BREAKDOWN_KEY, NUM_MULTI_BITS), - ) - .await - .unwrap() - }) - .await - .reconstruct(); - assert_eq!(result, EXPECTED); - - let result: Vec<_> = world - .semi_honest(records.into_iter(), |ctx, input_rows| async move { - ipa::<_, _, _, Fp31, MatchKey, BreakdownKey>( - ctx, - &input_rows, - IpaQueryConfig::no_window(PER_USER_CAP, MAX_BREAKDOWN_KEY, NUM_MULTI_BITS), - ) - .await - .unwrap() - }) - .await - .reconstruct(); - assert_eq!(result, EXPECTED); - }); - } - - #[test] - fn cap_of_one_with_attribution_window() { - const PER_USER_CAP: u32 = 1; - const EXPECTED: &[u128] = &[0, 1, 0, 1, 0, 0, 1]; - const MAX_BREAKDOWN_KEY: u32 = 7; - const ATTRIBUTION_WINDOW_SECONDS: u32 = 3; - const NUM_MULTI_BITS: u32 = 3; - - run_with::<_, _, 10>(|| async { - let records: Vec> = ipa_test_input!( - [ - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 0, trigger_value: 0 }, // Irrelevant - { timestamp: 1, match_key: 12345, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, // A - { timestamp: 2, match_key: 68362, is_trigger_report: 0, breakdown_key: 2, trigger_value: 0 }, // B - { timestamp: 3, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // This will be attributed to A - { timestamp: 4, match_key: 77777, is_trigger_report: 1, breakdown_key: 1, trigger_value: 0 }, // Irrelevant - { timestamp: 5, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // This will be attributed to B, but will be capped - { timestamp: 6, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // Irrelevant - { timestamp: 7, match_key: 68362, is_trigger_report: 0, breakdown_key: 3, trigger_value: 0 }, // C - { timestamp: 8, match_key: 77777, is_trigger_report: 0, breakdown_key: 4, trigger_value: 0 }, // Irrelevant - { timestamp: 9, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // This will be attributed to C since TE corresponding to D is expired - { timestamp: 10, match_key: 81818, is_trigger_report: 0, breakdown_key: 6, trigger_value: 0 }, // E - { timestamp: 11, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // Irrelevant - { timestamp: 12, match_key: 81818, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // This will be attributed to E - { timestamp: 13, match_key: 68362, is_trigger_report: 0, breakdown_key: 5, trigger_value: 0 }, // D - { timestamp: 14, match_key: 99999, is_trigger_report: 0, breakdown_key: 6, trigger_value: 0 }, // Irrelevant - { timestamp: 17, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 0 }, // This will NOT be attributed to D because it exceeds the attribution window (time_delta=4) - ]; - (Fp31, MatchKey, BreakdownKey) - ); - - let world = TestWorld::default(); - let result: Vec<_> = world - .semi_honest(records.clone().into_iter(), |ctx, input_rows| async move { - ipa::<_, _, _, Fp31, MatchKey, BreakdownKey>( - ctx, - &input_rows, - IpaQueryConfig::new( - PER_USER_CAP, - MAX_BREAKDOWN_KEY, - ATTRIBUTION_WINDOW_SECONDS, - NUM_MULTI_BITS, - ), - ) - .await - .unwrap() - }) - .await - .reconstruct(); - assert_eq!(result, EXPECTED); - - let result: Vec<_> = world - .semi_honest(records.into_iter(), |ctx, input_rows| async move { - ipa::<_, _, _, Fp31, MatchKey, BreakdownKey>( - ctx, - &input_rows, - IpaQueryConfig::new( - PER_USER_CAP, - MAX_BREAKDOWN_KEY, - ATTRIBUTION_WINDOW_SECONDS, - NUM_MULTI_BITS, - ), - ) - .await - .unwrap() - }) - .await - .reconstruct(); - assert_eq!(result, EXPECTED); - }); - } - - #[test] - fn random_semihonest_check() { - run_with::<_, _, 10>(|| async { - random_ipa_check(IpaSecurityModel::SemiHonest).await; - }); - } - - #[test] - fn random_malicious_check() { - run_with::<_, _, 4>(|| async { - random_ipa_check(IpaSecurityModel::Malicious).await; - }); - } - - async fn random_ipa_check(security: IpaSecurityModel) { - const MAX_BREAKDOWN_KEY: u32 = 32; - const MAX_TRIGGER_VALUE: u32 = 5; - const NUM_USERS: u32 = 8; - const MIN_RECORDS_PER_USER: u32 = 1; - const MAX_RECORDS_PER_USER: u32 = 8; - const MAX_TIMESTAMP: u32 = 604_800; - const NUM_MULTI_BITS: u32 = 3; - const ATTRIBUTION_WINDOW_SECONDS: Option = NonZeroU32::new(86_400); - type TestField = Fp32BitPrime; - logging::setup(); - - // shuttle does not like when it is more than 5 - too many steps for its scheduler - let max_events = if cfg!(feature = "shuttle") { - match security { - IpaSecurityModel::SemiHonest => 5, - IpaSecurityModel::Malicious => 3, - } - } else { - NUM_USERS * MAX_RECORDS_PER_USER - }; - let mut raw_data = EventGenerator::with_config( - rand::thread_rng(), - EventGeneratorConfig::new( - u64::from(NUM_USERS), - MAX_TRIGGER_VALUE, - MAX_BREAKDOWN_KEY, - MIN_RECORDS_PER_USER, - MAX_RECORDS_PER_USER, - MAX_TIMESTAMP, - ), - ) - .take(usize::try_from(max_events).unwrap()) - .collect::>(); - raw_data.sort_by_key(|e| e.timestamp); - - for per_user_cap in [1, 3] { - let expected_results = ipa_in_the_clear( - &raw_data, - per_user_cap, - ATTRIBUTION_WINDOW_SECONDS, - MAX_BREAKDOWN_KEY, - &CappingOrder::CapOldestFirst, - ); - - let config = TestWorldConfig { - gateway_config: GatewayConfig::new(raw_data.len().clamp(4, 1024)), - ..Default::default() - }; - let world = TestWorld::new_with(config); - test_ipa::( - &world, - &raw_data, - &expected_results, - IpaQueryConfig { - per_user_credit_cap: per_user_cap, - max_breakdown_key: MAX_BREAKDOWN_KEY, - attribution_window_seconds: ATTRIBUTION_WINDOW_SECONDS, - num_multi_bits: NUM_MULTI_BITS, - plaintext_match_keys: true, - }, - security, - ) - .await; - } - } - - /// Test for the "wrapping-add" attack (issue #520). - #[test] - fn random_wrapping_add_attack() { - const PER_USER_CAP: u32 = 15; - const MAX_BREAKDOWN_KEY: u32 = 8; - const NUM_MULTI_BITS: u32 = 3; - const RECORD_COUNT: usize = 8; - - run(|| async { - let mut rng = thread_rng(); - let mut records = Vec::with_capacity(RECORD_COUNT * 2); - - // Generate 8 pairs of (source event, trigger event) tuple, each having a random trigger_value between [4, 31). - // This ensures there's at least one wrap around at user-level, and catch if the contribution ever exceeds the cap. - for _ in 0..RECORD_COUNT { - let mut record = ipa_test_input!( - [ - { timestamp: 0, match_key: 11111, is_trigger_report: 0, breakdown_key: rng.gen_range(0..MAX_BREAKDOWN_KEY), trigger_value: 0 }, - { timestamp: 0, match_key: 11111, is_trigger_report: 1, breakdown_key: 0, trigger_value: rng.gen_range(4..31) }, - ]; - (Fp31, MatchKey, BreakdownKey) - ); - - records.append(&mut record); - } - let world = TestWorld::default(); - let trigger_values: Vec<_> = world - .semi_honest(records.into_iter(), |ctx, input_rows| async move { - ipa::<_, _, _, Fp31, MatchKey, BreakdownKey>( - ctx, - &input_rows, - IpaQueryConfig::no_window(PER_USER_CAP, MAX_BREAKDOWN_KEY, NUM_MULTI_BITS), - ) - .await - .unwrap() - }) - .await - .reconstruct(); - - assert_eq!(MAX_BREAKDOWN_KEY as usize, trigger_values.len()); - println!("actual results: {trigger_values:#?}"); - - // Check that the contribution never exceeds the cap. - - assert!(trigger_values - .iter() - .all(|v| v.as_u128() <= u128::from(PER_USER_CAP))); - // Check that the sum of all contributions = cap. - // The setup ensures that trigger values are always more than the per user cap. - assert_eq!( - u128::from(PER_USER_CAP), - trigger_values - .into_iter() - .fold(0, |acc, x| acc + x.as_u128()) - ); - }); - } - - #[cfg(all(test, unit_test))] - mod serialization { - use generic_array::GenericArray; - use proptest::{ - proptest, - test_runner::{RngAlgorithm, TestRng}, - }; - use rand::distributions::{Distribution, Standard}; - use typenum::Unsigned; - - use crate::{ - ff::{Field, Fp31, PrimeField, Serializable}, - ipa_test_input, - protocol::{ - ipa::{tests::Fp32BitPrime, IPAInputRow}, - BreakdownKey, MatchKey, - }, - secret_sharing::{replicated::semi_honest::AdditiveShare, IntoShares}, - test_fixture::input::GenericReportTestInput, - }; - - fn serde_internal( - timestamp: u128, - match_key: u64, - trigger_bit: u128, - breakdown_key: u128, - trigger_value: u128, - seed: u128, - ) where - F: Field + PrimeField + IntoShares>, - AdditiveShare: Serializable, - Standard: Distribution, - IPAInputRow: Serializable, - { - // xorshift requires 16 byte seed and that's why it is picked here - let mut rng = TestRng::from_seed(RngAlgorithm::XorShift, &seed.to_le_bytes()); - let reports: Vec> = ipa_test_input!( - [ - { timestamp: timestamp, match_key: match_key, is_trigger_report: trigger_bit, breakdown_key: breakdown_key, trigger_value: trigger_value }, - ]; - (F, MatchKey, BreakdownKey) - ); - let [a, b, ..]: [IPAInputRow; 3] = - reports[0].share_with(&mut rng); - - let mut buf = vec![ - 0u8; - 2 * as Serializable>::Size::USIZE - ]; - a.serialize(GenericArray::from_mut_slice( - &mut buf[.. as Serializable>::Size::USIZE], - )); - b.serialize(GenericArray::from_mut_slice( - &mut buf[ as Serializable>::Size::USIZE..], - )); - - assert_eq!( - vec![a, b], - IPAInputRow::::from_byte_slice(&buf) - .collect::, _>>() - .unwrap() - ); - } - - proptest! { - #[test] - fn serde(timestamp in 0..u128::MAX, match_key in 0..u64::MAX, trigger_bit in 0..u128::MAX, breakdown_key in 0..u128::MAX, trigger_value in 0..u128::MAX, seed in 0..u128::MAX) { - serde_internal::(timestamp, match_key, trigger_bit, breakdown_key, trigger_value, seed); - serde_internal::(timestamp, match_key, trigger_bit, breakdown_key, trigger_value, seed); - } - } - } - - /// Ensures that our communication and PRSS numbers don't go above the baseline. - /// Prints a warning if they are currently below, so someone needs to adjust the baseline - /// inside this test. - /// - /// It is possible to increase the number too if there is a good reason for it. This is a - /// "catch all" type of test to make sure we don't miss an accidental regression. - #[cfg(all(test, unit_test))] - mod baselines { - use super::*; - use crate::{ - telemetry::{ - metrics::{ - BYTES_SENT, INDEXED_PRSS_GENERATED, RECORDS_SENT, SEQUENTIAL_PRSS_GENERATED, - }, - stats::Metrics, - }, - test_fixture::ipa::IpaSecurityModel::{Malicious, SemiHonest}, - }; - - const MAX_BREAKDOWN_KEY: u32 = 3; - const ATTRIBUTION_WINDOW_SECONDS: u32 = 600; - const NUM_MULTI_BITS: u32 = 3; - - fn cap_one() -> IpaQueryConfig { - IpaQueryConfig::new( - 1, - MAX_BREAKDOWN_KEY, - ATTRIBUTION_WINDOW_SECONDS, - NUM_MULTI_BITS, - ) - } - - fn cap_three() -> IpaQueryConfig { - IpaQueryConfig::new( - 3, - MAX_BREAKDOWN_KEY, - ATTRIBUTION_WINDOW_SECONDS, - NUM_MULTI_BITS, - ) - } - - fn generate_input( - ) -> std::vec::IntoIter> { - ipa_test_input!( - [ - { timestamp: 100, match_key: 12345, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 200, match_key: 12345, is_trigger_report: 0, breakdown_key: 2, trigger_value: 0 }, - { timestamp: 300, match_key: 68362, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 400, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 5 }, - { timestamp: 500, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 2 }, - { timestamp: 600, match_key: 12345, is_trigger_report: 0, breakdown_key: 2, trigger_value: 0 }, - { timestamp: 700, match_key: 68362, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 800, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 3 }, - { timestamp: 900, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 4 }, - ]; - (F, MatchKey, BreakdownKey) - ).into_iter() - } - - /// Metrics that reflect IPA performance - #[derive(Debug, Eq, PartialEq, Ord, PartialOrd)] - struct PerfMetrics { - /// Expected number of records sent between all helpers. - records_sent: u64, - /// Same as above, but bytes. - bytes_sent: u64, - /// Indexed random values generated by all helpers. - indexed_prss: u64, - /// Random values produced by PRSS random generators. - seq_prss: u64, - } - - impl PerfMetrics { - pub fn from_snapshot(snapshot: &Metrics) -> Self { - Self { - records_sent: snapshot.get_counter(RECORDS_SENT), - bytes_sent: snapshot.get_counter(BYTES_SENT), - indexed_prss: snapshot.get_counter(INDEXED_PRSS_GENERATED), - seq_prss: snapshot.get_counter(SEQUENTIAL_PRSS_GENERATED), - } - } - } - - /// Executes malicious or semi-honest IPA and validates that performance metrics stay - /// within the boundaries defined in `expected`. - async fn run_and_verify( - query_config: IpaQueryConfig, - mode: IpaSecurityModel, - expected: PerfMetrics, - ) { - let test_config = TestWorldConfig::default().enable_metrics().with_seed(0); - let world = TestWorld::new_with(test_config); - let _: Vec<_> = match mode { - Malicious => world.malicious(generate_input(), |ctx, input_rows| async move { - ipa::<_, _, _, Fp32BitPrime, MatchKey, BreakdownKey>( - ctx, - &input_rows, - query_config, - ) - .await - .unwrap() - }), - SemiHonest => world.semi_honest(generate_input(), |ctx, input_rows| async move { - ipa::<_, _, _, Fp32BitPrime, MatchKey, BreakdownKey>( - ctx, - &input_rows, - query_config, - ) - .await - .unwrap() - }), - } - .await - .reconstruct(); - - let actual = PerfMetrics::from_snapshot(&world.metrics_snapshot()); - assert!( - expected >= actual, - "{mode:?} IPA performance has degraded. Expected: {expected:?} >= {actual:?}" - ); - - if expected > actual { - tracing::warn!("Baseline for {mode:?} IPA has improved! Expected {expected:?}, got {actual:?}. \ - Strongly consider adjusting the baseline, so the gains won't be accidentally offset by a regression."); - } - } - - #[tokio::test] - async fn semi_honest_cap_1() { - run_and_verify( - cap_one(), - SemiHonest, - PerfMetrics { - records_sent: 14_397, - bytes_sent: 47_004, - indexed_prss: 19_113, - seq_prss: 1118, - }, - ) - .await; - } - - #[tokio::test] - async fn semi_honest_cap_3() { - run_and_verify( - cap_three(), - SemiHonest, - PerfMetrics { - records_sent: 21_732, - bytes_sent: 76_344, - indexed_prss: 28_122, - seq_prss: 1118, - }, - ) - .await; - } - - #[tokio::test] - async fn malicious_cap_1() { - run_and_verify( - cap_one(), - Malicious, - PerfMetrics { - records_sent: 35_115, - bytes_sent: 129_876, - indexed_prss: 72_375, - seq_prss: 1132, - }, - ) - .await; - } - - #[tokio::test] - async fn malicious_cap_3() { - run_and_verify( - cap_three(), - Malicious, - PerfMetrics { - records_sent: 53_817, - bytes_sent: 204_684, - indexed_prss: 109_662, - seq_prss: 1132, - }, - ) - .await; - } - } -} diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs index c882b9f9f..90f427d21 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs @@ -232,7 +232,7 @@ where mod test { use std::{ array, - iter::{repeat, repeat_with, zip, Iterator}, + iter::{repeat, repeat_with, zip}, time::Instant, }; diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs index cc56cd5fb..95fcf4417 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs @@ -10,8 +10,8 @@ use crate::{ }, helpers::Role, protocol::{ - basics::PartialReveal, context::Context, - ipa_prf::boolean_ops::addition_sequential::integer_add, prss::SharedRandomness, RecordId, + basics::Reveal, context::Context, ipa_prf::boolean_ops::addition_sequential::integer_add, + prss::SharedRandomness, RecordId, }, secret_sharing::{ replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, diff --git a/ipa-core/src/protocol/mod.rs b/ipa-core/src/protocol/mod.rs index c690c1e6f..3d973ae8f 100644 --- a/ipa-core/src/protocol/mod.rs +++ b/ipa-core/src/protocol/mod.rs @@ -1,14 +1,10 @@ -pub mod aggregation; -pub mod attribution; pub mod basics; pub mod boolean; pub mod context; pub mod dp; -pub mod ipa; pub mod ipa_prf; pub mod modulus_conversion; pub mod prss; -pub mod sort; pub mod step; use std::{ diff --git a/ipa-core/src/protocol/prss/mod.rs b/ipa-core/src/protocol/prss/mod.rs index 11e9d1373..9ddf3a874 100644 --- a/ipa-core/src/protocol/prss/mod.rs +++ b/ipa-core/src/protocol/prss/mod.rs @@ -346,8 +346,6 @@ impl EndpointSetup { #[cfg(all(test, unit_test))] pub mod test { - use std::mem::drop; - use rand::prelude::SliceRandom; use super::{Generator, KeyExchange, SequentialSharedRandomness}; diff --git a/ipa-core/src/protocol/sort/apply_sort/mod.rs b/ipa-core/src/protocol/sort/apply_sort/mod.rs deleted file mode 100644 index 131c0db46..000000000 --- a/ipa-core/src/protocol/sort/apply_sort/mod.rs +++ /dev/null @@ -1,120 +0,0 @@ -pub mod shuffle; - -pub use shuffle::shuffle_shares; - -use crate::{ - error::Error, - protocol::{ - basics::{apply_permutation::apply_inv, Reshare}, - context::Context, - sort::{generate_permutation::RevealedAndRandomPermutations, ApplyInvStep::ShuffleInputs}, - RecordId, - }, -}; - -/// # Errors -/// Propagates errors from shuffle/reshare -#[tracing::instrument(name = "apply_sort", skip_all, fields(gate = %ctx.gate().as_ref()))] -pub async fn apply_sort_permutation( - ctx: C, - input: Vec, - sort_permutation: &RevealedAndRandomPermutations, -) -> Result, Error> -where - C: Context, - I: Reshare + Send + Sync, -{ - let mut shuffled_objects = shuffle_shares( - input, - ( - &sort_permutation.randoms_for_shuffle.0, - &sort_permutation.randoms_for_shuffle.1, - ), - ctx.narrow(&ShuffleInputs), - ) - .await?; - - apply_inv(&sort_permutation.revealed, &mut shuffled_objects); - Ok(shuffled_objects) -} - -#[cfg(all(test, unit_test))] -mod tests { - use futures::stream::iter as stream_iter; - - use crate::{ - accumulation_test_input, - ff::{Fp32BitPrime, GaloisField}, - protocol::{ - attribution::input::AccumulateCreditInputRow, - context::Context, - sort::{ - apply_sort::apply_sort_permutation, - generate_permutation::generate_permutation_and_reveal_shuffled, - }, - BreakdownKey, MatchKey, - }, - rand::{thread_rng, Rng}, - secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, SharedValue}, - test_fixture::{input::GenericReportTestInput, Reconstruct, Runner, TestWorld}, - }; - - #[tokio::test] - pub async fn semi_honest() { - const COUNT: usize = 5; - const NUM_MULTI_BITS: u32 = 3; - - let world = TestWorld::default(); - let mut rng = thread_rng(); - - let mut match_keys = Vec::with_capacity(COUNT); - match_keys.resize_with(COUNT, || rng.gen::()); - - let permutation = - permutation::sort(match_keys.iter().map(|mk| mk.as_u128()).collect::>()); - - let mut sidecar: Vec> = - Vec::with_capacity(COUNT); - sidecar.resize_with(COUNT, || { - accumulation_test_input!( - { - is_trigger_report: rng.gen::(), - helper_bit: rng.gen::(), - active_bit: rng.gen::(), - credit: rng.gen::(), - }; - (Fp32BitPrime, MathKey, BreakdownKey) - ) - }); - let expected = permutation.apply_slice(&sidecar); - - let result: Vec> = world - .semi_honest( - (match_keys.into_iter(), sidecar.into_iter()), - |ctx, - (mk_shares, secret): ( - Vec>, - Vec>>, - )| async move { - let ctx = ctx.narrow("apply_sort"); - let sort_permutation = - generate_permutation_and_reveal_shuffled::( - ctx.narrow("convert_all_bits"), - stream_iter(mk_shares), - NUM_MULTI_BITS, - MatchKey::BITS, - ) - .await - .unwrap(); - - apply_sort_permutation(ctx, secret, &sort_permutation) - .await - .unwrap() - }, - ) - .await - .reconstruct(); - - assert_eq!(&expected[..], &result[..]); - } -} diff --git a/ipa-core/src/protocol/sort/apply_sort/shuffle.rs b/ipa-core/src/protocol/sort/apply_sort/shuffle.rs deleted file mode 100644 index 289b28dec..000000000 --- a/ipa-core/src/protocol/sort/apply_sort/shuffle.rs +++ /dev/null @@ -1,223 +0,0 @@ -use embed_doc_image::embed_doc_image; -use ipa_macros::Step; - -use crate::{ - error::Error, - protocol::{ - basics::Reshare, - context::Context, - sort::{ - shuffle::{shuffle_or_unshuffle_once, ShuffleOrUnshuffle}, - ShuffleStep::{Shuffle1, Shuffle2, Shuffle3}, - }, - RecordId, - }, -}; - -#[derive(Step)] -pub(crate) enum InnerVectorElementStep { - #[dynamic(64)] - Elem(usize), -} - -impl From for InnerVectorElementStep { - fn from(v: usize) -> Self { - Self::Elem(v) - } -} - -#[embed_doc_image("shuffle", "images/sort/shuffle.png")] -/// Shuffle calls `shuffle_once` three times with 2 helpers shuffling the shares each time. -/// Order of calling `shuffle_once` is shuffle with (H2, H3), (H3, H1) and (H1, H2). -/// Each shuffle requires communication between helpers to perform reshare. -/// Infrastructure has a pre-requisite to distinguish each communication step uniquely. -/// For this, we have three shuffle steps one per `shuffle_once` i.e. Step1, Step2 and Step3. -/// The Shuffle object receives a step function and appends a `ShuffleStep` to form a concrete step -/// -/// ![Shuffle steps][shuffle] -/// -/// ## Errors -/// If the underlying multiplicaion protocol fails on any of the input records. -pub async fn shuffle_shares( - input: Vec, - random_permutations: (&[u32], &[u32]), - ctx: C, -) -> Result, Error> -where - C: Context, - I: Reshare + Send + Sync, -{ - let input = shuffle_or_unshuffle_once( - input, - random_permutations, - ShuffleOrUnshuffle::Shuffle, - &ctx, - Shuffle1, - ) - .await?; - let input = shuffle_or_unshuffle_once( - input, - random_permutations, - ShuffleOrUnshuffle::Shuffle, - &ctx, - Shuffle2, - ) - .await?; - shuffle_or_unshuffle_once( - input, - random_permutations, - ShuffleOrUnshuffle::Shuffle, - &ctx, - Shuffle3, - ) - .await -} - -#[cfg(all(test, unit_test))] -mod tests { - - mod semi_honest { - use std::collections::HashSet; - - use crate::{ - accumulation_test_input, - ff::{Fp31, Fp32BitPrime}, - protocol::{ - attribution::input::AccumulateCreditInputRow, - context::{Context, UpgradableContext, Validator}, - sort::{ - apply_sort::shuffle::shuffle_shares, - shuffle::get_two_of_three_random_permutations, - }, - BreakdownKey, MatchKey, - }, - rand::{thread_rng, Rng}, - secret_sharing::{ - replicated::{semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing}, - BitDecomposed, - }, - test_fixture::{ - bits_to_value, get_bits, input::GenericReportTestInput, Reconstruct, Runner, - TestWorld, - }, - }; - - #[tokio::test] - async fn shuffle_attribution_input_row() { - const BATCHSIZE: u8 = 25; - let world = TestWorld::default(); - let mut rng = thread_rng(); - - let mut input: Vec> = - Vec::with_capacity(BATCHSIZE.into()); - input.resize_with(BATCHSIZE.into(), || { - accumulation_test_input!( - { - is_trigger_report: rng.gen::(), - helper_bit: rng.gen::(), - active_bit: rng.gen::(), - credit: rng.gen::(), - }; - (Fp31, MatchKey, BreakdownKey) - ) - }); - let hashed_input: HashSet<[u8; 3]> = input - .iter() - .map(|x| { - [ - u8::from(x.is_trigger_report.unwrap()), - u8::from(x.helper_bit.unwrap()), - u8::from(x.trigger_value), - ] - }) - .collect(); - - let result: Vec> = world - .semi_honest( - input.clone().into_iter(), - |ctx, shares: Vec>>| async move { - let validator = ctx.validator::(); // Just ignore this here. - let ctx = validator.context(); - - let perms = - get_two_of_three_random_permutations(BATCHSIZE.into(), ctx.prss_rng()); - - shuffle_shares(shares, (perms.0.as_slice(), perms.1.as_slice()), ctx) - .await - .unwrap() - }, - ) - .await - .reconstruct(); - - let mut hashed_output_secret = HashSet::new(); - let mut output_secret = Vec::new(); - for val in result { - output_secret.push(val); - hashed_output_secret.insert([ - u8::from(val.is_trigger_report.unwrap()), - u8::from(val.helper_bit.unwrap()), - u8::from(val.trigger_value), - ]); - } - - // Secrets should be shuffled - assert_ne!(output_secret, input); - - // Shuffled output should have same inputs - assert_eq!(hashed_output_secret, hashed_input); - } - - fn share_appears_anywhere( - x: &Replicated, - inputs: &[BitDecomposed>], - ) -> bool { - inputs.iter().any(|row| { - row.iter() - .any(|share| share.left() == x.left() && share.right() == x.right()) - }) - } - - #[tokio::test] - async fn shuffle_vec_of_replicated() { - const BIT_LENGTH: u32 = 32; - let some_numbers = vec![ - 123_456_789, - 234_567_890, - 345_678_901, - 456_789_012, - 567_890_123, - ]; - let some_numbers_as_bits = some_numbers - .iter() - .map(|&x| get_bits::(x, BIT_LENGTH)) - .collect::>(); - let world = TestWorld::default(); - - let result = world - .semi_honest(some_numbers_as_bits.into_iter(), |ctx, shares| async move { - let copy_of_input = shares.clone(); - let perms = get_two_of_three_random_permutations(5, ctx.prss_rng()); - let shuffled_shares = - shuffle_shares(shares, (perms.0.as_slice(), perms.1.as_slice()), ctx) - .await - .unwrap(); - - assert!(!shuffled_shares.iter().any(|row| row - .iter() - .any(|x| share_appears_anywhere(x, ©_of_input)))); - - shuffled_shares - }) - .await - .reconstruct(); - - let mut reconstructed_inputs = result - .iter() - .map(|vec| u32::try_from(bits_to_value(vec)).unwrap()) - .collect::>(); - reconstructed_inputs.sort_unstable(); - assert_eq!(reconstructed_inputs, some_numbers); - } - } -} diff --git a/ipa-core/src/protocol/sort/bit_permutation.rs b/ipa-core/src/protocol/sort/bit_permutation.rs deleted file mode 100644 index 97058e3cd..000000000 --- a/ipa-core/src/protocol/sort/bit_permutation.rs +++ /dev/null @@ -1,120 +0,0 @@ -use std::iter::{repeat, zip}; - -use embed_doc_image::embed_doc_image; - -use crate::{ - error::Error, - ff::Field, - protocol::{context::Context, BasicProtocols, RecordId}, - secret_sharing::{Linear as LinearSecretSharing, LinearRefOps}, -}; - -#[embed_doc_image("bit_permutation", "images/sort/bit_permutations.png")] -/// This is an implementation of `GenBitPerm` (Algorithm 3) described in: -/// "An Efficient Secure Three-Party Sorting Protocol with an Honest Majority" -/// by K. Chida, K. Hamada, D. Ikarashi, R. Kikuchi, N. Kiribuchi, and B. Pinkas -/// . -/// -/// Protocol to compute a secret sharing of a permutation, after sorting on just one bit. -/// At a high level, the protocol works as follows: -/// 1. Start with a list of `n` secret shares `[x_1]` ... `[x_n]` where each is a secret sharing of either zero or one. -/// 2. Create a vector of length `2*n` where the first `n` rows have the values `[1 - x_1]` ... `[1 - x_n]` -/// and the next `n` rows have the value `[x_1]` ... `[x_n]` -/// 3. Compute a new vector of length `2*n` by computing the running sum of the vector from step 2. -/// 4. Compute another vector of length `2*n` by multipling the vectors from steps 2 and 3 element-wise. -/// 5. Compute the final output, a vector of length `n`. Each element `i` in this output vector is the sum of -/// the elements at index `i` and `i+n` from the vector computed in step 4. -/// -/// ![Bit Permutation steps][bit_permutation] -/// ## Panics -/// In case the function is unable to get double size of output from multiplication step, the code will panic -/// -/// ## Errors -/// It will propagate errors from multiplication protocol. -pub async fn bit_permutation< - 'a, - F: Field, - S: LinearSecretSharing + BasicProtocols, - C: Context, ->( - ctx: C, - input: &[S], -) -> Result, Error> -where - for<'r> &'r S: LinearRefOps<'r, S, F>, -{ - let ctx_ref = &ctx; - let ctx = ctx.set_total_records(2 * input.len()); - let share_of_one = S::share_known_value(&ctx, F::ONE); - - let mult_input = zip(repeat(share_of_one.clone()), input) - .map(|(one, x)| one - x) - .chain(input.iter().cloned()) - .scan(S::ZERO, |sum, x| { - *sum += &x; - Some((x, sum.clone())) - }); - - let async_multiply = - zip(repeat(ctx), mult_input) - .enumerate() - .map(|(i, (ctx, (x, sum)))| async move { - let record_id = RecordId::from(i); - x.multiply(&sum, ctx, record_id).await - }); - let mut mult_output = ctx_ref.try_join(async_multiply).await?; - - debug_assert!(mult_output.len() == input.len() * 2); - // Generate permutation location - let len = mult_output.len() / 2; - for i in 0..len { - // we are subtracting "1" from the result since this protocol returns 1-index permutation whereas all other - // protocols expect 0-indexed permutation - let less_one = &mult_output[i + len] - &share_of_one; - mult_output[i] = less_one + &mult_output[i]; - } - mult_output.truncate(len); - Ok(mult_output) -} - -#[cfg(all(test, unit_test))] -mod tests { - use crate::{ - ff::{Field, Fp31}, - protocol::sort::bit_permutation::bit_permutation, - test_fixture::{Reconstruct, Runner, TestWorld}, - }; - - // With this input, for stable sort we expect all 0's to line up before 1's. - // The expected sort order is same as expected_sort_output. - const INPUT: &[u128] = &[1, 0, 1, 0, 0, 1, 0]; - const EXPECTED: &[u128] = &[4, 0, 5, 1, 2, 6, 3]; - - #[tokio::test] - pub async fn semi_honest() { - let world = TestWorld::default(); - - let input: Vec<_> = INPUT.iter().map(|x| Fp31::truncate_from(*x)).collect(); - let result = world - .semi_honest(input.into_iter(), |ctx, m_shares| async move { - bit_permutation(ctx, &m_shares).await.unwrap() - }) - .await; - - assert_eq!(&result.reconstruct(), EXPECTED); - } - - #[tokio::test] - pub async fn malicious() { - let world = TestWorld::default(); - - let input: Vec<_> = INPUT.iter().map(|x| Fp31::truncate_from(*x)).collect(); - let result = world - .upgraded_malicious(input.into_iter(), |ctx, m_shares| async move { - bit_permutation(ctx, &m_shares).await.unwrap() - }) - .await; - - assert_eq!(&result.reconstruct(), EXPECTED); - } -} diff --git a/ipa-core/src/protocol/sort/compose.rs b/ipa-core/src/protocol/sort/compose.rs deleted file mode 100644 index 70ba4b599..000000000 --- a/ipa-core/src/protocol/sort/compose.rs +++ /dev/null @@ -1,119 +0,0 @@ -use embed_doc_image::embed_doc_image; - -use crate::{ - error::Error, - ff::Field, - protocol::{ - basics::{apply_permutation::apply, Reshare}, - context::Context, - sort::{shuffle::unshuffle_shares, ComposeStep::UnshuffleRho}, - RecordId, - }, - secret_sharing::SecretSharing, -}; - -#[embed_doc_image("compose", "images/sort/compose.png")] -/// This is an implementation of Compose (Algorithm 5) found in the paper: -/// "An Efficient Secure Three-Party Sorting Protocol with an Honest Majority" -/// by K. Chida, K. Hamada, D. Ikarashi, R. Kikuchi, N. Kiribuchi, and B. Pinkas -/// -/// -/// This protocol composes two permutations by applying one secret-shared permutation(sigma) to another secret-shared permutation(rho) -/// Input: First permutation(sigma) i.e. permutation that sorts all i-1th bits and other permutation(rho) i.e. sort permutation for ith bit -/// Output: All helpers receive secret shares of permutation which sort inputs until ith bits. -/// -/// This algorithm composes two permutations (`rho` and `sigma`). Both permutations are secret-shared, -/// and none of the helpers should learn it through this protocol. -/// -/// Steps -/// -/// 1. Generate random permutations using prss -/// 2. First permutation (sigma) is shuffled with random permutations -/// 3. Reveal the permutation -/// 4. Revealed permutation is applied locally on another permutation shares (rho) -/// 5. Unshuffle the permutation with the same random permutations used in step 2, to undo the effect of the shuffling -/// -/// ![Compose steps][compose] -pub async fn compose + Reshare, C: Context>( - ctx: C, - random_permutations_for_shuffle: (&[u32], &[u32]), - shuffled_sigma: &[u32], - mut rho: Vec, -) -> Result, Error> { - apply(shuffled_sigma, &mut rho); - - let unshuffled_rho = unshuffle_shares( - rho, - random_permutations_for_shuffle, - ctx.narrow(&UnshuffleRho), - ) - .await?; - - Ok(unshuffled_rho) -} - -#[cfg(all(test, unit_test))] -mod tests { - use rand::seq::SliceRandom; - - use crate::{ - ff::{Field, Fp31}, - protocol::{ - basics::apply_permutation::apply, - context::{Context, SemiHonestContext, UpgradableContext, Validator}, - sort::{compose::compose, generate_permutation::shuffle_and_reveal_permutation}, - }, - rand::thread_rng, - test_fixture::{Reconstruct, Runner, TestWorld}, - }; - - #[tokio::test] - pub async fn semi_honest() { - const BATCHSIZE: u32 = 25; - let world = TestWorld::default(); - let mut rng_sigma = thread_rng(); - let mut rng_rho = thread_rng(); - - let mut sigma: Vec = (0..BATCHSIZE).collect(); - sigma.shuffle(&mut rng_sigma); - - let mut rho: Vec = (0..BATCHSIZE.into()).collect(); - rho.shuffle(&mut rng_rho); - - let mut expected_result = rho.clone(); - apply(&sigma, &mut expected_result); - - let result = world - .semi_honest( - ( - sigma.into_iter().map(u128::from).map(Fp31::truncate_from), - rho.into_iter().map(Fp31::truncate_from), - ), - |ctx, (m_sigma_shares, m_rho_shares)| async move { - let v = ctx.narrow("shuffle_reveal").validator(); - let sigma_and_randoms = shuffle_and_reveal_permutation::< - SemiHonestContext, - _, - Fp31, - >(v.context(), m_sigma_shares, v) - .await - .unwrap(); - - compose( - ctx, - ( - sigma_and_randoms.randoms_for_shuffle.0.as_slice(), - sigma_and_randoms.randoms_for_shuffle.1.as_slice(), - ), - &sigma_and_randoms.revealed, - m_rho_shares, - ) - .await - .unwrap() - }, - ) - .await; - - assert_eq!(&expected_result[..], &result.reconstruct()); - } -} diff --git a/ipa-core/src/protocol/sort/generate_permutation.rs b/ipa-core/src/protocol/sort/generate_permutation.rs deleted file mode 100644 index 9a7cb969d..000000000 --- a/ipa-core/src/protocol/sort/generate_permutation.rs +++ /dev/null @@ -1,280 +0,0 @@ -use async_trait::async_trait; -use futures::stream::Stream; - -use crate::{ - error::Error, - ff::PrimeField, - protocol::{ - basics::Reveal, - context::{ - Context, UpgradableContext, UpgradeContext, UpgradeToMalicious, UpgradedContext, - UpgradedMaliciousContext, UpgradedSemiHonestContext, Validator, - }, - modulus_conversion::{BitConversionTriple, ToBitConversionTriples}, - sort::{ - generate_permutation_opt::generate_permutation_opt, - shuffle::{get_two_of_three_random_permutations, shuffle_shares}, - ShuffleRevealPermutationStep, SortStep, - }, - BasicProtocols, NoRecord, RecordId, - }, - secret_sharing::{ - replicated::{ - malicious::{ - AdditiveShare as MaliciousReplicated, DowngradeMalicious, ExtendableField, - UnauthorizedDowngradeWrapper, - }, - semi_honest::AdditiveShare as Replicated, - }, - Linear as LinearSecretSharing, SecretSharing, - }, -}; - -#[derive(Debug)] -/// This object contains the output of `shuffle_and_reveal_permutation` -/// i) `revealed` permutation after shuffling -/// ii) Random permutations: each helper knows 2/3 of random permutations. This is then used for shuffle protocol. -pub struct RevealedAndRandomPermutations { - pub revealed: Vec, - pub randoms_for_shuffle: (Vec, Vec), -} - -pub struct ShuffledPermutationWrapper { - pub perm: Vec, - pub ctx: C, -} - -/// This is an implementation of `OptApplyInv` (Algorithm 13) and `OptCompose` (Algorithm 14) described in: -/// "An Efficient Secure Three-Party Sorting Protocol with an Honest Majority" -/// by K. Chida, K. Hamada, D. Ikarashi, R. Kikuchi, N. Kiribuchi, and B. Pinkas -/// . -/// -/// Steps -/// 1. Get random permutation 2/3 shared across helpers -/// 2. Shuffle shares three times -/// 3. Validate the accumulated macs - this returns the revealed permutation -pub(super) async fn shuffle_and_reveal_permutation( - m_ctx: C::UpgradedContext, - input_permutation: Vec, - malicious_validator: C::Validator, -) -> Result -where - C: UpgradableContext, - C::UpgradedContext: UpgradedContext, - F: ExtendableField, - S: SecretSharing + BasicProtocols, F>, - ShuffledPermutationWrapper>: DowngradeMalicious>, -{ - let random_permutations_for_shuffle = get_two_of_three_random_permutations( - input_permutation.len().try_into().unwrap(), - m_ctx - .narrow(&ShuffleRevealPermutationStep::Generate) - .prss_rng(), - ); - - let shuffled_permutation = shuffle_shares( - input_permutation, - ( - random_permutations_for_shuffle.0.as_slice(), - random_permutations_for_shuffle.1.as_slice(), - ), - m_ctx.narrow(&ShuffleRevealPermutationStep::Shuffle), - ) - .await?; - - let revealed_permutation = malicious_validator - .validate(ShuffledPermutationWrapper { - perm: shuffled_permutation, - ctx: m_ctx, - }) - .await?; - - Ok(RevealedAndRandomPermutations { - revealed: revealed_permutation, - randoms_for_shuffle: random_permutations_for_shuffle, - }) -} - -/// This function takes in a semihonest context and sort keys, generates a sort permutation, shuffles and reveals it and -/// returns both shuffle-revealed permutation and 2/3 randoms which were used to shuffle the permutation -/// The output of this can be applied to any of semihonest/malicious context -/// # Panics -/// If unable to convert sort keys length to u32 -/// # Errors -/// If unable to convert sort keys length to u32 -#[tracing::instrument(name = "sort_permutation", skip_all)] -pub async fn generate_permutation_and_reveal_shuffled( - sh_ctx: C, - sort_keys: I, - num_multi_bits: u32, - max_bits: u32, -) -> Result -where - F: PrimeField + ExtendableField, - C: UpgradableContext, - C::UpgradedContext: UpgradedContext, - S: LinearSecretSharing + BasicProtocols, F> + 'static, - ShuffledPermutationWrapper>: DowngradeMalicious>, - I: Stream, - I::Item: ToBitConversionTriples + Clone + Send + Sync, - for<'u> UpgradeContext<'u, C::UpgradedContext, F, RecordId>: - UpgradeToMalicious<'u, BitConversionTriple>, BitConversionTriple>, -{ - let (validator, sort_permutation) = generate_permutation_opt( - sh_ctx.narrow(&SortStep::SortKeys), - sort_keys, - num_multi_bits, - max_bits, - ) - .await?; - - let m_ctx = validator.context(); - shuffle_and_reveal_permutation::( - m_ctx.narrow(&SortStep::ShuffleRevealPermutation), - sort_permutation, - validator, - ) - .await -} - -#[async_trait] -impl<'a, F: ExtendableField> DowngradeMalicious - for ShuffledPermutationWrapper, UpgradedMaliciousContext<'a, F>> -{ - type Target = Vec; - /// For ShuffledPermutationWrapper on downgrading, we reveal the permutation. This runs reveal on the malicious context - async fn downgrade(self) -> UnauthorizedDowngradeWrapper { - let output = self - .reveal( - self.ctx.narrow(&ShuffleRevealPermutationStep::Reveal), - NoRecord, - ) - .await - .unwrap(); - UnauthorizedDowngradeWrapper::new(output) - } -} - -#[async_trait] -impl<'a, F: ExtendableField> DowngradeMalicious - for ShuffledPermutationWrapper, UpgradedSemiHonestContext<'a, F>> -{ - type Target = Vec; - async fn downgrade(self) -> UnauthorizedDowngradeWrapper { - let output = self - .reveal( - self.ctx.narrow(&ShuffleRevealPermutationStep::Reveal), - NoRecord, - ) - .await - .unwrap(); - UnauthorizedDowngradeWrapper::new(output) - } -} - -#[cfg(all(test, unit_test))] -mod tests { - use std::iter::zip; - - use futures::stream::iter as stream_iter; - use rand::seq::SliceRandom; - - use crate::{ - ff::{Field, Fp31, GaloisField}, - protocol::{ - context::{Context, SemiHonestContext, UpgradableContext, Validator}, - sort::{ - generate_permutation::shuffle_and_reveal_permutation, - generate_permutation_opt::generate_permutation_opt, - }, - MatchKey, - }, - rand::{thread_rng, Rng}, - secret_sharing::SharedValue, - test_fixture::{generate_shares, join3, Reconstruct, Runner, TestWorld}, - }; - - #[tokio::test] - pub async fn semi_honest() { - const COUNT: usize = 5; - const NUM_MULTI_BITS: u32 = 3; - let world = TestWorld::default(); - let mut rng = thread_rng(); - - let mut match_keys = Vec::with_capacity(COUNT); - match_keys.resize_with(COUNT, || rng.gen::()); - - let mut expected = match_keys.iter().map(Field::as_u128).collect::>(); - expected.sort_unstable(); - - let result = world - .semi_honest( - match_keys.clone().into_iter(), - |ctx, mk_shares| async move { - let (_validator, result) = generate_permutation_opt::( - ctx.narrow("sort"), - stream_iter(mk_shares), - NUM_MULTI_BITS, - MatchKey::BITS, - ) - .await - .unwrap(); - result - }, - ) - .await; - - let mut mpc_sorted_list = (0..u128::try_from(COUNT).unwrap()).collect::>(); - for (match_key, index) in zip(match_keys, result.reconstruct()) { - mpc_sorted_list[index.as_u128() as usize] = match_key.as_u128(); - } - - assert_eq!(expected, mpc_sorted_list); - } - - #[tokio::test] - pub async fn shuffle_and_reveal() { - const BATCHSIZE: u32 = 25; - - let mut rng = thread_rng(); - - let mut permutation: Vec = (0..BATCHSIZE).collect(); - permutation.shuffle(&mut rng); - - let world = TestWorld::default(); - let [ctx0, ctx1, ctx2] = world.contexts(); - let permutation: Vec = permutation.iter().map(|x| u128::from(*x)).collect(); - - let [perm0, perm1, perm2] = generate_shares::(&permutation); - - let v0 = ctx0.validator(); - let v1 = ctx1.validator(); - let v2 = ctx2.validator(); - - let ctx0 = v0.context().narrow("shuffle_reveal"); - let ctx1 = v1.context().narrow("shuffle_reveal"); - let ctx2 = v2.context().narrow("shuffle_reveal"); - - let h0_future = shuffle_and_reveal_permutation::(ctx0, perm0, v0); - let h1_future = shuffle_and_reveal_permutation::(ctx1, perm1, v1); - let h2_future = shuffle_and_reveal_permutation::(ctx2, perm2, v2); - - let perms_and_randoms = join3(h0_future, h1_future, h2_future).await; - - assert_eq!(perms_and_randoms[0].revealed, perms_and_randoms[1].revealed); - assert_eq!(perms_and_randoms[1].revealed, perms_and_randoms[2].revealed); - - assert_eq!( - perms_and_randoms[0].randoms_for_shuffle.0, - perms_and_randoms[2].randoms_for_shuffle.1 - ); - assert_eq!( - perms_and_randoms[1].randoms_for_shuffle.0, - perms_and_randoms[0].randoms_for_shuffle.1 - ); - assert_eq!( - perms_and_randoms[2].randoms_for_shuffle.0, - perms_and_randoms[1].randoms_for_shuffle.1 - ); - } -} diff --git a/ipa-core/src/protocol/sort/generate_permutation_opt.rs b/ipa-core/src/protocol/sort/generate_permutation_opt.rs deleted file mode 100644 index 22d2eed1b..000000000 --- a/ipa-core/src/protocol/sort/generate_permutation_opt.rs +++ /dev/null @@ -1,338 +0,0 @@ -use std::cmp::min; - -use embed_doc_image::embed_doc_image; -use futures::stream::{iter as stream_iter, Stream, StreamExt, TryStreamExt}; - -use crate::{ - error::Error, - ff::PrimeField, - protocol::{ - context::{ - Context, UpgradableContext, UpgradeContext, UpgradeToMalicious, UpgradedContext, - Validator, - }, - modulus_conversion::{convert_bits, BitConversionTriple, ToBitConversionTriples}, - sort::{ - compose::compose, - generate_permutation::{shuffle_and_reveal_permutation, ShuffledPermutationWrapper}, - multi_bit_permutation::multi_bit_permutation, - secureapplyinv::secureapplyinv_multi, - SortStep, - }, - step::IpaProtocolStep::Sort, - BasicProtocols, RecordId, - }, - secret_sharing::{ - replicated::{ - malicious::{DowngradeMalicious, ExtendableField}, - semi_honest::AdditiveShare as Replicated, - }, - Linear as LinearSecretSharing, - }, -}; - -#[embed_doc_image("semi_honest_sort", "images/sort/semi-honest-sort.png")] -#[embed_doc_image("malicious_sort", "images/sort/malicious-sort.png")] -/// This is an implementation of `OptGenPerm` (Algorithm 12) described in: -/// "An Efficient Secure Three-Party Sorting Protocol with an Honest Majority" -/// by K. Chida, K. Hamada, D. Ikarashi, R. Kikuchi, N. Kiribuchi, and B. Pinkas -/// . -/// This protocol generates optimized permutation of a stable sort for the given shares of inputs. -/// -/// Steps -/// For the `num_multi_bits` -/// 1. Get replicated shares in Field using modulus conversion -/// 2. Compute bit permutation that sorts 0..`num_multi_bits` -/// For `num_multi_bits` to N-1th bit of input share -/// 1. Shuffle and reveal the i-1th composition -/// 2. Get replicated shares in Field using modulus conversion -/// 3. Sort i..i+`num_multi_bits` bits based on i-1th bits by applying i-1th composition on all these bits -/// 4 Compute bit permutation that sorts i..i+`num_multi_bits` -/// 5. Compute ith composition by composing i-1th composition on ith permutation -/// In the end, n-1th composition is returned. This is the permutation which sorts the inputs -/// -/// ![Semi-honest sort permutation steps][semi_honest_sort] -/// -/// If the malicious sort is enabled, this returns a sort permutation in a malicious context. -/// -/// This runs sort in a malicious context. The caller is responsible to validate the accumulator contents -/// and downgrade context to Semi-honest before calling this function -/// The function takes care of upgrading and validating while the sort protocol runs. -/// It then returns a semi honest context with output in Replicated format. -/// The caller should then upgrade the output and context before moving forward -/// -/// Steps -/// 1. [Malicious Special] Upgrade the context from semihonest to malicious and get a validator -/// 2. [Malicious Special] Upgrade 0..`num_multi_bits` sort bit keys -/// 3. Compute bit permutation that sorts 0..`num_multi_bits` bit -/// -/// For `num_multi_bits` to N-1th bit of input share -/// 1. i. Shuffle the i-1th composition -/// ii. [Malicious Special] Validate the accumulator contents -/// iii. [Malicious Special] Malicious reveal -/// iv. [Malicious Special] Downgrade context to semihonest -/// 2. i. [Malicious Special] Upgrade ith sort bit keys -/// ii. Sort i..i+`num_multi_bits` bits based on i-1th bits by applying i-1th composition on i..i+`num_multi_bits` bits -/// 3. Compute bit permutation that sorts i..i+`num_multi_bits` bits -/// 4. Compute ith composition by composing i-1th composition on ith permutation -/// In the end, following is returned -/// i. n-1th composition: This is the permutation which sorts the inputs -/// ii. Validator which can be used to validate the leftover items in the accumulator -/// -/// ![Malicious sort permutation steps][malicious_sort] -/// -/// # Panics -/// If sort keys dont have num of bits same as `num_bits` -/// # Errors -pub async fn generate_permutation_opt<'a, F, C, S, I>( - sh_ctx: C, - sort_keys: I, - num_multi_bits: u32, - max_bits: u32, // TODO: use a const generic on I::Item; see comment on ToBitConversionTriples::bits. -) -> Result<(C::Validator, Vec), Error> -where - F: PrimeField + ExtendableField, - C: UpgradableContext, - C::UpgradedContext: UpgradedContext, - S: LinearSecretSharing + BasicProtocols, F> + 'static, - I: Stream, - I::Item: ToBitConversionTriples + Clone + Send + Sync, - ShuffledPermutationWrapper>: DowngradeMalicious>, - for<'u> UpgradeContext<'u, C::UpgradedContext, F, RecordId>: - UpgradeToMalicious<'u, BitConversionTriple>, BitConversionTriple>, -{ - let mut malicious_validator = sh_ctx.clone().validator(); - let sort_keys = sort_keys.collect::>().await; - if sort_keys.is_empty() { - return Ok((malicious_validator, Vec::new())); - } - - let mut m_ctx = malicious_validator.context(); - let chunk = 0..min(num_multi_bits, max_bits); - let key_chunk = convert_bits( - m_ctx - .narrow(&SortStep::ModulusConversion) - .set_total_records(sort_keys.len()), - stream_iter(sort_keys.iter().cloned()), - chunk, - ) - .try_collect::>() - .await?; - - let lsb_permutation = - multi_bit_permutation(m_ctx.narrow(&SortStep::BitPermutation), &key_chunk).await?; - let mut composed_less_significant_bits_permutation = lsb_permutation; - - for (chunk_num, chunk_start) in (num_multi_bits..max_bits) - .step_by(usize::try_from(num_multi_bits).unwrap()) - .enumerate() - { - let revealed_and_random_permutations = shuffle_and_reveal_permutation::( - m_ctx.narrow(&SortStep::ShuffleRevealPermutation), - composed_less_significant_bits_permutation, - malicious_validator, - ) - .await?; - - malicious_validator = sh_ctx.narrow(&Sort(chunk_num)).validator(); - m_ctx = malicious_validator.context(); - - // TODO (richaj) it might even be more efficient to apply sort permutation to XorReplicated sharings, - // and convert them to a Vec after this step, as the re-shares will be cheaper for XorReplicated sharings - - let chunk = chunk_start..min(chunk_start + num_multi_bits, max_bits); - let key_chunk = convert_bits( - m_ctx - .narrow(&SortStep::ModulusConversion) - .set_total_records(sort_keys.len()), - stream_iter(sort_keys.iter().cloned()), - chunk, - ) - .try_collect::>() - .await?; - - let (randoms_for_shuffle0, randoms_for_shuffle1, revealed) = ( - revealed_and_random_permutations - .randoms_for_shuffle - .0 - .as_slice(), - revealed_and_random_permutations - .randoms_for_shuffle - .1 - .as_slice(), - revealed_and_random_permutations.revealed.as_slice(), - ); - - let next_few_bits_sorted_by_less_significant_bits = secureapplyinv_multi( - m_ctx.narrow(&SortStep::MultiApplyInv(chunk_num.try_into().unwrap())), - key_chunk, - (randoms_for_shuffle0, randoms_for_shuffle1), - revealed, - ) - .await?; - - let next_few_bits_permutation = multi_bit_permutation( - m_ctx.narrow(&SortStep::BitPermutation), - &next_few_bits_sorted_by_less_significant_bits, - ) - .await?; - - composed_less_significant_bits_permutation = compose( - m_ctx.narrow(&SortStep::Compose), - (randoms_for_shuffle0, randoms_for_shuffle1), - revealed, - next_few_bits_permutation, - ) - .await?; - } - Ok(( - malicious_validator, - composed_less_significant_bits_permutation, - )) -} - -#[cfg(all(test, unit_test))] -mod tests { - use std::iter::zip; - - use futures::stream::iter as stream_iter; - - use crate::{ - ff::{Field, Fp31, Fp32BitPrime, GaloisField}, - protocol::{ - context::{Context, Validator}, - sort::generate_permutation_opt::generate_permutation_opt, - MatchKey, - }, - rand::{thread_rng, Rng}, - secret_sharing::SharedValue, - test_fixture::{join3, Reconstruct, Runner, TestWorld}, - }; - - #[tokio::test] - pub async fn semi_honest() { - const COUNT: usize = 10; - const NUM_MULTI_BITS: u32 = 3; - - let world = TestWorld::default(); - let mut rng = thread_rng(); - - let mut match_keys = Vec::with_capacity(COUNT); - match_keys.resize_with(COUNT, || rng.gen::()); - - let mut expected = match_keys.iter().map(Field::as_u128).collect::>(); - expected.sort_unstable(); - - let result = world - .semi_honest( - match_keys.clone().into_iter(), - |ctx, mk_shares| async move { - let (_validator, result) = generate_permutation_opt::( - ctx.narrow("sort"), - stream_iter(mk_shares), - NUM_MULTI_BITS, - MatchKey::BITS, - ) - .await - .unwrap(); - result - }, - ) - .await; - - let mut mpc_sorted_list = (0..u128::try_from(COUNT).unwrap()).collect::>(); - for (match_key, index) in zip(match_keys, result.reconstruct()) { - mpc_sorted_list[index.as_u128() as usize] = match_key.as_u128(); - } - - assert_eq!(expected, mpc_sorted_list); - } - - async fn sortn(count: usize) { - const NUM_MULTI_BITS: u32 = 3; - let world = TestWorld::default(); - let mut rng = thread_rng(); - - let mut match_keys = Vec::with_capacity(count); - match_keys.resize_with(count, || rng.gen::()); - - let mut expected = match_keys.iter().map(Field::as_u128).collect::>(); - if count > 1 { - // Explicitly don't sort if sorting isn't needed (for noop test). - expected.sort_unstable(); - } - - let [(v0, result0), (v1, result1), (v2, result2)] = world - .malicious( - match_keys.clone().into_iter(), - |ctx, mk_shares| async move { - generate_permutation_opt::( - ctx.narrow("sort"), - stream_iter(mk_shares), - NUM_MULTI_BITS, - MatchKey::BITS, - ) - .await - .unwrap() - }, - ) - .await; - - let result = join3( - v0.validate(result0), - v1.validate(result1), - v2.validate(result2), - ) - .await; - let mut mpc_sorted_list = (0..u128::try_from(count).unwrap()).collect::>(); - for (match_key, index) in zip(match_keys, result.reconstruct()) { - mpc_sorted_list[index.as_u128() as usize] = match_key.as_u128(); - } - - assert_eq!(expected, mpc_sorted_list); - } - - #[tokio::test] - pub async fn malicious() { - sortn(10).await; - } - - /// Passing 32 records for Fp31 doesn't work. - /// - /// Requires one extra thread to cancel futures running in parallel with the one that panics. - #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - #[should_panic = "prime field ipa_core::ff::prime_field::fp31::Fp31 is too small to sort 32 records"] - async fn fp31_overflow() { - const COUNT: usize = 32; - const NUM_MULTI_BITS: u32 = 3; - - let world = TestWorld::default(); - let mut rng = thread_rng(); - - let mut match_keys = Vec::with_capacity(COUNT); - match_keys.resize_with(COUNT, || rng.gen::()); - - _ = world - .malicious( - match_keys.clone().into_iter(), - |ctx, mk_shares| async move { - generate_permutation_opt::( - ctx.narrow("sort"), - stream_iter(mk_shares), - NUM_MULTI_BITS, - MatchKey::BITS, - ) - .await - .unwrap() - }, - ) - .await; - } - - /// These are totally silly, but the code handles them elegantly, if necessary. - #[tokio::test] - pub async fn noop_sorts() { - sortn(1).await; - sortn(0).await; - } -} diff --git a/ipa-core/src/protocol/sort/mod.rs b/ipa-core/src/protocol/sort/mod.rs deleted file mode 100644 index c285af1b6..000000000 --- a/ipa-core/src/protocol/sort/mod.rs +++ /dev/null @@ -1,262 +0,0 @@ -pub mod apply_sort; -pub mod bit_permutation; -pub mod generate_permutation; -pub mod generate_permutation_opt; - -mod compose; -mod multi_bit_permutation; -mod secureapplyinv; -mod shuffle; - -use ipa_macros::Step; - -use crate::{ - error::Error, - ff::Field, - protocol::{context::Context, step::BitOpStep, BasicProtocols, RecordId}, - secret_sharing::{BitDecomposed, Linear as LinearSecretSharing, SecretSharing}, -}; - -#[derive(Step)] -pub(crate) enum SortStep { - ModulusConversion, - BitPermutation, - Compose, - ShuffleRevealPermutation, - SortKeys, - #[dynamic(64)] - MultiApplyInv(u32), -} - -#[derive(Step, Clone, Copy)] -pub(crate) enum ShuffleStep { - Shuffle1, - Shuffle2, - Shuffle3, -} - -#[derive(Step)] -pub(crate) enum ApplyInvStep { - ShuffleInputs, -} - -#[derive(Step)] -pub(crate) enum ComposeStep { - UnshuffleRho, -} - -#[derive(Step)] -pub(crate) enum ShuffleRevealPermutationStep { - Generate, - Reveal, - Shuffle, -} - -#[derive(Step)] -pub(crate) enum ReshareStep { - RandomnessForValidation, - ReshareRx, -} - -/// Convert a bitwise representation of a number into a one-hot encoding of that number. -/// That is, an array of value of 1 at the index corresponding to the value of the number, -/// and a 0 at all other indices. -/// -/// This function accepts a sequence of N secret-shared bits, with the least significant bit at index 0. -/// When considered as a bitwise representation of an N-bit unsigned number, there are exactly -/// `2^N` possible values this could have. -/// -/// # Errors -/// If any multiplication fails, or if the record is too long (e.g. more than 64 multiplications required) -pub async fn bitwise_to_onehot( - ctx: C, - record_idx: usize, - number: &[S], -) -> Result, Error> -where - F: Field, - C: Context, - S: LinearSecretSharing + BasicProtocols, -{ - let num_bits = number.len(); - let precomputed_combinations = - generate_all_combinations(ctx, record_idx, number, num_bits).await?; - - // This loop just iterates over all the possible values this N-bit input could potentially represent - // and checks if the bits are equal to this value. It does so by computing a linear combination of the - // pre-computed coefficients. - // - // Observe that whether a given precomputed coefficient contributes to a - // given equality check follows a Sierpiński triangle - // https://en.wikipedia.org/wiki/Sierpi%C5%84ski_triangle#/media/File:Multigrade_operator_AND.svg. - // - // For example, for a three bit value, we have the following: - // 0: 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 - // 1: 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 - // 2: 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 - // 3: 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 - // 4: 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 - // 5: 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 - // 6: 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 - // 7: 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 - // - // This can be computed from row (i) and column (j) indices with i & j == i - // - // The sign of the inclusion is less obvious, but we discovered that this - // can be found by taking the same row (i) and column (j) indices: - // 1. Invert the row index and bitwise AND the indices: a = !i & j - // 2. Count the number of bits that are set: b = a.count_ones() - // 3. An odd number means a positive coefficient; an odd number means a negative. - // - // For example, for a three bit value, step 1 produces (in binary): - // 0: 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 - // 1: 000 | 000 | 010 | 010 | 100 | 100 | 110 | 110 - // 2: 000 | 001 | 000 | 001 | 100 | 101 | 100 | 101 - // 3: 000 | 000 | 000 | 000 | 100 | 100 | 100 | 100 - // 4: 000 | 001 | 010 | 011 | 000 | 001 | 010 | 011 - // 5: 000 | 000 | 010 | 010 | 000 | 000 | 010 | 010 - // 6: 000 | 001 | 000 | 001 | 000 | 001 | 000 | 001 - // 7: 000 | 000 | 000 | 000 | 000 | 000 | 000 | 000 - // - // Where 000, 101, 011, and 110 mean positive contributions, and - // 001, 010, 100, and 111 mean negative contributions. - // - // 0: + | - | - | + | - | + | + | - - // 1: . | + | . | - | . | - | . | + - // 2: . | . | + | - | . | . | - | + - // 3: . | . | . | + | . | . | . | - - // 4: . | . | . | . | + | - | - | + - // 5: . | . | . | . | . | + | . | - - // 6: . | . | . | . | . | . | + | - - // 7: . | . | . | . | . | . | . | + - Ok(BitDecomposed::decompose(1 << num_bits, |i| { - // Small optimization: skip the blank area and start with the first "+". - let mut check = precomputed_combinations[i].clone(); - for (j, combination) in precomputed_combinations.iter().enumerate().skip(i + 1) { - if (i & j) == i { - if (!i & j).count_ones() & 1 == 1 { - check -= combination; - } else { - check += combination; - } - } - } - check - })) -} - -// -// Every equality check can be computed as a linear combination of coefficients. -// For example, if we are given a 3-bit number `[x_3, x_2, x_1]`, -// we can check if it is equal to 4, by computing: -// $x_3(1-x_2)(1-x_1)$, -// which expands to: -// $x_3 - x_2*x_3 - x_1*x_3 + x_1*x_2*x_3$ -// -// Since we need to check all possible values, it makes sense to pre-compute all -// of the coefficients that are used across all of these equality checks. In this way, -// we can minimize the total number of multiplications needed. -// -// We must pre-compute all combinations of bit values. The following loop does so. -// It does so by starting with the array `[1]`. -// The next step is to multiply this by `x_1` and append it to the end of the array. -// Now the array is `[1, x_1]`. -// The next step is to multiply all of these values by `x_2` and append them to the end of the array. -// Now the array is `[1, x_1, x_2, x_1*x_2]` -// The next step is to mulitply all of these values of `x_3` and append them to the end of the array. -// Now the array is `[1, x_1, x_2, x_1*x_2, x_3, x_1*x_3, x_2*x_3, x_1*x_2*x_3]` -// This process continues for as many steps as there are bits of input. -// -// Operation complexity of this function is `2^n-n-1` where `n` is the number of bits. -// Circuit depth is equal to `n-2`. -// This gets inefficient very quickly as a result. -async fn generate_all_combinations( - ctx: C, - record_idx: usize, - input: &[S], - num_bits: usize, -) -> Result, Error> -where - F: Field, - C: Context, - S: SecretSharing + BasicProtocols, -{ - let record_id = RecordId::from(record_idx); - let mut all_combinations = Vec::with_capacity(1 << num_bits); - all_combinations.push(S::share_known_value(&ctx, F::ONE)); - for (bit_idx, bit) in input.iter().enumerate() { - let step = 1 << bit_idx; - // Concurrency needed here because we are operating on different bits for the same record. - let mut multiplication_results = - ctx.parallel_join(all_combinations.iter().skip(1).enumerate().map( - |(j, combination)| { - let child_idx = j + step; - combination.multiply(bit, ctx.narrow(&BitOpStep::from(child_idx)), record_id) - }, - )) - .await?; - all_combinations.push(bit.clone()); - all_combinations.append(&mut multiplication_results); - } - Ok(all_combinations) -} - -#[cfg(all(test, unit_test))] -mod test { - use futures::future::join4; - - use crate::{ - ff::{Field, Fp31}, - protocol::{context::Context, sort::bitwise_to_onehot}, - secret_sharing::{BitDecomposed, SharedValue}, - seq_join::SeqJoin, - test_fixture::{Reconstruct, Runner, TestWorld}, - }; - - async fn check_onehot(bits: u32) { - let world = TestWorld::default(); - - // Construct bitwise sharings of all values from 0 to 2^BITS-1. - let input = (0..(1 << bits)).map(move |i| { - BitDecomposed::decompose(bits, |j| { - Fp31::truncate_from(u128::from((i & (1 << j)) == (1 << j))) - }) - }); - - let result = world - .semi_honest(input, |ctx, m_shares| async move { - let ctx = ctx.set_total_records(m_shares.len()); - ctx.try_join( - m_shares - .iter() - .enumerate() - .map(|(i, n)| bitwise_to_onehot(ctx.clone(), i, n)), - ) - .await - .unwrap() - }) - .await - .reconstruct(); - - for (i, onehot) in result.into_iter().enumerate() { - for (j, v) in onehot.into_iter().enumerate() { - if i == j { - assert_eq!(Fp31::ONE, v); - } else { - assert_eq!(Fp31::ZERO, v); - } - } - } - } - - #[tokio::test] - async fn several_onehot() { - _ = join4( - check_onehot(1), - check_onehot(2), - check_onehot(3), - check_onehot(4), - ) - .await; - } -} diff --git a/ipa-core/src/protocol/sort/multi_bit_permutation.rs b/ipa-core/src/protocol/sort/multi_bit_permutation.rs deleted file mode 100644 index 8b9ccb90b..000000000 --- a/ipa-core/src/protocol/sort/multi_bit_permutation.rs +++ /dev/null @@ -1,189 +0,0 @@ -use std::iter::repeat; - -use crate::{ - error::Error, - ff::PrimeField, - protocol::{ - basics::SumOfProducts, context::UpgradedContext, sort::bitwise_to_onehot, BasicProtocols, - RecordId, - }, - secret_sharing::{ - replicated::malicious::ExtendableField, BitDecomposed, Linear as LinearSecretSharing, - SecretSharing, - }, -}; - -/// This is an implementation of `GenMultiBitSort` (Algorithm 11) described in: -/// "An Efficient Secure Three-Party Sorting Protocol with an Honest Majority" -/// by K. Chida, K. Hamada, D. Ikarashi, R. Kikuchi, N. Kiribuchi, and B. Pinkas -/// . -/// -/// Protocol to compute a secret sharing of a permutation, after sorting on multiple bits `num_multi_bits`. -/// At a high level, the protocol works as follows: -/// 1. Start with a vector of list of `L*n` secret shares `[[x1_1 ... x1_n], .. , [xL_1 ... xL_n]]` where each is a secret sharing of either zero or one. -/// Here, L is the number of multi bits which are processed together (`num_multi_bits`) and n is the number of records -/// 2. Equality Bit Checker : For j in 0 to 2 pow `num_multi_bits` -/// i. Get binary representation of j (B1 .. BL) -/// ii. For i in `num_multi_bits` -/// a. Locally compute `mult_inputs` as (Bi * `xi_j` + (1-Bi)(1- `xi_j`)) -/// iii. Multiply all `mult_inputs` for this j -/// 3. Compute accumulated sum: For j in 0 to 2 pow `num_multi_bits` -/// i. For each record -/// a. Calculate accumulated `prefix_sum` = s + `mult_output` -/// 4. Compute the final output using sum of products executed in parallel for each record. -pub async fn multi_bit_permutation<'a, C, S, F>( - ctx: C, - input: &[BitDecomposed], -) -> Result, Error> -where - F: PrimeField + ExtendableField, - C: UpgradedContext, - S: LinearSecretSharing + BasicProtocols + 'static, -{ - let num_records = input.len(); - if num_records < 2 { - return Ok(vec![ctx.share_known_value(F::ZERO); num_records]); - } - - let num_multi_bits = (input[0]).len(); - assert!(num_multi_bits > 0); - - if u128::try_from(num_records).unwrap() >= ::PRIME.into() { - return Err(Error::FieldValueTruncation(format!( - "prime field {} is too small to sort {} records", - std::any::type_name::(), - num_records - ))); - } - - let num_possible_bit_values = 2 << (num_multi_bits - 1); - - let share_of_one = ctx.share_known_value(F::ONE); - // Equality bit checker: this checks if each secret shared record is equal to any of numbers between 0 and num_possible_bit_values - let equality_checks = ctx - .try_join( - input - .iter() - .zip(repeat(ctx.set_total_records(num_records))) - .enumerate() - .map(|(idx, (record, ctx))| bitwise_to_onehot(ctx, idx, record)), - ) - .await?; - - // Compute accumulated sum - let mut prefix_sum = Vec::with_capacity(num_records); - let mut cumulative_sum = >::ZERO; - for bit_idx in 0..num_possible_bit_values { - for record_idx in 0..num_records { - if bit_idx == 0 { - prefix_sum.push(Vec::with_capacity(num_multi_bits)); - } - cumulative_sum += &equality_checks[record_idx][bit_idx]; - prefix_sum[record_idx].push(cumulative_sum.clone()); - } - } - - // Take sum of products of output of equality check and accumulated sum - let mut one_off_permutation = ctx - .try_join( - equality_checks - .into_iter() - .zip(prefix_sum.into_iter()) - .zip(repeat(ctx.set_total_records(num_records))) - .enumerate() - .map(|(i, ((eq_checks, prefix_sums), ctx))| async move { - >::sum_of_products( - ctx, - RecordId::from(i), - &eq_checks, - prefix_sums.as_slice(), - ) - .await - }), - ) - .await?; - // we are subtracting "1" from the result since this protocol returns 1-index permutation whereas all other - // protocols expect 0-indexed permutation - for permutation in &mut one_off_permutation { - *permutation -= &share_of_one; - } - Ok(one_off_permutation) -} - -#[cfg(all(test, unit_test))] -mod tests { - use super::multi_bit_permutation; - use crate::{ - ff::{Field, Fp31}, - protocol::{ - context::{Context, UpgradableContext, Validator}, - sort::bitwise_to_onehot, - }, - secret_sharing::{BitDecomposed, SharedValue}, - seq_join::SeqJoin, - test_fixture::{Reconstruct, Runner, TestWorld}, - }; - - const INPUT: [[u128; 3]; 6] = [ - [0, 0, 1], - [0, 1, 0], - [1, 1, 1], - [0, 0, 0], - [1, 0, 1], - [0, 0, 0], - ]; - - const EXPECTED: &[u128] = &[3, 2, 5, 0, 4, 1]; //100 010 111 000 101 000 - const EXPECTED_NUMS: &[usize] = &[4, 2, 7, 0, 5, 0]; - - #[tokio::test] - pub async fn semi_honest() { - let world = TestWorld::default(); - - let input = INPUT - .into_iter() - .map(|v| BitDecomposed::new(v.iter().map(|x| Fp31::truncate_from(*x)))) - .collect::>(); - let result = world - .semi_honest(input.into_iter(), |ctx, m_shares| async move { - multi_bit_permutation(ctx.validator().context(), &m_shares) - .await - .unwrap() - }) - .await; - - assert_eq!(&result.reconstruct(), EXPECTED); - } - - #[tokio::test] - pub async fn equality_checks() { - let world = TestWorld::default(); - - let input = INPUT - .into_iter() - .map(|v| BitDecomposed::new(v.iter().map(|x| Fp31::truncate_from(*x)))); - - let num_records = INPUT.len(); - - let result = world - .semi_honest(input, |ctx, m_shares| async move { - let ctx = ctx.set_total_records(num_records); - let mut equality_check_futures = Vec::with_capacity(num_records); - for (i, record) in m_shares.iter().enumerate() { - equality_check_futures.push(bitwise_to_onehot(ctx.clone(), i, record)); - } - ctx.try_join(equality_check_futures).await.unwrap() - }) - .await; - let reconstructed = result.reconstruct(); - for (rec, row) in reconstructed.iter().enumerate() { - for (j, check) in row.iter().enumerate() { - if EXPECTED_NUMS[rec] == j { - assert_eq!(*check, Fp31::ONE); - } else { - assert_eq!(*check, Fp31::ZERO); - } - } - } - } -} diff --git a/ipa-core/src/protocol/sort/secureapplyinv.rs b/ipa-core/src/protocol/sort/secureapplyinv.rs deleted file mode 100644 index ebced0c8f..000000000 --- a/ipa-core/src/protocol/sort/secureapplyinv.rs +++ /dev/null @@ -1,106 +0,0 @@ -use crate::{ - error::Error, - protocol::{ - basics::{apply_permutation::apply_inv, Reshare}, - context::Context, - sort::{apply_sort::shuffle_shares as shuffle_vectors, ApplyInvStep::ShuffleInputs}, - RecordId, - }, -}; - -pub async fn secureapplyinv_multi + Send + Sync>( - ctx: C, - input: Vec, - random_permutations_for_shuffle: (&[u32], &[u32]), - shuffled_sort_permutation: &[u32], -) -> Result, Error> { - let mut shuffled_input = shuffle_vectors( - input, - random_permutations_for_shuffle, - ctx.narrow(&ShuffleInputs), - ) - .await?; - - apply_inv(shuffled_sort_permutation, &mut shuffled_input); - Ok(shuffled_input) -} - -#[cfg(all(test, unit_test))] -mod tests { - mod semi_honest { - use std::iter::repeat_with; - - use rand::seq::SliceRandom; - - use crate::{ - ff::{Field, Fp31}, - protocol::{ - basics::apply_permutation::apply_inv, - context::{Context, SemiHonestContext, UpgradableContext, Validator}, - sort::{ - generate_permutation::shuffle_and_reveal_permutation, - secureapplyinv::secureapplyinv_multi, - }, - }, - rand::{thread_rng, Rng}, - secret_sharing::BitDecomposed, - test_fixture::{Reconstruct, Runner, TestWorld}, - }; - - #[tokio::test] - pub async fn multi() { - const BATCHSIZE: usize = 25; - const NUM_MULTI_BITS: usize = 3; - let world = TestWorld::default(); - - let input = repeat_with(|| { - BitDecomposed::new(repeat_with(|| thread_rng().gen::()).take(NUM_MULTI_BITS)) - }) - .take(BATCHSIZE) - .collect::>(); - - let mut permutation: Vec = (0..u32::try_from(BATCHSIZE).unwrap()).collect(); - permutation.shuffle(&mut thread_rng()); - - let mut expected_result = input.clone(); - - // Applying permutation on the input in clear to get the expected result - apply_inv(&permutation, &mut expected_result); - - let permutation_iter = permutation - .into_iter() - .map(u128::from) - .map(Fp31::truncate_from); - - // Flatten the input so that it can implement `IntoShares`. - let result = world - .semi_honest( - (input.into_iter(), permutation_iter), - |ctx, (m_shares, m_perms)| async move { - let v = ctx.narrow("shuffle_reveal").validator(); - let perm_and_randoms = shuffle_and_reveal_permutation::< - SemiHonestContext, - _, - _, - >(v.context(), m_perms, v) - .await - .unwrap(); - secureapplyinv_multi( - ctx, - m_shares, - ( - perm_and_randoms.randoms_for_shuffle.0.as_slice(), - perm_and_randoms.randoms_for_shuffle.1.as_slice(), - ), - &perm_and_randoms.revealed, - ) - .await - .unwrap() - }, - ) - .await; - - assert_eq!(&expected_result[..], &result.reconstruct()); - } - } -} diff --git a/ipa-core/src/protocol/sort/shuffle.rs b/ipa-core/src/protocol/sort/shuffle.rs deleted file mode 100644 index a92a2ecbb..000000000 --- a/ipa-core/src/protocol/sort/shuffle.rs +++ /dev/null @@ -1,391 +0,0 @@ -use embed_doc_image::embed_doc_image; -use rand::{seq::SliceRandom, Rng}; - -use super::ShuffleStep::{self, Shuffle1, Shuffle2, Shuffle3}; -use crate::{ - error::Error, - ff::Field, - helpers::{Direction, Role}, - protocol::{ - basics::{ - apply_permutation::{apply, apply_inv}, - Reshare, - }, - context::Context, - step::Step, - NoRecord, RecordId, - }, - secret_sharing::SecretSharing, -}; - -#[derive(Debug)] -/// This is SHUFFLE(Algorithm 1) described in . -/// This protocol shuffles the given inputs across 3 helpers making them indistinguishable to the helpers -/// We call shuffle with helpers involved as (H2, H3), (H3, H1) and (H1, H2). In other words, the shuffle is being called for -/// H1, H2 and H3 respectively (since they do not participate in the step) and hence are the recipients of the shuffle. -pub enum ShuffleOrUnshuffle { - Shuffle, - Unshuffle, -} - -impl Step for ShuffleOrUnshuffle {} -impl AsRef for ShuffleOrUnshuffle { - fn as_ref(&self) -> &str { - match self { - Self::Shuffle => "shuffle", - Self::Unshuffle => "unshuffle", - } - } -} - -/// This implements Fisher Yates shuffle described here -pub fn get_two_of_three_random_permutations( - batch_size: u32, - mut rng: (R, R), -) -> (Vec, Vec) { - let mut left_permutation = (0..batch_size).collect::>(); - let mut right_permutation = left_permutation.clone(); - - left_permutation.shuffle(&mut rng.0); - right_permutation.shuffle(&mut rng.1); - - (left_permutation, right_permutation) -} - -pub(super) fn shuffle_for_helper(which_step: ShuffleStep) -> Role { - match which_step { - Shuffle1 => Role::H1, - Shuffle2 => Role::H2, - Shuffle3 => Role::H3, - } -} - -/// `shuffle_or_unshuffle_once` is called for the helpers -/// i) 2 helpers receive permutation pair and choose the permutation to be applied -/// ii) 2 helpers apply the permutation to their shares -/// iii) reshare to `to_helper` -#[tracing::instrument(name = "shuffle_once", skip_all, fields(to = ?shuffle_for_helper(which_step)))] -pub(crate) async fn shuffle_or_unshuffle_once( - mut input: Vec, - random_permutations: (&[u32], &[u32]), - shuffle_or_unshuffle: ShuffleOrUnshuffle, - ctx: &C, - which_step: ShuffleStep, -) -> Result, Error> -where - C: Context, - S: Reshare + Send + Sync, -{ - let to_helper = shuffle_for_helper(which_step); - let ctx = ctx.narrow(&which_step); - - if to_helper != ctx.role() { - let permutation_to_apply = if to_helper.peer(Direction::Left) == ctx.role() { - random_permutations.0 - } else { - random_permutations.1 - }; - - match shuffle_or_unshuffle { - ShuffleOrUnshuffle::Shuffle => apply_inv(permutation_to_apply, &mut input), - ShuffleOrUnshuffle::Unshuffle => apply(permutation_to_apply, &mut input), - } - } - input.reshare(ctx, NoRecord, to_helper).await -} - -#[embed_doc_image("shuffle", "images/sort/shuffle.png")] -/// Shuffle calls `shuffle_or_unshuffle_once` three times with 2 helpers shuffling the shares each time. -/// Order of calling `shuffle_or_unshuffle_once` is shuffle with (H2, H3), (H3, H1) and (H1, H2). -/// Each shuffle requires communication between helpers to perform reshare. -/// Infrastructure has a pre-requisite to distinguish each communication step uniquely. -/// For this, we have three shuffle steps one per `shuffle_or_unshuffle_once` i.e. Step1, Step2 and Step3. -/// The Shuffle object receives a step function and appends a `ShuffleStep` to form a concrete step -/// ![Shuffle steps][shuffle] -pub async fn shuffle_shares + Reshare, C: Context>( - input: Vec, - random_permutations: (&[u32], &[u32]), - ctx: C, -) -> Result, Error> { - let input = shuffle_or_unshuffle_once( - input, - random_permutations, - ShuffleOrUnshuffle::Shuffle, - &ctx, - Shuffle1, - ) - .await?; - let input = shuffle_or_unshuffle_once( - input, - random_permutations, - ShuffleOrUnshuffle::Shuffle, - &ctx, - Shuffle2, - ) - .await?; - shuffle_or_unshuffle_once( - input, - random_permutations, - ShuffleOrUnshuffle::Shuffle, - &ctx, - Shuffle3, - ) - .await -} - -#[embed_doc_image("unshuffle", "images/sort/unshuffle.png")] -/// Unshuffle calls `shuffle_or_unshuffle_once` three times with 2 helpers shuffling the shares each time in the opposite order to shuffle. -/// Order of calling `shuffle_or_unshuffle_once` is shuffle with (H1, H2), (H3, H1) and (H2, H3) -/// ![Unshuffle steps][unshuffle] -pub async fn unshuffle_shares + Reshare, C: Context>( - input: Vec, - random_permutations: (&[u32], &[u32]), - ctx: C, -) -> Result, Error> { - let input = shuffle_or_unshuffle_once( - input, - random_permutations, - ShuffleOrUnshuffle::Unshuffle, - &ctx, - Shuffle3, - ) - .await?; - let input = shuffle_or_unshuffle_once( - input, - random_permutations, - ShuffleOrUnshuffle::Unshuffle, - &ctx, - Shuffle2, - ) - .await?; - shuffle_or_unshuffle_once( - input, - random_permutations, - ShuffleOrUnshuffle::Unshuffle, - &ctx, - Shuffle1, - ) - .await -} - -#[cfg(all(test, unit_test))] -mod tests { - use crate::{ - protocol::{sort::shuffle::get_two_of_three_random_permutations, step::Gate}, - rand::thread_rng, - test_fixture::{make_participants, permutation_valid}, - }; - - #[test] - fn random_sequence_generated() { - const BATCH_SIZE: u32 = 10000; - - let [p1, p2, p3] = make_participants(&mut thread_rng()); - let step = Gate::default(); - let perm1 = get_two_of_three_random_permutations(BATCH_SIZE, p1.sequential(&step)); - let perm2 = get_two_of_three_random_permutations(BATCH_SIZE, p2.sequential(&step)); - let perm3 = get_two_of_three_random_permutations(BATCH_SIZE, p3.sequential(&step)); - - assert_eq!(perm1.1, perm2.0); - assert_eq!(perm2.1, perm3.0); - assert_eq!(perm3.1, perm1.0); - - // Due to less randomness, the below three asserts can fail. However, the chance of failure is - // 1/18Quintillian (a billion billion since u64 is used to generate randomness)! Hopefully we should not hit that - assert_ne!(perm1.0, perm1.1); - assert_ne!(perm2.0, perm2.1); - assert_ne!(perm3.0, perm3.1); - - assert!(permutation_valid(&perm1.0)); - assert!(permutation_valid(&perm2.0)); - assert!(permutation_valid(&perm3.0)); - } - - mod semi_honest { - use std::collections::HashSet; - - use crate::{ - ff::{Field, Fp31}, - protocol::{ - context::Context, - sort::shuffle::{ - get_two_of_three_random_permutations, shuffle_shares, unshuffle_shares, - }, - }, - test_fixture::{Reconstruct, Runner, TestWorld}, - }; - - #[tokio::test] - async fn semi_honest() { - const BATCHSIZE: u8 = 25; - let world = TestWorld::default(); - - let input: Vec = (0..BATCHSIZE).collect(); - let hashed_input: HashSet = input.clone().into_iter().collect(); - - let result = world - .semi_honest( - input - .clone() - .into_iter() - .map(u128::from) - .map(Fp31::truncate_from), - |ctx, m_shares| async move { - let perms = - get_two_of_three_random_permutations(BATCHSIZE.into(), ctx.prss_rng()); - shuffle_shares( - m_shares, - (perms.0.as_slice(), perms.1.as_slice()), - ctx.clone(), - ) - .await - .unwrap() - }, - ) - .await; - - let mut hashed_output_secret = HashSet::new(); - let mut output_secret = Vec::new(); - for val in result.reconstruct() { - output_secret.push(u8::from(val)); - hashed_output_secret.insert(u8::from(val)); - } - - // Secrets should be shuffled - assert_ne!(output_secret, input); - - // Shuffled output should have same inputs - assert_eq!(hashed_output_secret, hashed_input); - } - - #[tokio::test] - async fn shuffle_unshuffle() { - const BATCHSIZE: usize = 5; - - let world = TestWorld::default(); - let input: Vec = (0..u128::try_from(BATCHSIZE).unwrap()).collect(); - - let result = world - .semi_honest( - input.clone().into_iter().map(Fp31::truncate_from), - |ctx, m_shares| async move { - let perms = get_two_of_three_random_permutations( - BATCHSIZE.try_into().unwrap(), - ctx.prss_rng(), - ); - let shuffled = shuffle_shares( - m_shares, - (perms.0.as_slice(), perms.1.as_slice()), - ctx.clone(), - ) - .await - .unwrap(); - - unshuffle_shares( - shuffled, - (perms.0.as_slice(), perms.1.as_slice()), - ctx.narrow("unshuffle"), - ) - .await - .unwrap() - }, - ) - .await; - - assert_eq!(&input[..], &result.reconstruct()); - } - } - - mod malicious { - use std::collections::HashSet; - - use crate::{ - ff::{Field, Fp31}, - protocol::{ - context::Context, - sort::shuffle::{ - get_two_of_three_random_permutations, shuffle_shares, unshuffle_shares, - }, - }, - test_fixture::{Reconstruct, Runner, TestWorld}, - }; - - #[tokio::test] - async fn malicious() { - const BATCHSIZE: u8 = 25; - let world = TestWorld::default(); - - let input: Vec = (0..BATCHSIZE).collect(); - let hashed_input: HashSet = input.clone().into_iter().collect(); - - let input_u128: Vec = input.iter().map(|x| u128::from(*x)).collect(); - - let result = world - .upgraded_malicious( - input_u128.clone().into_iter().map(Fp31::truncate_from), - |ctx, m_shares| async move { - let perms = - get_two_of_three_random_permutations(BATCHSIZE.into(), ctx.prss_rng()); - shuffle_shares( - m_shares, - (perms.0.as_slice(), perms.1.as_slice()), - ctx.clone(), - ) - .await - .unwrap() - }, - ) - .await; - - let mut hashed_output_secret = HashSet::new(); - let mut output_secret = Vec::new(); - for val in result.reconstruct() { - output_secret.push(u8::try_from(val.as_u128()).unwrap()); - hashed_output_secret.insert(u8::try_from(val.as_u128()).unwrap()); - } - - // Secrets should be shuffled - assert_ne!(output_secret, input); - - // Shuffled output should have same inputs - assert_eq!(hashed_output_secret, hashed_input); - } - - #[tokio::test] - async fn shuffle_unshuffle() { - const BATCHSIZE: usize = 5; - - let world = TestWorld::default(); - let input: Vec = (0..u128::try_from(BATCHSIZE).unwrap()).collect(); - - let result = world - .upgraded_malicious( - input.clone().into_iter().map(Fp31::truncate_from), - |ctx, m_shares| async move { - let perms = get_two_of_three_random_permutations( - BATCHSIZE.try_into().unwrap(), - ctx.prss_rng(), - ); - let shuffled = shuffle_shares( - m_shares, - (perms.0.as_slice(), perms.1.as_slice()), - ctx.clone(), - ) - .await - .unwrap(); - - unshuffle_shares( - shuffled, - (perms.0.as_slice(), perms.1.as_slice()), - ctx.narrow("unshuffle"), - ) - .await - .unwrap() - }, - ) - .await; - - assert_eq!(&input[..], &result.reconstruct()); - } - } -} diff --git a/ipa-core/src/protocol/step/compact.rs b/ipa-core/src/protocol/step/compact.rs index fb6fd873f..985954b55 100644 --- a/ipa-core/src/protocol/step/compact.rs +++ b/ipa-core/src/protocol/step/compact.rs @@ -34,16 +34,12 @@ impl Debug for Compact { } const ROOT_STATE: u16 = 0; -const QUERY_TYPE_SEMIHONEST_STATE: u16 = 65533; -const QUERY_TYPE_MALICIOUS_STATE: u16 = 65532; -const PRSS_EXCHANGE_STATE: u16 = 65531; -const QUERY_TYPE_OPRF_STATE: u16 = 65530; +const QUERY_TYPE_OPRF_STATE: u16 = 65533; +const PRSS_EXCHANGE_STATE: u16 = 65532; impl StepNarrow for Compact { fn narrow(&self, step: &QueryType) -> Self { match step { - QueryType::SemiHonestIpa(_) => Self(QUERY_TYPE_SEMIHONEST_STATE), - QueryType::MaliciousIpa(_) => Self(QUERY_TYPE_MALICIOUS_STATE), QueryType::OprfIpa(_) => Self(QUERY_TYPE_OPRF_STATE), _ => panic!("cannot narrow from the invalid step {}", step.as_ref()), } @@ -60,8 +56,6 @@ impl StepNarrow for Compact { fn static_reverse_state_map(state: u16) -> &'static str { match state { ROOT_STATE => "run-0", - QUERY_TYPE_SEMIHONEST_STATE => QueryType::SEMIHONEST_IPA_STR, - QUERY_TYPE_MALICIOUS_STATE => QueryType::MALICIOUS_IPA_STR, QUERY_TYPE_OPRF_STATE => QueryType::OPRF_IPA_STR, PRSS_EXCHANGE_STATE => PrssExchangeStep.as_ref(), _ => panic!("cannot as_ref() from the invalid state {state}"), @@ -71,10 +65,6 @@ fn static_reverse_state_map(state: u16) -> &'static str { fn static_deserialize_state_map(s: &str) -> u16 { if s == "run-0" { return ROOT_STATE; - } else if s == QueryType::SEMIHONEST_IPA_STR { - return QUERY_TYPE_SEMIHONEST_STATE; - } else if s == QueryType::MALICIOUS_IPA_STR { - return QUERY_TYPE_MALICIOUS_STATE; } else if s == QueryType::OPRF_IPA_STR { return QUERY_TYPE_OPRF_STATE; } else if s == PrssExchangeStep.as_ref() { diff --git a/ipa-core/src/protocol/step/mod.rs b/ipa-core/src/protocol/step/mod.rs index c97d2df2e..e96c9417d 100644 --- a/ipa-core/src/protocol/step/mod.rs +++ b/ipa-core/src/protocol/step/mod.rs @@ -74,11 +74,3 @@ impl From for BitOpStep { Self::Bit(v) } } - -/// Set of steps that define the IPA protocol. -#[derive(Step)] -pub(crate) enum IpaProtocolStep { - /// Sort shares by the match key - #[dynamic(64)] - Sort(usize), -} diff --git a/ipa-core/src/protocol/step/steps.txt b/ipa-core/src/protocol/step/steps.txt index 19dc96b52..8bffb0fb6 100644 --- a/ipa-core/src/protocol/step/steps.txt +++ b/ipa-core/src/protocol/step/steps.txt @@ -1,8679 +1,3 @@ -ipa_core::protocol::ipa::Step::after_convert_all_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::accumulate_credit::Step::active_bit_times_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::compare_bit_times_trigger_value -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::initialize_time_delta -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::random_bits_generator::FallbackStep::fallback -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::all_ones_and_final_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::reveal_c -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::and -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::dot_product -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::dot_product -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::reveal -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_current_exceeds_cap_or_else -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_next_event_has_same_match_key_or_else -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_next_exceeds_cap_or_else -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_report_credit_exceeds_cap_or_else -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::and -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::dot_product -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::dot_product -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::reveal -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::mask_source_credits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_times_helper_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::random_bits_generator::FallbackStep::fallback -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::all_ones_and_final_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::reveal_c -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::and -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::dot_product -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::dot_product -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::reveal -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::random_bits_generator::FallbackStep::fallback -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::all_ones_and_final_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::reveal_c -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::Step::compute_stop_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth3/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth3/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth4/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeModConvStep::upgrade_mod_conv1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeModConvStep::upgrade_mod_conv2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeModConvStep::upgrade_mod_conv3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::accumulate_credit::Step::active_bit_times_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::accumulate_credit::Step::active_bit_times_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::accumulate_credit/ipa_core::protocol::attribution::accumulate_credit::Step::active_bit_times_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::compare_bit_times_trigger_value -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::compare_bit_times_trigger_value/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::compare_bit_times_trigger_value/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::initialize_time_delta -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::initialize_time_delta/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::initialize_time_delta/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::random_bits_generator::FallbackStep::fallback -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::all_ones_and_final_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::all_ones_and_final_bits/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::all_ones_and_final_bits/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::random_bits_for_bit_decomposition/ipa_core::protocol::boolean::solved_bits::Step::reveal_c -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::and -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::and/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::and/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::dot_product -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::dot_product/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::dot_product/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::dot_product -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::dot_product/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::dot_product/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::apply_attribution_window/ipa_core::protocol::attribution::apply_attribution_window::Step::time_delta_less_than_cap/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::reveal -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::convert_helper_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_current_exceeds_cap_or_else -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_current_exceeds_cap_or_else/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_current_exceeds_cap_or_else/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_next_event_has_same_match_key_or_else -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_next_event_has_same_match_key_or_else/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_next_event_has_same_match_key_or_else/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_next_exceeds_cap_or_else -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_next_exceeds_cap_or_else/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_next_exceeds_cap_or_else/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_report_credit_exceeds_cap_or_else -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_report_credit_exceeds_cap_or_else/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::if_report_credit_exceeds_cap_or_else/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::and -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::and/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::and/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::dot_product -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::dot_product/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::dot_product/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::dot_product -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::dot_product/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::dot_product/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::reveal -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::mask_source_credits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::mask_source_credits/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::mask_source_credits/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth0/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth1/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth10/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth11/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth12/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth13/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth14/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth15/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth16/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth17/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth18/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth19/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth2/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth20/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth21/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth22/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth23/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth24/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth25/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth26/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth27/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth28/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth29/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth3/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth30/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth31/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth4/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth5/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth6/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth7/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth8/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_credit_or_credit_update/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_credit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_compare_bits/ipa_core::protocol::attribution::InteractionPatternStep::depth9/ipa_core::protocol::attribution::Step::current_stop_bit_times_successor_stop_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_times_helper_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_times_helper_bit/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::prefix_or_times_helper_bit/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::random_bits_generator::FallbackStep::fallback -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::all_ones_and_final_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::all_ones_and_final_bits/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::all_ones_and_final_bits/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::reveal_c -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::and -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::and/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::and/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::dot_product -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::dot_product/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::dot_product/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_hi/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::dot_product -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::dot_product/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::dot_product/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::compare_lo/ipa_core::protocol::boolean::comparison::Step::prefix_or/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::is_cap_less_than_current_contribution/ipa_core::protocol::boolean::comparison::GreaterThanConstantStep::reveal -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::random_bits_generator::FallbackStep::fallback -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::all_ones_and_final_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::all_ones_and_final_bits/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::all_ones_and_final_bits/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_if_all_ones/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::is_p_less_than_b/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_trimmed/ipa_core::protocol::boolean::bitwise_less_than_prime::Step::check_least_significant_bits/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit10/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit11/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit12/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit13/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit14/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit15/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit16/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit17/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit18/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit19/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit20/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit21/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit22/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit23/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit24/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit25/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit26/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit27/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit28/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit29/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit30/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit31/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit5/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit6/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit7/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit8/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::random_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit9/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::AttributionStep::perform_user_capping/ipa_core::protocol::attribution::credit_capping::Step::report_level_capping/ipa_core::protocol::attribution::credit_capping::Step::random_bits_for_comparison/ipa_core::protocol::boolean::solved_bits::Step::reveal_c -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_stop_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_stop_bits/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_stop_bits/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit3/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::mod_conv_breakdown_key_bits/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit4/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit10 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit11 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit12 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit13 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit14 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit15 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit8 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit9 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth0/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit5 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit6 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit7 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth1/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth2/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth3/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth3/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth3/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth3/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth3/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth3/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth4 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth4/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth4/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::aggregate_credit::Step::move_value_to_bucket/ipa_core::protocol::ipa_prf::prf_sharding::BinaryTreeDepthStep::depth4/ipa_core::protocol::ipa_prf::prf_sharding::bucket::BucketStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeModConvStep::upgrade_mod_conv1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeModConvStep::upgrade_mod_conv1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeModConvStep::upgrade_mod_conv2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeModConvStep::upgrade_mod_conv2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeModConvStep::upgrade_mod_conv3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeModConvStep::upgrade_mod_conv3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::timestamp -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::timestamp/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::timestamp/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_bit/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_bit/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_value -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_value/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_value/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::timestamp -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::timestamp/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::timestamp/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_bit/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_bit/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_value -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_value/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_value/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::timestamp -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::timestamp/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::timestamp/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_bit/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_bit/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_value -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_value/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_value/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::timestamp -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_value -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::timestamp -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_value -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::timestamp -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_bit -ipa_core::protocol::ipa::Step::after_convert_all_bits/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::trigger_value -ipa_core::protocol::ipa::Step::binary_validator -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit31 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit32 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit33 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit34 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit35 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit36 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit37 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit38 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit10 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit10/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit11 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit11/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit12 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit12/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit13 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit13/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit14 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit14/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit15 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit15/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit16 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit16/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit17 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit17/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit18 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit18/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit19 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit19/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit20 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit20/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit21 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit21/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit22 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit22/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit23 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit23/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit24 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit24/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit25 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit25/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit26 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit26/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit27 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit27/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit28 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit28/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit29 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit29/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit30 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit30/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit31 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit31/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit31/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit32 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit32/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit32/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit33 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit33/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit33/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit34 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit34/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit34/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit35 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit35/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit35/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit36 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit36/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit36/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit37 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit37/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit37/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit38 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit38/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit38/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit8 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit8/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit9 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::attribution::Step::compute_helper_bits/ipa_core::protocol::step::BitOpStep::bit9/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem10 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem10/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem10/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem11 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem11/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem11/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem12 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem12/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem12/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem13 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem13/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem13/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem14 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem14/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem14/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem15 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem15/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem15/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem16 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem16/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem16/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem17 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem17/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem17/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem18 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem18/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem18/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem19 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem19/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem19/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem20 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem20/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem20/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem21 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem21/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem21/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem22 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem22/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem22/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem23 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem23/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem23/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem24 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem24/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem24/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem25 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem25/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem25/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem26 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem26/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem26/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem27 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem27/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem27/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem28 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem28/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem28/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem29 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem29/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem29/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem30 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem30/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem30/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem31 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem31/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem31/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem32 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem32/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem32/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem33 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem33/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem33/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem34 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem34/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem34/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem35 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem35/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem35/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem36 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem36/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem36/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem37 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem37/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem37/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem38 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem38/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem38/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem39 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem39/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem39/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem8 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem8/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem8/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem9 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem9/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem9/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem10 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem10/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem10/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem11 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem11/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem11/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem12 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem12/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem12/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem13 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem13/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem13/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem14 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem14/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem14/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem15 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem15/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem15/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem16 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem16/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem16/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem17 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem17/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem17/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem18 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem18/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem18/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem19 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem19/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem19/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem20 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem20/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem20/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem21 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem21/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem21/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem22 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem22/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem22/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem23 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem23/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem23/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem24 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem24/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem24/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem25 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem25/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem25/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem26 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem26/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem26/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem27 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem27/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem27/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem28 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem28/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem28/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem29 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem29/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem29/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem30 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem30/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem30/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem31 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem31/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem31/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem32 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem32/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem32/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem33 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem33/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem33/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem34 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem34/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem34/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem35 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem35/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem35/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem36 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem36/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem36/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem37 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem37/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem37/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem38 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem38/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem38/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem39 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem39/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem39/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem8 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem8/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem8/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem9 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem9/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem9/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem10 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem10/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem10/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem11 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem11/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem11/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem12 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem12/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem12/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem13 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem13/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem13/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem14 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem14/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem14/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem15 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem15/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem15/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem16 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem16/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem16/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem17 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem17/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem17/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem18 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem18/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem18/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem19 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem19/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem19/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem20 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem20/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem20/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem21 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem21/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem21/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem22 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem22/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem22/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem23 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem23/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem23/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem24 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem24/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem24/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem25 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem25/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem25/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem26 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem26/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem26/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem27 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem27/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem27/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem28 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem28/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem28/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem29 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem29/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem29/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem30 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem30/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem30/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem31 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem31/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem31/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem32 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem32/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem32/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem33 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem33/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem33/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem34 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem34/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem34/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem35 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem35/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem35/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem36 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem36/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem36/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem37 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem37/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem37/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem38 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem38/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem38/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem39 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem39/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem39/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem8 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem8/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem8/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem9 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem9/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem9/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d10 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d10/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d11 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d11/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d12 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d12/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d13 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d13/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d14 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d14/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d15 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d15/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d16 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d16/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d17 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d17/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d18 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d18/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d19 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d19/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d20 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d20/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d21 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d21/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d22 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d22/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d23 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d23/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d24 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d24/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d25 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d25/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d26 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d26/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d27 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d27/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d28 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d28/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d29 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d29/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d3/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d30 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d30/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d31 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d31/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d32 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d32/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d33 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d33/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d34 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d34/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d35 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d35/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d36 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d36/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d37 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d37/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d38 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d38/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d39 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d39/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d7/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d8 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d8/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d9 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d9/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem10 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem11 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem12 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem13 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem14 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem15 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem16 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem17 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem18 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem19 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem20 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem21 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem22 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem23 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem24 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem25 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem26 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem27 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem28 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem29 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem30 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem31 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem32 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem33 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem34 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem35 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem36 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem37 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem38 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem39 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem8 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem9 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem10 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem11 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem12 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem13 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem14 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem15 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem16 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem17 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem18 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem19 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem20 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem21 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem22 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem23 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem24 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem25 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem26 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem27 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem28 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem29 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem30 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem31 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem32 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem33 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem34 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem35 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem36 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem37 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem38 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem39 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem8 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem9 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::breakdown_key/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem10 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem11 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem12 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem13 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem14 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem15 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem16 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem17 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem18 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem19 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem20 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem21 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem22 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem23 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem24 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem25 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem26 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem27 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem28 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem29 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem30 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem31 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem32 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem33 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem34 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem35 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem36 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem37 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem38 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem39 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem8 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::apply_sort_permutation/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::ipa::IPAInputRowResharableStep::match_key_shares/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem9 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_breakdown_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d0 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d1 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d10 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d11 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d12 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d13 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d14 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d15 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d16 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d17 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d18 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d19 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d2 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d20 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d21 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d22 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d23 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d24 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d25 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d26 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d27 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d28 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d29 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d3 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d30 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d31 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d32 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d33 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d34 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d35 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d36 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d37 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d38 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d39 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d4 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d5 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d6 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d7 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d8 -ipa_core::protocol::ipa::Step::binary_validator/ipa_core::protocol::ipa::Step::upgrade_match_key_bits/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::Upgrade2DVectors::upgrade2d9 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::multi_apply_inv0/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort0/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::multi_apply_inv1/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort1/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::multi_apply_inv10/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort10/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::multi_apply_inv11/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort11/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::multi_apply_inv12 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::multi_apply_inv12/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort12/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::multi_apply_inv2/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort2/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::multi_apply_inv3/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort3/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::multi_apply_inv4/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort4/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::multi_apply_inv5/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort5/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::multi_apply_inv6/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort6/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::multi_apply_inv7/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort7/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::multi_apply_inv8/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort8/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::duplicate_sop -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::basics::sum_of_product::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::malicious::UpgradeStep::upgrade/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::duplicate_multiply -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2/ipa_core::protocol::basics::mul::malicious::Step::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::randomness_for_validation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::malicious_protocol/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::ReshareStep::reshare_rx -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::validate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::multiply_with_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::check_zero/ipa_core::protocol::basics::check_zero::Step::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::propagate_u_and_w -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::context::validator::Step::validate/ipa_core::protocol::context::validator::ValidateStep::reveal_r -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::bit_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit4 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit5 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::bit_permutation/ipa_core::protocol::step::BitOpStep::bit6 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::compose -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::compose/ipa_core::protocol::sort::ComposeStep::unshuffle_rho/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit0/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit1/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::upgrade/ipa_core::protocol::context::semi_honest::UpgradeStep::upgrade_semi_honest/ipa_core::protocol::context::upgrade::UpgradeTripleStep::upgrade_bit_triple2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::modulus_conversion/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::convert_bit2/ipa_core::protocol::modulus_conversion::convert_shares::ConvertSharesStep::xor2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle1/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle2/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem0 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::multi_apply_inv9/ipa_core::protocol::sort::ApplyInvStep::shuffle_inputs/ipa_core::protocol::sort::ShuffleStep::shuffle3/ipa_core::protocol::sort::apply_sort::shuffle::InnerVectorElementStep::elem2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::generate -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::reveal -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle1 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle2 -ipa_core::protocol::ipa::Step::gen_sort_permutation_from_match_keys/ipa_core::protocol::sort::SortStep::sort_keys/ipa_core::protocol::step::IpaProtocolStep::sort9/ipa_core::protocol::sort::SortStep::shuffle_reveal_permutation/ipa_core::protocol::sort::ShuffleRevealPermutationStep::shuffle/ipa_core::protocol::sort::ShuffleStep::shuffle3 ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519 ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::generate_secret_sharing @@ -9349,7 +673,42 @@ ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass12/ipa_core::protocol::ipa_prf::quicksort::Step::reveal ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13 ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit0 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit1 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit10 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit11 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit12 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit13 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit14 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit15 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit16 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit17 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit18 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit19 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit2 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit20 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit21 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit22 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit23 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit24 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit25 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit26 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit27 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit28 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit29 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit3 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit30 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit31 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit4 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit5 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit6 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit7 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit8 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit9 ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::reveal +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::reveal ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass2 ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass2/ipa_core::protocol::ipa_prf::quicksort::Step::compare ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass2/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit0 diff --git a/ipa-core/src/query/executor.rs b/ipa-core/src/query/executor.rs index 1f663499c..75c6b2e1a 100644 --- a/ipa-core/src/query/executor.rs +++ b/ipa-core/src/query/executor.rs @@ -24,12 +24,12 @@ use crate::{ }, hpke::{KeyPair, KeyRegistry}, protocol::{ - context::{MaliciousContext, SemiHonestContext}, + context::SemiHonestContext, prss::Endpoint as PrssEndpoint, step::{Gate, StepNarrow}, }, query::{ - runner::{IpaQuery, OprfIpaQuery, QueryResult, SparseAggregateQuery}, + runner::{OprfIpaQuery, QueryResult}, state::RunningQuery, }, sync::Arc, @@ -56,7 +56,8 @@ where } } -#[allow(clippy::too_many_lines)] +/// Needless pass by value because IPA v3 does not make use of key registry yet. +#[allow(clippy::too_many_lines, clippy::needless_pass_by_value)] pub fn execute( config: QueryConfig, key_registry: Arc>, @@ -78,130 +79,6 @@ pub fn execute( Box::pin(execute_test_multiply::(prss, gateway, input)) }) } - #[cfg(any(test, feature = "weak-field"))] - (QueryType::SemiHonestIpa(ipa_config), FieldType::Fp31) => do_query( - config, - gateway, - input, - move |prss, gateway, config, input| { - let ctx = SemiHonestContext::new(prss, gateway); - Box::pin( - IpaQuery::::new(ipa_config, key_registry) - .execute(ctx, config.size, input) - .then(|res| ready(res.map(|out| Box::new(out) as Box))), - ) - }, - ), - (QueryType::SemiHonestIpa(ipa_config), FieldType::Fp32BitPrime) => do_query( - config, - gateway, - input, - move |prss, gateway, config, input| { - let ctx = SemiHonestContext::new(prss, gateway); - Box::pin( - IpaQuery::::new(ipa_config, key_registry) - .execute(ctx, config.size, input) - .then(|res| ready(res.map(|out| Box::new(out) as Box))), - ) - }, - ), - #[cfg(any(test, feature = "weak-field"))] - (QueryType::MaliciousIpa(ipa_config), FieldType::Fp31) => do_query( - config, - gateway, - input, - move |prss, gateway, config, input| { - let ctx = MaliciousContext::new(prss, gateway); - Box::pin( - IpaQuery::::new(ipa_config, key_registry) - .execute(ctx, config.size, input) - .then(|res| ready(res.map(|out| Box::new(out) as Box))), - ) - }, - ), - (QueryType::MaliciousIpa(ipa_config), FieldType::Fp32BitPrime) => do_query( - config, - gateway, - input, - move |prss, gateway, config, input| { - let ctx = MaliciousContext::new(prss, gateway); - Box::pin( - IpaQuery::::new(ipa_config, key_registry) - .execute(ctx, config.size, input) - .then(|res| ready(res.map(|out| Box::new(out) as Box))), - ) - }, - ), - #[cfg(any(test, feature = "weak-field"))] - (QueryType::SemiHonestSparseAggregate(aggregate_config), FieldType::Fp31) => do_query( - config, - gateway, - input, - move |prss, gateway, config, input| { - let ctx = SemiHonestContext::new(prss, gateway); - Box::pin( - SparseAggregateQuery::::new( - aggregate_config, - key_registry, - ) - .execute(ctx, config.size, input) - .then(|res| ready(res.map(|out| Box::new(out) as Box))), - ) - }, - ), - (QueryType::SemiHonestSparseAggregate(aggregate_config), FieldType::Fp32BitPrime) => { - do_query( - config, - gateway, - input, - move |prss, gateway, config, input| { - let ctx = SemiHonestContext::new(prss, gateway); - Box::pin( - SparseAggregateQuery::::new( - aggregate_config, - key_registry, - ) - .execute(ctx, config.size, input) - .then(|res| ready(res.map(|out| Box::new(out) as Box))), - ) - }, - ) - } - #[cfg(any(test, feature = "weak-field"))] - (QueryType::MaliciousSparseAggregate(aggregate_config), FieldType::Fp31) => do_query( - config, - gateway, - input, - move |prss, gateway, config, input| { - let ctx = MaliciousContext::new(prss, gateway); - Box::pin( - SparseAggregateQuery::::new( - aggregate_config, - key_registry, - ) - .execute(ctx, config.size, input) - .then(|res| ready(res.map(|out| Box::new(out) as Box))), - ) - }, - ), - (QueryType::MaliciousSparseAggregate(aggregate_config), FieldType::Fp32BitPrime) => { - do_query( - config, - gateway, - input, - move |prss, gateway, config, input| { - let ctx = MaliciousContext::new(prss, gateway); - Box::pin( - SparseAggregateQuery::::new( - aggregate_config, - key_registry, - ) - .execute(ctx, config.size, input) - .then(|res| ready(res.map(|out| Box::new(out) as Box))), - ) - }, - ) - } (QueryType::OprfIpa(ipa_config), FieldType::Fp32BitPrime) => do_query( config, gateway, diff --git a/ipa-core/src/query/processor.rs b/ipa-core/src/query/processor.rs index 18b46efa3..a18641661 100644 --- a/ipa-core/src/query/processor.rs +++ b/ipa-core/src/query/processor.rs @@ -318,12 +318,16 @@ mod tests { use futures_util::future::poll_immediate; use tokio::sync::Barrier; - use super::*; use crate::{ ff::FieldType, helpers::{ - query::{QueryType, QueryType::TestMultiply}, - HelperIdentity, InMemoryNetwork, PrepareQueryCallback, TransportCallbacks, + query::{PrepareQuery, QueryConfig, QueryType::TestMultiply}, + HelperIdentity, InMemoryNetwork, PrepareQueryCallback, RoleAssignment, Transport, + TransportCallbacks, + }, + protocol::QueryId, + query::{ + processor::Processor, state::StateError, NewQueryError, PrepareQueryError, QueryStatus, }, }; @@ -466,6 +470,7 @@ mod tests { mod prepare { use super::*; + use crate::query::QueryStatusError; fn prepare_query(identities: [HelperIdentity; 3]) -> PrepareQuery { PrepareQuery { @@ -531,12 +536,14 @@ mod tests { use super::*; use crate::{ error::BoxError, - ff::{Field, Fp31}, - helpers::query::IpaQueryConfig, - ipa_test_input, - protocol::{ipa::IPAInputRow, BreakdownKey, MatchKey}, + ff::{ + boolean_array::{BA20, BA3, BA8}, + Field, Fp31, + }, + helpers::query::{IpaQueryConfig, QueryType}, + protocol::ipa_prf::OPRFIPAInputRow, secret_sharing::replicated::semi_honest, - test_fixture::{input::GenericReportTestInput, Reconstruct, TestApp}, + test_fixture::{ipa::TestRawDataRecord, Reconstruct, TestApp}, }; #[tokio::test] @@ -602,26 +609,55 @@ mod tests { } async fn ipa_query(app: &TestApp) -> Result<(), BoxError> { - let records: Vec> = ipa_test_input!( - [ - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 2, trigger_value: 0 }, - { timestamp: 0, match_key: 68362, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 0, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 5 }, - { timestamp: 0, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 2 }, - ]; - (Fp31, MatchKey, BreakdownKey) - ); + let records = vec![ + TestRawDataRecord { + timestamp: 0, + user_id: 12345, + is_trigger_report: false, + breakdown_key: 1, + trigger_value: 0, + }, + TestRawDataRecord { + timestamp: 0, + user_id: 12345, + is_trigger_report: false, + breakdown_key: 2, + trigger_value: 0, + }, + TestRawDataRecord { + timestamp: 0, + user_id: 68362, + is_trigger_report: false, + breakdown_key: 1, + trigger_value: 0, + }, + TestRawDataRecord { + timestamp: 0, + user_id: 12345, + is_trigger_report: true, + breakdown_key: 0, + trigger_value: 5, + }, + TestRawDataRecord { + timestamp: 0, + user_id: 68362, + is_trigger_report: true, + breakdown_key: 0, + trigger_value: 2, + }, + ]; let record_count = records.len(); let _results = app - .execute_query::<_, Vec>>( + // Achtung: OPRF IPA executor assumes BA8, BA3, BA20 to be the encodings of + // inputs - using anything else will lead to a padding error. + .execute_query::<_, Vec>>( records.into_iter(), QueryConfig { size: record_count.try_into().unwrap(), field_type: FieldType::Fp31, - query_type: QueryType::SemiHonestIpa(IpaQueryConfig { - per_user_credit_cap: 3, + query_type: QueryType::OprfIpa(IpaQueryConfig { + per_user_credit_cap: 8, max_breakdown_key: 3, attribution_window_seconds: None, num_multi_bits: 3, diff --git a/ipa-core/src/query/runner/aggregate.rs b/ipa-core/src/query/runner/aggregate.rs deleted file mode 100644 index 23cd6e7ba..000000000 --- a/ipa-core/src/query/runner/aggregate.rs +++ /dev/null @@ -1,101 +0,0 @@ -use std::marker::PhantomData; - -use futures_util::TryStreamExt; - -use crate::{ - error::Error, - ff::{Gf2, Gf8Bit, PrimeField, Serializable}, - helpers::{ - query::{QuerySize, SparseAggregateQueryConfig}, - BodyStream, RecordsStream, - }, - hpke::{KeyPair, KeyRegistry}, - protocol::{ - aggregation::{sparse_aggregate, SparseAggregateInputRow}, - basics::{Reshare, ShareKnownValue}, - context::{UpgradableContext, UpgradedContext}, - BasicProtocols, BreakdownKey, RecordId, - }, - secret_sharing::{ - replicated::{malicious::DowngradeMalicious, semi_honest::AdditiveShare as Replicated}, - Linear as LinearSecretSharing, LinearRefOps, - }, - sync::Arc, -}; - -pub struct SparseAggregateQuery { - config: SparseAggregateQueryConfig, - _key_registry: Arc>, - phantom_data: PhantomData<(F, C, S)>, -} - -impl SparseAggregateQuery { - pub fn new( - config: SparseAggregateQueryConfig, - key_registry: Arc>, - ) -> Self { - Self { - config, - _key_registry: key_registry, - phantom_data: PhantomData, - } - } -} - -impl SparseAggregateQuery -where - C: UpgradableContext + Send, - C::UpgradedContext: UpgradedContext, - S: LinearSecretSharing - + BasicProtocols, F> - + Reshare, RecordId> - + Serializable - + DowngradeMalicious> - + 'static, - for<'r> &'r S: LinearRefOps<'r, S, F>, - C::UpgradedContext: UpgradedContext, - SB: LinearSecretSharing - + BasicProtocols, Gf2> - + DowngradeMalicious> - + 'static, - F: PrimeField, - Replicated: Serializable + ShareKnownValue, - SparseAggregateInputRow: Serializable, -{ - #[tracing::instrument("sparse_aggregate_query", skip_all, fields(sz=%query_size))] - pub async fn execute<'a>( - self, - ctx: C, - query_size: QuerySize, - input_stream: BodyStream, - ) -> Result>, Error> { - let Self { - config, - _key_registry, - phantom_data: _, - } = self; - let sz = usize::from(query_size); - - //TODO(taikiy): - // 1. decrypt the input - // 2. deserialize the input into `AggregateInputRow` with `contribution_bits` size field - - let input = { - //TODO: Replace `Gf8Bit` with an appropriate type specified by the config `contribution_bits` - let mut v = RecordsStream::, _>::new( - input_stream, - ) - .try_concat() - .await?; - v.truncate(sz); - v - }; - - sparse_aggregate( - ctx, - input.as_slice(), - usize::try_from(config.num_contributions).unwrap(), - ) - .await - } -} diff --git a/ipa-core/src/query/runner/ipa.rs b/ipa-core/src/query/runner/ipa.rs deleted file mode 100644 index ed4a3da43..000000000 --- a/ipa-core/src/query/runner/ipa.rs +++ /dev/null @@ -1,339 +0,0 @@ -use std::marker::PhantomData; - -use futures::{ - stream::{iter, repeat}, - StreamExt, TryStreamExt, -}; - -use crate::{ - error::Error, - ff::{Gf2, PrimeField, Serializable}, - helpers::{ - query::{IpaQueryConfig, QuerySize}, - BodyStream, LengthDelimitedStream, RecordsStream, - }, - hpke::{KeyPair, KeyRegistry}, - protocol::{ - basics::{Reshare, ShareKnownValue}, - context::{UpgradableContext, UpgradeContext, UpgradeToMalicious, UpgradedContext}, - ipa::{ipa, ArithmeticallySharedIPAInputs, IPAInputRow}, - modulus_conversion::BitConversionTriple, - sort::generate_permutation::ShuffledPermutationWrapper, - BasicProtocols, BreakdownKey, MatchKey, RecordId, - }, - report::{EncryptedReport, EventType, InvalidReportError}, - secret_sharing::{ - replicated::{malicious::DowngradeMalicious, semi_honest::AdditiveShare as Replicated}, - Linear as LinearSecretSharing, LinearRefOps, - }, - sync::Arc, -}; - -pub struct IpaQuery { - config: IpaQueryConfig, - key_registry: Arc>, - phantom_data: PhantomData<(F, C, S)>, -} - -impl IpaQuery { - pub fn new(config: IpaQueryConfig, key_registry: Arc>) -> Self { - Self { - config, - key_registry, - phantom_data: PhantomData, - } - } -} - -impl IpaQuery -where - C: UpgradableContext + Send, - C::UpgradedContext: UpgradedContext, - S: LinearSecretSharing - + BasicProtocols, F> - + Reshare, RecordId> - + Serializable - + DowngradeMalicious> - + 'static, - for<'r> &'r S: LinearRefOps<'r, S, F>, - C::UpgradedContext: UpgradedContext, - SB: LinearSecretSharing - + BasicProtocols, Gf2> - + DowngradeMalicious> - + 'static, - for<'r> &'r SB: LinearRefOps<'r, SB, Gf2>, - F: PrimeField, - Replicated: Serializable + ShareKnownValue, - IPAInputRow: Serializable, - ShuffledPermutationWrapper>: DowngradeMalicious>, - for<'u> UpgradeContext<'u, C::UpgradedContext, F, RecordId>: UpgradeToMalicious<'u, BitConversionTriple>, BitConversionTriple> - + UpgradeToMalicious< - 'u, - ArithmeticallySharedIPAInputs>, - ArithmeticallySharedIPAInputs, - >, -{ - #[tracing::instrument("ipa_query", skip_all, fields(sz=%query_size))] - pub async fn execute<'a>( - self, - ctx: C, - query_size: QuerySize, - input_stream: BodyStream, - ) -> Result>, Error> { - let Self { - config, - key_registry, - phantom_data: _, - } = self; - tracing::info!("New query: {config:?}"); - let sz = usize::from(query_size); - - let input = if config.plaintext_match_keys { - let mut v = - RecordsStream::, _>::new(input_stream) - .try_concat() - .await?; - v.truncate(sz); - v - } else { - LengthDelimitedStream::, _>::new( - input_stream, - ) - .map_err(Into::::into) - .map_ok(|enc_reports| { - iter(enc_reports.into_iter().map(|enc_report| { - enc_report - .decrypt(key_registry.as_ref()) - .map_err(Into::::into) - })) - }) - .try_flatten() - .take(sz) - .zip(repeat(ctx.clone())) - .map(|(res, ctx)| { - res.and_then(|report| { - let timestamp = Replicated::::share_known_value( - &ctx, - F::try_from(report.timestamp.into()) - .map_err(|_| InvalidReportError::Timestamp(report.timestamp))?, - ); - let breakdown_key = - Replicated::::share_known_value(&ctx, report.breakdown_key); - let is_trigger_bit = Replicated::::share_known_value( - &ctx, - match report.event_type { - EventType::Source => F::ZERO, - EventType::Trigger => F::ONE, - }, - ); - - Ok(IPAInputRow { - timestamp, - mk_shares: report.mk_shares, - is_trigger_bit, - breakdown_key, - trigger_value: report.trigger_value, - }) - }) - }) - .try_collect::>() - .await? - }; - - ipa(ctx, input.as_slice(), config).await - } -} - -/// no dependency on `weak-field` feature because it is enabled in tests by default -#[cfg(all(test, unit_test))] -mod tests { - use std::iter::zip; - - use generic_array::GenericArray; - use rand::rngs::StdRng; - use rand_core::SeedableRng; - use typenum::Unsigned; - - use super::*; - use crate::{ - ff::Fp31, - ipa_test_input, - report::{Report, DEFAULT_KEY_ID}, - secret_sharing::IntoShares, - test_fixture::{input::GenericReportTestInput, join3v, Reconstruct, TestWorld}, - }; - - #[tokio::test] - async fn ipa() { - const EXPECTED: &[u128] = &[0, 2, 3]; - - let records: Vec> = ipa_test_input!( - [ - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 2, trigger_value: 0 }, - { timestamp: 0, match_key: 68362, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 0, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 5 }, - { timestamp: 0, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 2 }, - // everything below this line will be ignored in IPA - { timestamp: 2, match_key: 68362, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 3, match_key: 68362, is_trigger_report: 1, breakdown_key: 1, trigger_value: 20 }, - ]; - (Fp31, MatchKey, BreakdownKey) - ); - let query_size = QuerySize::try_from(records.len() - 2).unwrap(); - - let records = records - .into_iter() - .share() - // TODO: a trait would be useful here to convert IntoShares to IntoShares> - .map(|shares| { - shares - .into_iter() - .flat_map(|share: IPAInputRow| { - let mut buf = [0u8; as Serializable>::Size::USIZE]; - share.serialize(GenericArray::from_mut_slice(&mut buf)); - - buf - }) - .collect::>() - }); - - let world = TestWorld::default(); - let contexts = world.contexts(); - #[allow(clippy::large_futures)] - let results = join3v(records.into_iter().zip(contexts).map(|(shares, ctx)| { - let query_config = IpaQueryConfig { - num_multi_bits: 3, - per_user_credit_cap: 3, - attribution_window_seconds: None, - max_breakdown_key: 3, - plaintext_match_keys: true, - }; - let input = BodyStream::from(shares); - // Note that we ignore the last 2 records to test that runner follows the rule - // to take up to `record_count` reports. Everything else outside that will - // be ignored - IpaQuery::::new(query_config, Arc::new(KeyRegistry::empty())) - .execute(ctx, query_size, input) - })) - .await; - assert_eq!(results.reconstruct(), EXPECTED); - } - - #[tokio::test] - async fn malicious_ipa() { - const EXPECTED: &[u128] = &[0, 2, 3]; - - let records: Vec> = ipa_test_input!( - [ - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 2, trigger_value: 0 }, - { timestamp: 0, match_key: 68362, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 0, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 5 }, - { timestamp: 0, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 2 }, - ]; - (Fp31, MatchKey, BreakdownKey) - ); - let query_size = QuerySize::try_from(records.len()).unwrap(); - - let records = records - .into_iter() - .share() - // TODO: a trait would be useful here to convert IntoShares to IntoShares> - .map(|shares| { - shares - .into_iter() - .flat_map(|share: IPAInputRow| { - let mut buf = [0u8; as Serializable>::Size::USIZE]; - share.serialize(GenericArray::from_mut_slice(&mut buf)); - - buf - }) - .collect::>() - }); - - let world = TestWorld::default(); - let contexts = world.malicious_contexts(); - - #[allow(clippy::large_futures)] - let results = join3v(records.into_iter().zip(contexts).map(|(shares, ctx)| { - let query_config = IpaQueryConfig { - num_multi_bits: 3, - per_user_credit_cap: 3, - attribution_window_seconds: None, - max_breakdown_key: 3, - plaintext_match_keys: true, - }; - IpaQuery::::new(query_config, Arc::new(KeyRegistry::empty())).execute( - ctx, - query_size, - shares.into(), - ) - })) - .await; - - assert_eq!(results.reconstruct(), EXPECTED); - } - - #[tokio::test] - async fn encrypted_match_keys() { - const EXPECTED: &[u128] = &[0, 2, 3]; - - let records: Vec> = ipa_test_input!( - [ - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 0, match_key: 12345, is_trigger_report: 0, breakdown_key: 2, trigger_value: 0 }, - { timestamp: 0, match_key: 68362, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 0, match_key: 12345, is_trigger_report: 1, breakdown_key: 0, trigger_value: 5 }, - { timestamp: 0, match_key: 68362, is_trigger_report: 1, breakdown_key: 0, trigger_value: 2 }, - // everything below this line will be ignored in IPA - { timestamp: 2, match_key: 68362, is_trigger_report: 0, breakdown_key: 1, trigger_value: 0 }, - { timestamp: 3, match_key: 68362, is_trigger_report: 1, breakdown_key: 1, trigger_value: 20 }, - ]; - (Fp31, MatchKey, BreakdownKey) - ); - let query_size = QuerySize::try_from(records.len() - 2).unwrap(); - - let mut rng = StdRng::seed_from_u64(42); - let key_id = DEFAULT_KEY_ID; - let key_registry = Arc::new(KeyRegistry::random(1, &mut rng)); - - let mut buffers: [_; 3] = std::array::from_fn(|_| Vec::new()); - - let shares: [Vec>; 3] = records.into_iter().share(); - for (buf, shares) in zip(&mut buffers, shares) { - for share in shares { - share - .delimited_encrypt_to(key_id, key_registry.as_ref(), &mut rng, buf) - .unwrap(); - } - } - - let world = TestWorld::default(); - let contexts = world.contexts(); - #[allow(clippy::large_futures)] - let results = join3v(buffers.into_iter().zip(contexts).map(|(buffer, ctx)| { - let query_config = IpaQueryConfig { - num_multi_bits: 3, - per_user_credit_cap: 3, - attribution_window_seconds: None, - max_breakdown_key: 3, - plaintext_match_keys: false, - }; - let input = BodyStream::from(buffer); - IpaQuery::::new(query_config, Arc::clone(&key_registry)) - .execute(ctx, query_size, input) - })) - .await; - - assert_eq!(results.reconstruct(), EXPECTED); - } -} diff --git a/ipa-core/src/query/runner/mod.rs b/ipa-core/src/query/runner/mod.rs index 3d1a3bebd..7d41a4af3 100644 --- a/ipa-core/src/query/runner/mod.rs +++ b/ipa-core/src/query/runner/mod.rs @@ -1,5 +1,3 @@ -mod aggregate; -mod ipa; mod oprf_ipa; #[cfg(any(test, feature = "cli", feature = "test-fixture"))] mod test_multiply; @@ -7,7 +5,7 @@ mod test_multiply; #[cfg(any(test, feature = "cli", feature = "test-fixture"))] pub(super) use test_multiply::execute_test_multiply; -pub(super) use self::{aggregate::SparseAggregateQuery, ipa::IpaQuery, oprf_ipa::OprfIpaQuery}; +pub(super) use self::oprf_ipa::OprfIpaQuery; use crate::{error::Error, query::ProtocolResult}; pub(super) type QueryResult = Result, Error>; diff --git a/ipa-core/src/query/runner/oprf_ipa.rs b/ipa-core/src/query/runner/oprf_ipa.rs index 4c013d259..b1ab90495 100644 --- a/ipa-core/src/query/runner/oprf_ipa.rs +++ b/ipa-core/src/query/runner/oprf_ipa.rs @@ -128,14 +128,22 @@ where #[cfg(all(test, unit_test))] mod tests { - use std::iter::zip; + use std::{iter::zip, sync::Arc}; use rand::rngs::StdRng; use rand_core::SeedableRng; - use super::*; use crate::{ - ff::{Field, Fp31}, + ff::{ + boolean_array::{BA20, BA3, BA8}, + Field, Fp31, + }, + helpers::{ + query::{IpaQueryConfig, QuerySize}, + BodyStream, + }, + hpke::KeyRegistry, + query::runner::OprfIpaQuery, report::{OprfReport, DEFAULT_KEY_ID}, secret_sharing::IntoShares, test_fixture::{ipa::TestRawDataRecord, join3v, Reconstruct, TestWorld}, diff --git a/ipa-core/src/report.rs b/ipa-core/src/report.rs index 6b16e4c9e..067043118 100644 --- a/ipa-core/src/report.rs +++ b/ipa-core/src/report.rs @@ -12,10 +12,10 @@ use typenum::{Sum, Unsigned, U1, U16}; use crate::{ error::BoxError, - ff::{boolean_array::BA64, GaloisField, Gf40Bit, Gf8Bit, PrimeField, Serializable}, + ff::{boolean_array::BA64, Serializable}, hpke::{ - open_in_place, seal_in_place, CryptError, EncapsulationSize, FieldShareCrypt, Info, - KeyPair, KeyRegistry, PublicKeyRegistry, TagSize, + open_in_place, seal_in_place, CryptError, EncapsulationSize, Info, KeyPair, KeyRegistry, + PublicKeyRegistry, TagSize, }, secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, SharedValue}, }; @@ -159,268 +159,8 @@ pub enum InvalidReportError { Length(usize, usize), } -/// A binary report as submitted by a report collector, containing encrypted match key shares. -#[derive(Copy, Clone, Eq, PartialEq)] -pub struct EncryptedReport -where - B: Deref, - F: PrimeField, - Replicated: Serializable, - MK: FieldShareCrypt, - BK: GaloisField, -{ - data: B, - phantom_data: PhantomData<(F, MK, BK)>, -} - // TODO: If we are parsing reports from CSV files, we may also want an owned version of EncryptedReport. -// Report structure: -// * 0..4: `timestamp` -// * 4: `breakdown_key` -// * 5..a: `trigger_value` -// * a..b: `encap_key` -// * b..c: `mk_ciphertext` -// * c: `event_type` -// * c+1: `key_id` -// * c+2..c+4: `epoch` -// * c+4..: `site_domain` -impl EncryptedReport -where - F: PrimeField, - Replicated: Serializable, - B: Deref, -{ - // Constants are defined for: - // 1. Offsets that are calculated from typenum values - // 2. Offsets that appear in the code in more places than two successive accessors. (Some - // offsets are used by validations in the `from_bytes` constructor.) - const ENCAP_KEY_OFFSET: usize = 5 + 2 * ::Size::USIZE; - const CIPHERTEXT_OFFSET: usize = - Self::ENCAP_KEY_OFFSET + ::EncapKeySize::USIZE; - const EVENT_TYPE_OFFSET: usize = - Self::CIPHERTEXT_OFFSET + ::CiphertextSize::USIZE; - const SITE_DOMAIN_OFFSET: usize = Self::EVENT_TYPE_OFFSET + 4; - - /// ## Panics - /// Never. - pub fn timestamp(&self) -> u32 { - u32::from_le_bytes(self.data[0..4].try_into().unwrap()) // infallible slice-to-array conversion - } - - pub fn breakdown_key(&self) -> Gf8Bit { - Gf8Bit::deserialize_infallible(GenericArray::from_slice(&[self.data[4]])) - } - - /// Attempts to extract trigger value from the report. - /// - /// ## Errors - /// If trigger value provided in the report is invalid. - pub fn trigger_value(&self) -> Result, InvalidReportError> { - Replicated::::deserialize(GenericArray::from_slice( - &self.data[5..Self::ENCAP_KEY_OFFSET], - )) - .map_err(|e| InvalidReportError::DeserializationError("trigger_value", e.into())) - } - - pub fn encap_key(&self) -> &[u8] { - &self.data[Self::ENCAP_KEY_OFFSET..Self::CIPHERTEXT_OFFSET] - } - - pub fn match_key_ciphertext(&self) -> &[u8] { - &self.data[Self::CIPHERTEXT_OFFSET..Self::EVENT_TYPE_OFFSET] - } - - /// ## Panics - /// Only if a `Report` constructor failed to validate the contents properly, which would be a bug. - pub fn event_type(&self) -> EventType { - EventType::try_from(self.data[Self::EVENT_TYPE_OFFSET]).unwrap() // validated on construction - } - - pub fn key_id(&self) -> KeyIdentifier { - self.data[Self::EVENT_TYPE_OFFSET + 1] - } - - /// ## Panics - /// Never. - pub fn epoch(&self) -> Epoch { - u16::from_le_bytes( - self.data[Self::EVENT_TYPE_OFFSET + 2..Self::SITE_DOMAIN_OFFSET] - .try_into() - .unwrap(), // infallible slice-to-array conversion - ) - } - - /// ## Panics - /// Only if a `Report` constructor failed to validate the contents properly, which would be a bug. - pub fn site_domain(&self) -> &str { - std::str::from_utf8(&self.data[Self::SITE_DOMAIN_OFFSET..]).unwrap() // validated on construction - } - - /// ## Errors - /// If the report contents are invalid. - pub fn from_bytes(bytes: B) -> Result { - EventType::try_from(bytes[Self::EVENT_TYPE_OFFSET])?; - let site_domain = &bytes[Self::SITE_DOMAIN_OFFSET..]; - if !site_domain.is_ascii() { - return Err(NonAsciiStringError::from(site_domain).into()); - } - Ok(Self { - data: bytes, - phantom_data: PhantomData, - }) - } - - /// ## Errors - /// If the match key shares in the report cannot be decrypted (e.g. due to a - /// failure of the authenticated encryption). - /// ## Panics - /// Should not panic. Only panics if a `Report` constructor failed to validate the - /// contents properly, which would be a bug. - pub fn decrypt( - &self, - key_registry: &KeyRegistry, - ) -> Result, InvalidReportError> { - let info = Info::new( - self.key_id(), - self.epoch(), - self.event_type(), - HELPER_ORIGIN, - self.site_domain(), - ) - .unwrap(); // validated on construction - - let mut ciphertext: GenericArray::CiphertextSize> = - *GenericArray::from_slice(self.match_key_ciphertext()); - let plaintext = open_in_place(key_registry, self.encap_key(), &mut ciphertext, &info)?; - - Ok(Report { - timestamp: self.timestamp(), - mk_shares: ::SemiHonestShares::deserialize_infallible( - GenericArray::from_slice(plaintext), - ), - event_type: self.event_type(), - breakdown_key: self.breakdown_key(), - trigger_value: self.trigger_value()?, - epoch: self.epoch(), - site_domain: self.site_domain().to_owned(), - }) - } -} - -impl TryFrom for EncryptedReport -where - F: PrimeField, - Replicated: Serializable, -{ - type Error = InvalidReportError; - - fn try_from(bytes: Bytes) -> Result { - EncryptedReport::from_bytes(bytes) - } -} - -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct Report -where - F: PrimeField, - Replicated: Serializable, - MK: FieldShareCrypt, - BK: GaloisField, -{ - pub timestamp: u32, - pub mk_shares: ::SemiHonestShares, - pub event_type: EventType, - pub breakdown_key: BK, - pub trigger_value: Replicated, - pub epoch: Epoch, - pub site_domain: String, -} - -impl Report -where - F: PrimeField, - Replicated: Serializable, -{ - /// # Panics - /// If report length does not fit in `u16`. - pub fn encrypted_len(&self) -> u16 { - let len = EncryptedReport::::SITE_DOMAIN_OFFSET - + self.site_domain.as_bytes().len(); - len.try_into().unwrap() - } - - /// # Errors - /// If there is a problem encrypting the report. - pub fn delimited_encrypt_to( - &self, - key_id: KeyIdentifier, - key_registry: &impl PublicKeyRegistry, - rng: &mut R, - out: &mut B, - ) -> Result<(), InvalidReportError> { - out.put_u16_le(self.encrypted_len()); - self.encrypt_to(key_id, key_registry, rng, out) - } - - /// # Errors - /// If there is a problem encrypting the report. - pub fn encrypt( - &self, - key_id: KeyIdentifier, - key_registry: &impl PublicKeyRegistry, - rng: &mut R, - ) -> Result, InvalidReportError> { - let mut out = Vec::with_capacity(usize::from(self.encrypted_len())); - self.encrypt_to(key_id, key_registry, rng, &mut out)?; - debug_assert_eq!(out.len(), usize::from(self.encrypted_len())); - Ok(out) - } - - /// # Errors - /// If there is a problem encrypting the report. - pub fn encrypt_to( - &self, - key_id: KeyIdentifier, - key_registry: &impl PublicKeyRegistry, - rng: &mut R, - out: &mut B, - ) -> Result<(), InvalidReportError> { - let info = Info::new( - key_id, - self.epoch, - self.event_type, - HELPER_ORIGIN, - self.site_domain.as_ref(), - )?; - - let mut plaintext = GenericArray::default(); - self.mk_shares.serialize(&mut plaintext); - - let (encap_key, ciphertext, tag) = - seal_in_place(key_registry, plaintext.as_mut(), &info, rng)?; - - out.put_slice(&self.timestamp.to_le_bytes()); - - let mut bk = GenericArray::default(); - self.breakdown_key.serialize(&mut bk); - out.put_slice(bk.as_slice()); - - let mut trigger_value = GenericArray::default(); - self.trigger_value.serialize(&mut trigger_value); - out.put_slice(trigger_value.as_slice()); - out.put_slice(&encap_key.to_bytes()); - out.put_slice(ciphertext); - out.put_slice(&tag.to_bytes()); - out.put_slice(&[u8::from(&self.event_type)]); - out.put_slice(&[key_id]); - out.put_slice(&self.epoch.to_le_bytes()); - out.put_slice(self.site_domain.as_bytes()); - - Ok(()) - } -} - /// A binary report as submitted by a report collector, containing encrypted `OprfReport` /// An `EncryptedOprfReport` consists of: /// `ct_mk`: Enc(`match_key`) @@ -786,48 +526,16 @@ where #[cfg(all(test, unit_test))] mod test { - use rand::{distributions::Alphanumeric, rngs::StdRng, thread_rng, Rng}; - use rand_core::SeedableRng; + use rand::{distributions::Alphanumeric, thread_rng, Rng}; use super::*; use crate::{ - ff::{ - boolean_array::{BA20, BA3, BA8}, - Fp32BitPrime, Gf40Bit, Gf8Bit, - }, + ff::boolean_array::{BA20, BA3, BA8}, report, report::EventType::{Source, Trigger}, secret_sharing::replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, }; - #[test] - fn enc_dec_roundtrip() { - let mut rng = StdRng::from_seed([1_u8; 32]); - - let report = Report:: { - timestamp: rng.gen(), - mk_shares: (rng.gen(), rng.gen()).into(), - event_type: EventType::Trigger, - breakdown_key: rng.gen(), - trigger_value: (rng.gen(), rng.gen()).into(), - epoch: rng.gen(), - site_domain: (&mut rng) - .sample_iter(Alphanumeric) - .map(char::from) - .take(10) - .collect(), - }; - - let key_registry = KeyRegistry::random(1, &mut rng); - let key_id = 0; - - let enc_report_bytes = report.encrypt(key_id, &key_registry, &mut rng).unwrap(); - let enc_report = EncryptedReport::from_bytes(enc_report_bytes.as_slice()).unwrap(); - let dec_report = enc_report.decrypt(&key_registry).unwrap(); - - assert_eq!(dec_report, report); - } - #[test] fn enc_dec_roundtrip_oprf() { let mut rng = thread_rng(); @@ -892,53 +600,18 @@ mod test { assert!(dec_report.is_err()); } - #[test] - fn decrypt() { - let mut rng = StdRng::from_seed([1_u8; 32]); - - let expected = Report:: { - timestamp: rng.gen(), - mk_shares: (rng.gen(), rng.gen()).into(), - event_type: EventType::Trigger, - breakdown_key: rng.gen(), - trigger_value: (rng.gen(), rng.gen()).into(), - epoch: rng.gen(), - site_domain: (&mut rng) - .sample_iter(Alphanumeric) - .map(char::from) - .take(10) - .collect(), - }; - - let key_registry = KeyRegistry::random(1, &mut rng); - - let enc_report_bytes = hex::decode( - "\ - 3301e8d7528e08671418d2164dc80a3403e4aadd01be4263b723ba2204638c20\ - 830500710b2bdb931f5f429f234abddf09109ecb2f730b368b7fa4fda0acf3db\ - 52c5d509681e8a0100783b6c64466e5531386d6c44\ - ", - ) - .unwrap(); - - let enc_report = EncryptedReport::from_bytes(enc_report_bytes.as_slice()).unwrap(); - let report = enc_report.decrypt(&key_registry).unwrap(); - - assert_eq!(report, expected); - } - #[test] fn invalid_event_type() { let bytes = hex::decode( - "\ - 3301e8d7528e08671418d2164dc80a3403e4aadd01be4263b723ba2204638c20\ - 830500710b2bdb931f5f429f234abddf09109ecb2f730b368b7fa4fda0acf3db\ - 52c5d509681e8abd00783b6c64466e5531386d6c44\ - ", + "2879655662559e44389efb0cb27675b0571f878623411364c525f8201f94\ + c449df144ed7087b5d628615028b55483a0f675494c4ab0f8ba92625921cf71406\ + 2055ab3d676cada0505745e9f8c25a269da20c81019a4db50212090073067b9400\ + 28672642880bdc9a4b8eafc9f0a8a0a350f66447aaab563c8a5603007d06626232\ + 497732584d5447", ) .unwrap(); - let err = EncryptedReport::::from_bytes(bytes.as_slice()) + let err = EncryptedOprfReport::::from_bytes(bytes.as_slice()) .err() .unwrap(); assert!(matches!(err, InvalidReportError::BadEventType(_))); @@ -947,15 +620,15 @@ mod test { #[test] fn invalid_site_domain() { let bytes = hex::decode( - "\ - 3301e8d7528e08671418d2164dc80a3403e4aadd01be4263b723ba2204638c20\ - 830500710b2bdb931f5f429f234abddf09109ecb2f730b368b7fa4fda0acf3db\ - 52c5d509681e8a0100783bff64466e5531386d6c44\ - ", + "2879655662559e44389efb0cb27675b0571f878623411364c525f8201f94\ + c449df144ed7087b5d628615028b55483a0f675494c4ab0f8ba92625921cf71406\ + 2055ab3d676cada0505745e9f8c25a269da20c81019a4db50212090073067b9400\ + 28672642880bdc9a4b8eafc9f0a8a0a350f66447aaab563c8a5601007d06626232\ + 497732584d54ff", ) .unwrap(); - let err = EncryptedReport::::from_bytes(bytes.as_slice()) + let err = EncryptedOprfReport::::from_bytes(bytes.as_slice()) .err() .unwrap(); assert!(matches!(err, InvalidReportError::NonAsciiString(_))); diff --git a/ipa-core/src/secret_sharing/mod.rs b/ipa-core/src/secret_sharing/mod.rs index 9d2b6f1c2..a7ac163b9 100644 --- a/ipa-core/src/secret_sharing/mod.rs +++ b/ipa-core/src/secret_sharing/mod.rs @@ -56,7 +56,7 @@ use std::{ }; pub use array::StdArray; -pub use decomposed::BitDecomposed; +pub(crate) use decomposed::BitDecomposed; use generic_array::ArrayLength; pub use into_shares::IntoShares; #[cfg(any(test, feature = "test-fixture", feature = "cli"))] diff --git a/ipa-core/src/secret_sharing/replicated/malicious/additive_share.rs b/ipa-core/src/secret_sharing/replicated/malicious/additive_share.rs index 59b2fc0ca..8a74b9cae 100644 --- a/ipa-core/src/secret_sharing/replicated/malicious/additive_share.rs +++ b/ipa-core/src/secret_sharing/replicated/malicious/additive_share.rs @@ -84,6 +84,7 @@ pub trait Downgrade: Send { #[must_use = "You should not be downgrading `replicated::malicious::AdditiveShare` values without calling `MaliciousValidator::validate()`"] pub struct UnauthorizedDowngradeWrapper(T); impl UnauthorizedDowngradeWrapper { + #[cfg(feature = "descriptive-gate")] pub(crate) fn new(v: T) -> Self { Self(v) } diff --git a/ipa-core/src/secret_sharing/replicated/malicious/mod.rs b/ipa-core/src/secret_sharing/replicated/malicious/mod.rs index 6f052ba59..a8f5418d5 100644 --- a/ipa-core/src/secret_sharing/replicated/malicious/mod.rs +++ b/ipa-core/src/secret_sharing/replicated/malicious/mod.rs @@ -1,6 +1,6 @@ mod additive_share; +pub(crate) use additive_share::ThisCodeIsAuthorizedToDowngradeFromMalicious; +#[cfg(feature = "descriptive-gate")] +pub(crate) use additive_share::UnauthorizedDowngradeWrapper; pub use additive_share::{AdditiveShare, Downgrade as DowngradeMalicious, ExtendableField}; -pub(crate) use additive_share::{ - ThisCodeIsAuthorizedToDowngradeFromMalicious, UnauthorizedDowngradeWrapper, -}; diff --git a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs index ea7fe6fdd..9310a0bf2 100644 --- a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs +++ b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs @@ -510,11 +510,11 @@ mod tests { proptest, }; - use super::*; use crate::{ ff::{Field, Fp31, Fp32BitPrime}, secret_sharing::{ - replicated::ReplicatedSecretSharing, SharedValue, StdArray, Vectorizable, + replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, + SharedValue, StdArray, Vectorizable, }, }; diff --git a/ipa-core/src/seq_join/local.rs b/ipa-core/src/seq_join/local.rs index 33fe3d757..9dbb4f625 100644 --- a/ipa-core/src/seq_join/local.rs +++ b/ipa-core/src/seq_join/local.rs @@ -7,9 +7,8 @@ use std::{ task::{Context, Poll}, }; -use futures::stream::Fuse; - -use super::*; +use futures::{stream::Fuse, Future, Stream, StreamExt}; +use pin_project::pin_project; enum ActiveItem { Pending(Pin>), @@ -137,7 +136,10 @@ mod local_test { }; use super::*; - use crate::test_executor::run; + use crate::{ + seq_join::{seq_join, seq_try_join_all}, + test_executor::run, + }; fn fake_waker() -> Waker { use std::task::{RawWaker, RawWakerVTable}; diff --git a/ipa-core/src/seq_join/mod.rs b/ipa-core/src/seq_join/mod.rs index dfe6b1073..cee30901e 100644 --- a/ipa-core/src/seq_join/mod.rs +++ b/ipa-core/src/seq_join/mod.rs @@ -2,9 +2,8 @@ use std::{future::IntoFuture, num::NonZeroUsize}; use futures::{ stream::{iter, Iter as StreamIter, TryCollect}, - Future, Stream, StreamExt, TryStreamExt, + Future, Stream, TryStreamExt, }; -use pin_project::pin_project; use crate::exact::ExactSizeStream; @@ -18,6 +17,7 @@ mod multi_thread; /// Use this if you get higher-ranked lifetime errors that mention `std::marker::Send`. /// /// +#[allow(dead_code)] // we would need it soon pub fn assert_send<'a, O>( fut: impl Future + Send + 'a, ) -> impl Future + Send + 'a { @@ -164,16 +164,18 @@ pub use multi_thread::SequentialFutures; #[cfg(all(test, any(unit_test, feature = "shuttle")))] mod test { - use std::{convert::Infallible, iter::once, task::Poll}; + use std::{convert::Infallible, iter::once, num::NonZeroUsize, task::Poll}; use futures::{ future::{lazy, BoxFuture}, stream::{iter, poll_immediate}, - Future, StreamExt, + Future, Stream, StreamExt, }; - use super::*; - use crate::test_executor::run; + use crate::{ + seq_join::{seq_join, seq_try_join_all}, + test_executor::run, + }; async fn immediate(count: u32) { let capacity = NonZeroUsize::new(3).unwrap(); diff --git a/ipa-core/src/seq_join/multi_thread.rs b/ipa-core/src/seq_join/multi_thread.rs index 79ee89d6e..0022c7bc3 100644 --- a/ipa-core/src/seq_join/multi_thread.rs +++ b/ipa-core/src/seq_join/multi_thread.rs @@ -1,20 +1,19 @@ use std::{ - future::IntoFuture, + future::{Future, IntoFuture}, num::NonZeroUsize, pin::Pin, task::{Context, Poll}, }; -use futures::stream::Fuse; +use futures::{stream::Fuse, Stream, StreamExt}; +use pin_project::pin_project; use tracing::{Instrument, Span}; -use super::*; - #[cfg(feature = "shuttle")] mod shuttle_spawner { - use shuttle_crate::future::{self, JoinError, JoinHandle}; + use std::future::Future; - use super::*; + use shuttle_crate::future::{self, JoinError, JoinHandle}; /// Spawner implementation for Shuttle framework to run tests in parallel pub(super) struct ShuttleSpawner; diff --git a/ipa-core/src/test_fixture/input/mod.rs b/ipa-core/src/test_fixture/input/mod.rs index c15b70259..1e6f80f8b 100644 --- a/ipa-core/src/test_fixture/input/mod.rs +++ b/ipa-core/src/test_fixture/input/mod.rs @@ -1,148 +1 @@ -use crate::{ - ff::{Field, GaloisField}, - secret_sharing::replicated::semi_honest::AdditiveShare, -}; - pub mod sharing; - -// Struct that holds all possible fields of the input to IPA. Used for tests only. -#[derive(Debug)] -pub struct GenericReportShare { - pub match_key: Option>, - pub attribution_constraint_id: Option>, - pub timestamp: Option>, - pub is_trigger_report: Option>, - pub breakdown_key: Option>, - pub trigger_value: AdditiveShare, - pub helper_bit: Option>, - pub aggregation_bit: Option>, - pub active_bit: Option>, -} - -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -pub struct GenericReportTestInput { - pub match_key: Option, - pub attribution_constraint_id: Option, - pub timestamp: Option, - pub is_trigger_report: Option, - pub breakdown_key: Option, - pub trigger_value: F, - pub helper_bit: Option, - pub aggregation_bit: Option, - pub active_bit: Option, -} - -#[macro_export] -macro_rules! ipa_test_input { - ( { timestamp: $ts:expr, match_key: $mk:expr, is_trigger_report: $itr:expr, breakdown_key: $bk:expr, trigger_value: $tv:expr $(,)? }; ($field:tt, $mk_bit_array:tt, $bk_bit_array:tt) ) => { - GenericReportTestInput { - match_key: Some(<$mk_bit_array as $crate::ff::Field>::truncate_from(u128::try_from($mk).unwrap())), - attribution_constraint_id: None, - timestamp: Some(<$field as $crate::ff::Field>::truncate_from(u128::try_from($ts).unwrap())), - is_trigger_report: Some(<$field as $crate::ff::Field>::truncate_from(u128::try_from($itr).unwrap())), - breakdown_key: Some(<$bk_bit_array as $crate::ff::Field>::truncate_from(u128::try_from($bk).unwrap())), - trigger_value: <$field as $crate::ff::Field>::truncate_from(u128::try_from($tv).unwrap()), - helper_bit: None, - aggregation_bit: None, - active_bit: None, - } - }; - - ( [ $({ timestamp: $ts:expr, match_key: $mk:expr, is_trigger_report: $itr:expr, breakdown_key: $bk:expr, trigger_value: $tv:expr $(,)? }),* $(,)? ]; ($field:tt, $mk_bit_array:tt, $bk_bit_array:tt) ) => { - vec![ - $(ipa_test_input!({ timestamp: $ts, match_key: $mk, is_trigger_report: $itr, breakdown_key: $bk, trigger_value: $tv }; ($field, $mk_bit_array, $bk_bit_array))),* - ] - }; -} - -#[macro_export] -macro_rules! attribution_window_test_input { - ( { timestamp: $ts:expr, is_trigger_report: $itr:expr, helper_bit: $hb:expr, breakdown_key: $bk:expr, credit: $cdt:expr $(,)? }; ($field:tt, $mk_bit_array:tt, $bk_bit_array:tt) ) => { - GenericReportTestInput { - match_key: None, - attribution_constraint_id: None, - timestamp: Some(<$field as $crate::ff::Field>::truncate_from(u128::try_from($ts).unwrap())), - is_trigger_report: Some(<$field as $crate::ff::Field>::truncate_from(u128::try_from($itr).unwrap())), - breakdown_key: Some(<$bk_bit_array as $crate::ff::Field>::truncate_from(u128::try_from($bk).unwrap())), - trigger_value: <$field as $crate::ff::Field>::truncate_from(u128::try_from($cdt).unwrap()), - helper_bit: Some(<$field as $crate::ff::Field>::truncate_from(u128::try_from($hb).unwrap())), - aggregation_bit: None, - active_bit: None, - } - }; - - ( [ $({ timestamp: $ts:expr, is_trigger_report: $itr:expr, helper_bit: $hb:expr, breakdown_key: $bk:expr, credit: $cdt:expr $(,)? }),* $(,)? ]; ($field:tt, $mk_bit_array:tt, $bk_bit_array:tt) ) => { - vec![ - $(attribution_window_test_input!({ timestamp: $ts, is_trigger_report: $itr, helper_bit: $hb, breakdown_key: $bk, credit: $cdt }; ($field, $mk_bit_array, $bk_bit_array))),* - ] - }; -} - -#[macro_export] -macro_rules! accumulation_test_input { - ( { is_trigger_report: $itr:expr, helper_bit: $hb:expr, active_bit: $ab:expr, credit: $cdt:expr $(,)? }; ($field:tt, $mk_bit_array:tt, $bk_bit_array:tt) ) => { - GenericReportTestInput { - match_key: None, - attribution_constraint_id: None, - timestamp: None, - is_trigger_report: Some(<$field as $crate::ff::Field>::truncate_from(u128::try_from($itr).unwrap())), - breakdown_key: None, - trigger_value: <$field as $crate::ff::Field>::truncate_from(u128::try_from($cdt).unwrap()), - helper_bit: Some(<$field as $crate::ff::Field>::truncate_from(u128::try_from($hb).unwrap())), - aggregation_bit: None, - active_bit: Some(<$field as $crate::ff::Field>::truncate_from(u128::try_from($ab).unwrap())), - } - }; - - ( [ $({ is_trigger_report: $itr:expr, helper_bit: $hb:expr, active_bit: $ab:expr, credit: $cdt:expr $(,)? }),* $(,)? ]; ($field:tt, $mk_bit_array:tt, $bk_bit_array:tt) ) => { - vec![ - $(accumulation_test_input!({ is_trigger_report: $itr, helper_bit: $hb, active_bit: $ab, credit: $cdt }; ($field, $mk_bit_array, $bk_bit_array))),* - ] - }; -} - -#[macro_export] -macro_rules! credit_capping_test_input { - ( { is_trigger_report: $itr:expr, helper_bit: $hb:expr, breakdown_key: $bk:expr, credit: $cdt:expr $(,)? }; ($field:tt, $mk_bit_array:tt, $bk_bit_array:tt) ) => { - GenericReportTestInput { - match_key: None, - attribution_constraint_id: None, - timestamp: None, - is_trigger_report: Some(<$field as $crate::ff::Field>::truncate_from(u128::try_from($itr).unwrap())), - breakdown_key: Some(<$bk_bit_array as $crate::ff::Field>::truncate_from(u128::try_from($bk).unwrap())), - trigger_value: <$field as $crate::ff::Field>::truncate_from(u128::try_from($cdt).unwrap()), - helper_bit: Some(<$field as $crate::ff::Field>::truncate_from(u128::try_from($hb).unwrap())), - aggregation_bit: None, - active_bit: None, - } - }; - - ( [ $({ is_trigger_report: $itr:expr, helper_bit: $hb:expr, breakdown_key: $bk:expr, credit: $cdt:expr $(,)? }),* $(,)? ]; ($field:tt, $mk_bit_array:tt, $bk_bit_array:tt) ) => { - vec![ - $(credit_capping_test_input!({ is_trigger_report: $itr, helper_bit: $hb, breakdown_key: $bk, credit: $cdt }; ($field, $mk_bit_array, $bk_bit_array))),* - ] - }; -} - -#[macro_export] -macro_rules! aggregation_test_input { - ( { helper_bit: $hb:expr, breakdown_key: $bk:expr, credit: $cdt:expr $(,)? }; ($field:tt, $mk_bit_array:tt, $bk_bit_array:tt) ) => { - GenericReportTestInput { - match_key: None, - attribution_constraint_id: None, - timestamp: None, - is_trigger_report: None, - breakdown_key: Some(<$bk_bit_array as $crate::ff::Field>::truncate_from(u128::try_from($bk).unwrap())), - trigger_value: <$field as $crate::ff::Field>::truncate_from(u128::try_from($cdt).unwrap()), - helper_bit: Some(<$field as $crate::ff::Field>::truncate_from(u128::try_from($hb).unwrap())), - aggregation_bit: None, - active_bit: None, - } - }; - - ( [ $({ helper_bit: $hb:expr, breakdown_key: $bk:expr, credit: $cdt:expr $(,)? }),* $(,)? ]; ($field:tt, $mk_bit_array:tt, $bk_bit_array:tt) ) => { - vec![ - $(aggregation_test_input!({ helper_bit: $hb, breakdown_key: $bk, credit: $cdt }; ($field, $mk_bit_array, $bk_bit_array))),* - ] - }; -} diff --git a/ipa-core/src/test_fixture/input/sharing.rs b/ipa-core/src/test_fixture/input/sharing.rs index b184fbb1f..206c07958 100644 --- a/ipa-core/src/test_fixture/input/sharing.rs +++ b/ipa-core/src/test_fixture/input/sharing.rs @@ -1,205 +1,25 @@ use std::iter::{repeat, zip}; -use rand::{distributions::Standard, prelude::Distribution}; - -// #[cfg(feature = "descriptive-gate")] -use crate::{ff::boolean::Boolean, ff::boolean_array::BA64}; use crate::{ - ff::{Field, GaloisField, PrimeField, Serializable}, - protocol::{ - attribution::input::{ - AccumulateCreditInputRow, ApplyAttributionWindowInputRow, CreditCappingInputRow, - }, - ipa::IPAInputRow, - ipa_prf::OPRFIPAInputRow, - BreakdownKey, MatchKey, - }, + ff::{boolean::Boolean, boolean_array::BA64, Field}, + protocol::ipa_prf::OPRFIPAInputRow, rand::Rng, - report::{EventType, OprfReport, Report}, + report::{EventType, OprfReport}, secret_sharing::{ replicated::{semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing}, IntoShares, SharedValue, }, - test_fixture::{ - input::{GenericReportShare, GenericReportTestInput}, - ipa::TestRawDataRecord, - Reconstruct, - }, + test_fixture::{ipa::TestRawDataRecord, Reconstruct}, }; -impl IntoShares> for GenericReportTestInput -where - F: Field + IntoShares>, - MK: GaloisField + IntoShares>, - BK: GaloisField + IntoShares>, - Standard: Distribution, -{ - fn share_with(self, rng: &mut R) -> [GenericReportShare; 3] { - let GenericReportTestInput { - match_key, - attribution_constraint_id, - timestamp, - is_trigger_report, - breakdown_key, - trigger_value, - helper_bit, - aggregation_bit, - active_bit, - } = self; - - let [match_key0, match_key1, match_key2] = match_key.share_with(rng); - let [attribution_constraint_id0, attribution_constraint_id1, attribution_constraint_id2] = - attribution_constraint_id.share_with(rng); - let [timestamp0, timestamp1, timestamp2] = timestamp.share_with(rng); - let [is_trigger_report0, is_trigger_report1, is_trigger_report2] = - is_trigger_report.share_with(rng); - let [breakdown_key0, breakdown_key1, breakdown_key2] = breakdown_key.share_with(rng); - let [trigger_value0, trigger_value1, trigger_value2] = trigger_value.share_with(rng); - let [helper_bit0, helper_bit1, helper_bit2] = helper_bit.share_with(rng); - let [aggregation_bit0, aggregation_bit1, aggregation_bit2] = - aggregation_bit.share_with(rng); - let [active_bit0, active_bit1, active_bit2] = active_bit.share_with(rng); - - [ - GenericReportShare { - match_key: match_key0, - breakdown_key: breakdown_key0, - trigger_value: trigger_value0, - attribution_constraint_id: attribution_constraint_id0, - timestamp: timestamp0, - is_trigger_report: is_trigger_report0, - helper_bit: helper_bit0, - aggregation_bit: aggregation_bit0, - active_bit: active_bit0, - }, - GenericReportShare { - match_key: match_key1, - breakdown_key: breakdown_key1, - trigger_value: trigger_value1, - attribution_constraint_id: attribution_constraint_id1, - timestamp: timestamp1, - is_trigger_report: is_trigger_report1, - helper_bit: helper_bit1, - aggregation_bit: aggregation_bit1, - active_bit: active_bit1, - }, - GenericReportShare { - match_key: match_key2, - breakdown_key: breakdown_key2, - trigger_value: trigger_value2, - attribution_constraint_id: attribution_constraint_id2, - timestamp: timestamp2, - is_trigger_report: is_trigger_report2, - helper_bit: helper_bit2, - aggregation_bit: aggregation_bit2, - active_bit: active_bit2, - }, - ] - } -} - -impl IntoShares>> - for GenericReportTestInput -where - F: Field + IntoShares>, - MK: GaloisField + IntoShares>, - BK: GaloisField + IntoShares>, - Standard: Distribution, -{ - fn share_with( - self, - rng: &mut R, - ) -> [ApplyAttributionWindowInputRow>; 3] { - let [s0, s1, s2]: [GenericReportShare; 3] = self.share_with(rng); - - [ - ApplyAttributionWindowInputRow::new( - s0.timestamp.unwrap(), - s0.is_trigger_report.unwrap(), - s0.helper_bit.unwrap(), - s0.trigger_value, - ), - ApplyAttributionWindowInputRow::new( - s1.timestamp.unwrap(), - s1.is_trigger_report.unwrap(), - s1.helper_bit.unwrap(), - s1.trigger_value, - ), - ApplyAttributionWindowInputRow::new( - s2.timestamp.unwrap(), - s2.is_trigger_report.unwrap(), - s2.helper_bit.unwrap(), - s2.trigger_value, - ), - ] - } -} - -impl IntoShares>> - for GenericReportTestInput -where - F: Field + IntoShares>, - MK: GaloisField + IntoShares>, - BK: GaloisField + IntoShares>, - Standard: Distribution, -{ - fn share_with(self, rng: &mut R) -> [AccumulateCreditInputRow>; 3] { - let [s0, s1, s2]: [GenericReportShare; 3] = self.share_with(rng); - - [ - AccumulateCreditInputRow::new( - s0.is_trigger_report.unwrap(), - s0.helper_bit.unwrap(), - s0.active_bit.unwrap(), - s0.trigger_value, - ), - AccumulateCreditInputRow::new( - s1.is_trigger_report.unwrap(), - s1.helper_bit.unwrap(), - s1.active_bit.unwrap(), - s1.trigger_value, - ), - AccumulateCreditInputRow::new( - s2.is_trigger_report.unwrap(), - s2.helper_bit.unwrap(), - s2.active_bit.unwrap(), - s2.trigger_value, - ), - ] - } -} - -impl IntoShares>> - for GenericReportTestInput -where - F: Field + IntoShares>, - MK: GaloisField + IntoShares>, - BK: GaloisField + IntoShares>, - Standard: Distribution, -{ - fn share_with(self, rng: &mut R) -> [CreditCappingInputRow>; 3] { - let [s0, s1, s2]: [GenericReportShare; 3] = self.share_with(rng); - - [ - CreditCappingInputRow::new( - s0.is_trigger_report.unwrap(), - s0.helper_bit.unwrap(), - s0.trigger_value, - ), - CreditCappingInputRow::new( - s1.is_trigger_report.unwrap(), - s1.helper_bit.unwrap(), - s1.trigger_value, - ), - CreditCappingInputRow::new( - s2.is_trigger_report.unwrap(), - s2.helper_bit.unwrap(), - s2.trigger_value, - ), - ] - } -} +const DOMAINS: &[&str] = &[ + "mozilla.com", + "facebook.com", + "example.com", + "subdomain.long-domain.example.com", +]; +// TODO: this mostly duplicates the impl for GenericReportTestInput, can we avoid that? impl IntoShares> for TestRawDataRecord where BK: SharedValue + Field + IntoShares>, @@ -245,167 +65,6 @@ where } } -impl IntoShares> for GenericReportTestInput -where - F: Field + IntoShares>, - MK: GaloisField + IntoShares>, - BK: GaloisField + IntoShares>, - Standard: Distribution, -{ - fn share_with(self, rng: &mut R) -> [IPAInputRow; 3] { - let [s0, s1, s2]: [GenericReportShare; 3] = self.share_with(rng); - - [ - IPAInputRow { - timestamp: s0.timestamp.unwrap(), - mk_shares: s0.match_key.unwrap(), - is_trigger_bit: s0.is_trigger_report.unwrap(), - breakdown_key: s0.breakdown_key.unwrap(), - trigger_value: s0.trigger_value, - }, - IPAInputRow { - timestamp: s1.timestamp.unwrap(), - mk_shares: s1.match_key.unwrap(), - is_trigger_bit: s1.is_trigger_report.unwrap(), - breakdown_key: s1.breakdown_key.unwrap(), - trigger_value: s1.trigger_value, - }, - IPAInputRow { - timestamp: s2.timestamp.unwrap(), - mk_shares: s2.match_key.unwrap(), - is_trigger_bit: s2.is_trigger_report.unwrap(), - breakdown_key: s2.breakdown_key.unwrap(), - trigger_value: s2.trigger_value, - }, - ] - } -} - -const DOMAINS: &[&str] = &[ - "mozilla.com", - "facebook.com", - "example.com", - "subdomain.long-domain.example.com", -]; - -// TODO: this mostly duplicates the impl for GenericReportTestInput, can we avoid that? -impl IntoShares> for TestRawDataRecord -where - F: PrimeField + IntoShares>, - Replicated: Serializable, -{ - fn share_with(self, rng: &mut R) -> [Report; 3] { - let mk_shares = MatchKey::try_from(u128::from(self.user_id)) - .unwrap() - .share_with(rng); - let event_type = if self.is_trigger_report { - EventType::Trigger - } else { - EventType::Source - }; - let breakdown_key = BreakdownKey::try_from(u128::from(self.breakdown_key)).unwrap(); - let trigger_value = F::try_from(u128::from(self.trigger_value)) - .unwrap() - .share_with(rng); - let epoch = 1; - let site_domain = DOMAINS[rng.gen_range(0..DOMAINS.len())].to_owned(); - - zip(mk_shares, trigger_value) - .map(|(mk_shares, trigger_value)| Report { - timestamp: self.timestamp.try_into().unwrap(), - mk_shares, - event_type, - breakdown_key, - trigger_value, - epoch, - site_domain: site_domain.clone(), - }) - .collect::>() - .try_into() - .unwrap() - } -} - -impl IntoShares> - for GenericReportTestInput -where - F: PrimeField + IntoShares>, - Replicated: Serializable, -{ - #[allow(clippy::if_not_else)] // clippy doesn't like `is_trigger_report != ZERO`, but I stand by it - fn share_with(self, rng: &mut R) -> [Report; 3] { - let mk_shares = self.match_key.unwrap().share_with(rng); - let event_type = if self.is_trigger_report.unwrap() != F::ZERO { - EventType::Trigger - } else { - EventType::Source - }; - let trigger_value = self.trigger_value.share_with(rng); - let epoch = 1; - let site_domain = DOMAINS[rng.gen_range(0..DOMAINS.len())].to_owned(); - - zip(mk_shares, trigger_value) - .map(|(mk_shares, trigger_value)| Report { - timestamp: self.timestamp.unwrap().as_u128().try_into().unwrap(), - mk_shares, - event_type, - breakdown_key: self.breakdown_key.unwrap(), - trigger_value, - epoch, - site_domain: site_domain.clone(), - }) - .collect::>() - .try_into() - .unwrap() - } -} - -impl Reconstruct> - for [AccumulateCreditInputRow>; 3] -where - F: Field, - MK: GaloisField, - BK: GaloisField, -{ - fn reconstruct(&self) -> GenericReportTestInput { - [&self[0], &self[1], &self[2]].reconstruct() - } -} - -impl Reconstruct> - for [&AccumulateCreditInputRow>; 3] -where - F: Field, - MK: GaloisField, - BK: GaloisField, -{ - fn reconstruct(&self) -> GenericReportTestInput { - let [s0, s1, s2] = self; - - let trigger_value = [&s0.trigger_value, &s1.trigger_value, &s2.trigger_value].reconstruct(); - let is_trigger_report = [ - &s0.is_trigger_report, - &s1.is_trigger_report, - &s2.is_trigger_report, - ] - .reconstruct(); - let helper_bit = [&s0.helper_bit, &s1.helper_bit, &s2.helper_bit].reconstruct(); - let active_bit = [&s0.active_bit, &s1.active_bit, &s2.active_bit].reconstruct(); - - GenericReportTestInput { - breakdown_key: None, - trigger_value, - is_trigger_report: Some(is_trigger_report), - helper_bit: Some(helper_bit), - match_key: None, - attribution_constraint_id: None, - timestamp: None, - aggregation_bit: None, - active_bit: Some(active_bit), - } - } -} - impl IntoShares> for TestRawDataRecord where BK: SharedValue + Field + IntoShares>, diff --git a/ipa-core/src/test_fixture/ipa.rs b/ipa-core/src/test_fixture/ipa.rs index 57739df2f..b5d608edd 100644 --- a/ipa-core/src/test_fixture/ipa.rs +++ b/ipa-core/src/test_fixture/ipa.rs @@ -5,16 +5,14 @@ use crate::protocol::ipa_prf::prf_sharding::GroupingKey; use crate::{ ff::{PrimeField, Serializable}, helpers::query::IpaQueryConfig, - ipa_test_input, - protocol::{ipa::ipa, ipa_prf::OPRFIPAInputRow, BreakdownKey, MatchKey}, + protocol::ipa_prf::OPRFIPAInputRow, secret_sharing::{ replicated::{ - malicious, malicious::ExtendableField, semi_honest, - semi_honest::AdditiveShare as Replicated, + malicious::ExtendableField, semi_honest, semi_honest::AdditiveShare as Replicated, }, IntoShares, }, - test_fixture::{input::GenericReportTestInput, Reconstruct}, + test_fixture::Reconstruct, }; #[derive(Debug, Copy, Clone)] @@ -25,7 +23,6 @@ pub enum IpaSecurityModel { } pub enum IpaQueryStyle { - SortInMpc, Oprf, } @@ -173,65 +170,6 @@ where } } -/// # Panics -/// If any of the IPA protocol modules panic -#[cfg(feature = "in-memory-infra")] -pub async fn test_ipa( - world: &super::TestWorld, - records: &[TestRawDataRecord], - expected_results: &[u32], - config: IpaQueryConfig, - security_model: IpaSecurityModel, -) where - semi_honest::AdditiveShare: Serializable, - malicious::AdditiveShare: Serializable, - // todo: for semi-honest we don't need extendable fields. - F: PrimeField + ExtendableField + IntoShares>, - rand::distributions::Standard: rand::distributions::Distribution, -{ - use super::Runner; - - let records = records - .iter() - .map(|x| { - ipa_test_input!( - { - timestamp: x.timestamp, - match_key: x.user_id, - is_trigger_report: x.is_trigger_report, - breakdown_key: x.breakdown_key, - trigger_value: x.trigger_value, - }; - (F, MatchKey, BreakdownKey) - ) - }) - .collect::>(); - - let result: Vec = match security_model { - IpaSecurityModel::Malicious => world - .malicious(records.into_iter(), |ctx, input_rows| async move { - ipa::<_, _, _, F, MatchKey, BreakdownKey>(ctx, &input_rows, config) - .await - .unwrap() - }) - .await - .reconstruct(), - IpaSecurityModel::SemiHonest => world - .semi_honest(records.into_iter(), |ctx, input_rows| async move { - ipa::<_, _, _, F, MatchKey, BreakdownKey>(ctx, &input_rows, config) - .await - .unwrap() - }) - .await - .reconstruct(), - }; - let result = result - .into_iter() - .map(|v| u32::try_from(v.as_u128()).unwrap()) - .collect::>(); - assert_eq!(result, expected_results); -} - /// # Panics /// If any of the IPA protocol modules panic #[allow(clippy::too_many_lines)] diff --git a/ipa-core/src/test_fixture/metrics.rs b/ipa-core/src/test_fixture/metrics.rs index 18fca9db3..80acf4620 100644 --- a/ipa-core/src/test_fixture/metrics.rs +++ b/ipa-core/src/test_fixture/metrics.rs @@ -29,6 +29,9 @@ fn setup() { let recorder = DebuggingRecorder::new(); let snapshotter = recorder.snapshotter(); + // Leaking the recorder is necessary for metrics infrastructure to work. + // it does not use `seq_join` or `parallel_join`. + #[allow(clippy::disallowed_methods)] let recorder = Box::leak(Box::new(TracingContextLayer::all().layer(recorder))); #[cfg(not(feature = "disable-metrics"))] diff --git a/ipa-core/src/test_fixture/sharing.rs b/ipa-core/src/test_fixture/sharing.rs index 95eba9902..32286a853 100644 --- a/ipa-core/src/test_fixture/sharing.rs +++ b/ipa-core/src/test_fixture/sharing.rs @@ -2,14 +2,13 @@ use std::{borrow::Borrow, iter::zip, ops::Deref}; use crate::{ ff::{Field, PrimeField}, - protocol::boolean::RandomBitsShare, secret_sharing::{ replicated::{ malicious::{AdditiveShare as MaliciousReplicated, ExtendableField}, semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing, }, - BitDecomposed, FieldSimd, SecretSharing, Vectorizable, + BitDecomposed, FieldSimd, Vectorizable, }, }; @@ -151,10 +150,11 @@ where } } -impl Reconstruct for [RandomBitsShare; 3] +#[cfg(feature = "descriptive-gate")] +impl Reconstruct for [crate::protocol::boolean::RandomBitsShare; 3] where F: Field, - S: SecretSharing, + S: crate::secret_sharing::SecretSharing, for<'a> [&'a S; 3]: Reconstruct, { fn reconstruct(&self) -> F { diff --git a/ipa-core/tests/common/mod.rs b/ipa-core/tests/common/mod.rs index 0f11717f3..823824977 100644 --- a/ipa-core/tests/common/mod.rs +++ b/ipa-core/tests/common/mod.rs @@ -195,7 +195,7 @@ pub fn test_network(https: bool) { let sockets = test_setup(path); let _helpers = spawn_helpers(path, &sockets, https); - test_multiply(&path, https); + test_multiply(path, https); } pub fn test_ipa(mode: IpaSecurityModel, https: bool) { @@ -240,7 +240,7 @@ pub fn test_ipa_with_config(mode: IpaSecurityModel, https: bool, config: IpaQuer } let protocol = match mode { - IpaSecurityModel::SemiHonest => "semi-honest-ipa", + IpaSecurityModel::SemiHonest => "oprf-ipa", IpaSecurityModel::Malicious => "malicious-ipa", }; command diff --git a/ipa-core/tests/compact_gate.rs b/ipa-core/tests/compact_gate.rs index 6adfccc6d..79ac08183 100644 --- a/ipa-core/tests/compact_gate.rs +++ b/ipa-core/tests/compact_gate.rs @@ -23,41 +23,21 @@ fn test_compact_gate>( } #[test] -fn compact_gate_cap_1_no_window_semi_honest() { - test_compact_gate(IpaSecurityModel::SemiHonest, 1, 0); +fn compact_gate_cap_8_no_window_semi_honest() { + test_compact_gate(IpaSecurityModel::SemiHonest, 8, 0); } #[test] -fn compact_gate_cap_1_no_window_malicious() { - test_compact_gate(IpaSecurityModel::Malicious, 1, 0); +fn compact_gate_cap_8_with_window_semi_honest() { + test_compact_gate(IpaSecurityModel::SemiHonest, 8, 86400); } #[test] -fn compact_gate_cap_1_with_window_semi_honest() { - test_compact_gate(IpaSecurityModel::SemiHonest, 1, 86400); +fn compact_gate_cap_16_no_window_semi_honest() { + test_compact_gate(IpaSecurityModel::SemiHonest, 16, 0); } #[test] -fn compact_gate_cap_1_with_window_malicious() { - test_compact_gate(IpaSecurityModel::Malicious, 1, 86400); -} - -#[test] -fn compact_gate_cap_10_no_window_semi_honest() { - test_compact_gate(IpaSecurityModel::SemiHonest, 10, 0); -} - -#[test] -fn compact_gate_cap_10_no_window_malicious() { - test_compact_gate(IpaSecurityModel::Malicious, 10, 0); -} - -#[test] -fn compact_gate_cap_10_with_window_semi_honest() { - test_compact_gate(IpaSecurityModel::SemiHonest, 10, 86400); -} - -#[test] -fn compact_gate_cap_10_with_window_malicious() { - test_compact_gate(IpaSecurityModel::Malicious, 10, 86400); +fn compact_gate_cap_16_with_window_semi_honest() { + test_compact_gate(IpaSecurityModel::SemiHonest, 16, 86400); } diff --git a/ipa-core/tests/helper_networks.rs b/ipa-core/tests/helper_networks.rs index b9fdcce8f..9238adf78 100644 --- a/ipa-core/tests/helper_networks.rs +++ b/ipa-core/tests/helper_networks.rs @@ -70,18 +70,18 @@ fn keygen_confgen() { // generate keys for all 3 helpers for id in HelperIdentity::make_three() { - exec_keygen_cmd(id, &path) + exec_keygen_cmd(id, path) } exec_conf_gen(false); let helpers = spawn_helpers(path, &sockets, true); - test_multiply(&path, true); + test_multiply(path, true); drop(helpers); // now overwrite the configuration file and try again exec_conf_gen(true); let helpers = spawn_helpers(path, &sockets, true); - test_multiply(&path, true); + test_multiply(path, true); drop(helpers); } @@ -99,7 +99,7 @@ fn exec_keygen_cmd(helper_identity: HelperIdentity, dest_dir: &Path) { "--tls-key".as_ref(), dest_dir.helper_tls_key(helper_identity).as_os_str(), ]) - .args(["--tls-valid-days".as_ref(), "2"]) + .args(["--tls-valid-days", "2"]) .args([ "--mk-private-key".as_ref(), dest_dir.helper_mk_private_key(helper_identity).as_os_str(), diff --git a/pre-commit b/pre-commit index 3d1482040..f081393e2 100755 --- a/pre-commit +++ b/pre-commit @@ -87,6 +87,9 @@ check "Clippy checks" \ check "Clippy concurrency checks" \ cargo clippy --tests --features shuttle -- -D warnings +check "Clippy web checks" \ + cargo clippy --tests --no-default-features --features "cli web-app real-world-infra test-fixture descriptive-gate" -- -D warnings + check "Tests" \ cargo test @@ -97,13 +100,7 @@ check "Concurrency tests" \ cargo test -p ipa-core --release --features shuttle check "IPA benchmark" \ - cargo bench --bench oneshot_ipa --no-default-features --features="enable-benches descriptive-gate" -- -n 62 - -check "IPA OPRF benchmark" \ - cargo bench --bench oneshot_ipa --no-default-features --features="enable-benches descriptive-gate" -- -n 62 --oprf -c 16 + cargo bench --bench oneshot_ipa --no-default-features --features="enable-benches descriptive-gate" -- -n 62 -c 16 check "Arithmetic circuit benchmark" \ cargo bench --bench oneshot_arithmetic --no-default-features --features "enable-benches descriptive-gate" - -check "Sort benchmark" \ - cargo bench --bench oneshot_sort --no-default-features --features="enable-benches descriptive-gate" diff --git a/scripts/collect_steps.py b/scripts/collect_steps.py index 648b0c71e..3491d018f 100755 --- a/scripts/collect_steps.py +++ b/scripts/collect_steps.py @@ -7,7 +7,7 @@ # This script collects all the steps that are executed in the oneshot_ipa with # all possible configurations. -IPA_ENV = [["RUST_LOG", "ipa=DEBUG"]] +IPA_ENV = [["RUST_LOG", "ipa_core=DEBUG"]] ARGS = [ "cargo", "bench", @@ -20,16 +20,13 @@ "3", ] QUERY_SIZE = 100 -# per_user_cap = 1 runs an optimized protocol, so 1 and anything larger than 1 -PER_USER_CAP = [1, 3] # attribution_window_seconds = 0 runs an optimized protocol, so 0 and anything larger ATTRIBUTION_WINDOW = [0, 86400] -# breakdown_keys = [1..32] runs an optimized protocol, and the steps generated -# depend on the number of bits in the breakdown key. >= 33 runs a general protocol. -# As of July 2023, we are limiting the number of breakdown keys to 32. -BREAKDOWN_KEYS = [32] -SECURITY_MODEL = ["malicious", "semi-honest"] ROOT_STEP_PREFIX = "protocol/alloc::string::String::run-0" +BREAKDOWN_KEYS = 256 +USER_CAP = [8, 16, 32, 64, 128] +SECURITY_MODEL = "semi-honest" +TRIGGER_VALUES = [6, 7] # TODO(taikiy): #771 allows us to remove this synthetic step generation code @@ -149,38 +146,12 @@ def extract_intermediate_steps(steps): return steps -def ipa_steps(): - output = set() - for c in PER_USER_CAP: - for w in ATTRIBUTION_WINDOW: - for b in BREAKDOWN_KEYS: - for m in SECURITY_MODEL: - args = ARGS + [ - "-n", - str(QUERY_SIZE), - "-c", - str(c), - "-w", - str(w), - "-b", - str(b), - "-m", - m, - ] - print(" ".join(args), file=sys.stderr) - output.update(collect_steps(args)) - return output - -OPRF_BREAKDOWN_KEY = 256 -OPRF_USER_CAP = [8, 16, 32, 64, 128] -OPRF_SECURITY_MODEL = "semi-honest" -OPRF_TRIGGER_VALUE = [6, 7] -def oprf_steps(): +def ipa_steps(): output = set() - for c in OPRF_USER_CAP: + for c in USER_CAP: for w in ATTRIBUTION_WINDOW: - for tv in OPRF_TRIGGER_VALUE: + for tv in TRIGGER_VALUES: args = ARGS + [ "-n", str(QUERY_SIZE), @@ -189,12 +160,11 @@ def oprf_steps(): "-w", str(w), "-b", - str(OPRF_BREAKDOWN_KEY), + str(BREAKDOWN_KEYS), "-m", - OPRF_SECURITY_MODEL, + SECURITY_MODEL, "-t", str(tv), - "-o" ] print(" ".join(args), file=sys.stderr) output.update(collect_steps(args)) @@ -203,7 +173,6 @@ def oprf_steps(): if __name__ == "__main__": steps = set() steps.update(ipa_steps()) - steps.update(oprf_steps()) full_steps = extract_intermediate_steps(steps) sorted_steps = sorted(full_steps) From 860e046501220bb87ca41471bec70648e22269a1 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Tue, 20 Feb 2024 15:16:12 -0800 Subject: [PATCH 030/135] Enable Tokio tasks profiler (#947) * Enable Tokio tasks profiler Requires `logging::setup()`, but otherwise works smoothly by running [`tokio-console`](https://github.com/tokio-rs/console) client that consumes metrics emitted by IPA benchmarks and shows per-task and combined stats * Pull tokio/tracing off the main dependency graph --- ipa-core/Cargo.toml | 5 +++ ipa-core/src/test_fixture/logging.rs | 54 ++++++++++++++++------------ 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/ipa-core/Cargo.toml b/ipa-core/Cargo.toml index c4097c165..033a56931 100644 --- a/ipa-core/Cargo.toml +++ b/ipa-core/Cargo.toml @@ -63,6 +63,10 @@ descriptive-gate = [] compact-gate = ["ipa-macros/compact-gate"] # Enable using more than one thread for protocol execution. Most of the parallelism occurs at parallel/seq_join operations multi-threading = ["async-scoped"] +# Enable tokio task profiling. Requires tokio_unstable flag to be passed to the compiler. +# RUSTFLAGS="--cfg tokio_unstable" cargo run ... --features="tokio-console ...". +# Note that if there are other flags enabled on your platform in .cargo/config.toml, you need to include them as well. +tokio-console = ["console-subscriber", "tokio/tracing"] # Standalone aggregation protocol. We use IPA infra for communication # but it has nothing to do with IPA. @@ -88,6 +92,7 @@ bytes = "1.4" clap = { version = "4.3.2", optional = true, features = ["derive"] } comfy-table = { version = "7.0", optional = true } config = "0.14" +console-subscriber = { version = "0.2", optional = true } criterion = { version = "0.5.1", optional = true, default-features = false, features = [ "async_tokio", "plotters", diff --git a/ipa-core/src/test_fixture/logging.rs b/ipa-core/src/test_fixture/logging.rs index b8553eef0..8490387f8 100644 --- a/ipa-core/src/test_fixture/logging.rs +++ b/ipa-core/src/test_fixture/logging.rs @@ -1,10 +1,4 @@ -use std::{str::FromStr, sync::Once}; - -use metrics_tracing_context::MetricsLayer; -use tracing::Level; -use tracing_subscriber::{ - filter::Directive, fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, -}; +use std::sync::Once; /// Set up logging for IPA /// @@ -14,21 +8,37 @@ pub fn setup() { static INIT: Once = Once::new(); INIT.call_once(|| { - let default_directive = if let Some(crate_name) = option_env!("CARGO_CRATE_NAME") { - // only print IPA crate logging by default - Directive::from_str(&format!("{crate_name}=INFO")).unwrap() - } else { - Level::INFO.into() - }; + #[cfg(feature = "tokio-console")] + { + console_subscriber::init(); + } + + #[cfg(not(feature = "tokio-console"))] + { + use std::str::FromStr; + + use metrics_tracing_context::MetricsLayer; + use tracing::Level; + use tracing_subscriber::{ + filter::Directive, fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, + }; + + let default_directive = if let Some(crate_name) = option_env!("CARGO_CRATE_NAME") { + // only print IPA crate logging by default + Directive::from_str(&format!("{crate_name}=INFO")).unwrap() + } else { + Level::INFO.into() + }; - tracing_subscriber::registry() - .with( - EnvFilter::builder() - .with_default_directive(default_directive) - .from_env_lossy(), - ) - .with(fmt::layer()) - .with(MetricsLayer::new()) - .init(); + tracing_subscriber::registry() + .with( + EnvFilter::builder() + .with_default_directive(default_directive) + .from_env_lossy(), + ) + .with(fmt::layer()) + .with(MetricsLayer::new()) + .init(); + } }); } From 8433d08e1adb774e55ada3050d823f5d5f1d963a Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 25 Jan 2024 11:21:10 -0800 Subject: [PATCH 031/135] Move u128 conversions out of Field trait --- ipa-core/benches/ct/arithmetic_circuit.rs | 4 +- ipa-core/src/bin/test_mpc.rs | 8 +-- ipa-core/src/cli/playbook/input.rs | 8 +-- ipa-core/src/ff/boolean.rs | 7 +-- ipa-core/src/ff/boolean_array.rs | 14 ++--- ipa-core/src/ff/ec_prime_field.rs | 8 +-- ipa-core/src/ff/field.rs | 9 ---- ipa-core/src/ff/galois_field.rs | 8 +-- ipa-core/src/ff/mod.rs | 12 ++++- ipa-core/src/ff/prime_field.rs | 11 ++-- .../src/helpers/buffers/ordering_sender.rs | 2 +- .../src/helpers/buffers/unordered_receiver.rs | 4 +- ipa-core/src/helpers/gateway/mod.rs | 8 +-- ipa-core/src/helpers/mod.rs | 2 +- ipa-core/src/protocol/basics/check_zero.rs | 2 +- .../src/protocol/basics/mul/semi_honest.rs | 4 +- .../basics/sum_of_product/semi_honest.rs | 2 +- ipa-core/src/protocol/boolean/comparison.rs | 2 +- .../protocol/boolean/random_bits_generator.rs | 2 +- ipa-core/src/protocol/boolean/solved_bits.rs | 2 +- ipa-core/src/protocol/boolean/xor.rs | 10 ++-- ipa-core/src/protocol/context/mod.rs | 4 +- .../boolean_ops/addition_sequential.rs | 2 +- .../comparison_and_subtraction_sequential.rs | 4 +- ipa-core/src/protocol/ipa_prf/mod.rs | 13 +++-- .../protocol/ipa_prf/prf_sharding/bucket.rs | 4 +- .../prf_sharding/feature_label_dot_product.rs | 5 +- .../src/protocol/ipa_prf/prf_sharding/mod.rs | 51 +++++++++---------- ipa-core/src/protocol/ipa_prf/quicksort.rs | 6 +-- ipa-core/src/protocol/ipa_prf/shuffle/base.rs | 2 +- ipa-core/src/protocol/ipa_prf/shuffle/mod.rs | 8 +-- .../modulus_conversion/convert_shares.rs | 6 +-- ipa-core/src/protocol/prss/mod.rs | 2 +- ipa-core/src/query/executor.rs | 2 +- ipa-core/src/query/processor.rs | 2 +- ipa-core/src/query/runner/oprf_ipa.rs | 4 +- ipa-core/src/query/runner/test_multiply.rs | 2 +- .../replicated/malicious/additive_share.rs | 7 +-- .../replicated/semi_honest/additive_share.rs | 2 +- ipa-core/src/test_fixture/circuit.rs | 4 +- ipa-core/src/test_fixture/input/sharing.rs | 18 +++---- ipa-core/src/test_fixture/mod.rs | 18 ++++--- ipa-core/src/test_fixture/sharing.rs | 26 +++++----- 43 files changed, 171 insertions(+), 150 deletions(-) diff --git a/ipa-core/benches/ct/arithmetic_circuit.rs b/ipa-core/benches/ct/arithmetic_circuit.rs index fac67dca9..ee7a3ae75 100644 --- a/ipa-core/benches/ct/arithmetic_circuit.rs +++ b/ipa-core/benches/ct/arithmetic_circuit.rs @@ -3,7 +3,7 @@ use criterion::{ BenchmarkId, Criterion, SamplingMode, Throughput, }; use ipa_core::{ - ff::{Field, Fp31, Fp32BitPrime}, + ff::{Field, Fp31, Fp32BitPrime, U128Conversions}, protocol::{basics::SecureMul, context::SemiHonestContext}, secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, FieldSimd, IntoShares}, test_fixture::circuit, @@ -18,7 +18,7 @@ fn do_benchmark( depth: u16, ) where M: Measurement, - F: Field + FieldSimd, + F: Field + FieldSimd + U128Conversions, for<'a> Replicated: SecureMul>, [F; N]: IntoShares>, Standard: Distribution, diff --git a/ipa-core/src/bin/test_mpc.rs b/ipa-core/src/bin/test_mpc.rs index 93f48d7b7..cd3b1c9d6 100644 --- a/ipa-core/src/bin/test_mpc.rs +++ b/ipa-core/src/bin/test_mpc.rs @@ -8,7 +8,7 @@ use ipa_core::{ playbook::{make_clients, secure_mul, validate, InputSource}, Verbosity, }, - ff::{Field, FieldType, Fp31, Fp32BitPrime, Serializable}, + ff::{Field, FieldType, Fp31, Fp32BitPrime, Serializable, U128Conversions}, helpers::query::{QueryConfig, QueryType::TestMultiply}, net::MpcHelperClient, secret_sharing::{replicated::semi_honest::AdditiveShare, IntoShares}, @@ -99,8 +99,10 @@ async fn main() -> Result<(), Box> { Ok(()) } -async fn multiply_in_field(args: &Args, helper_clients: &[MpcHelperClient; 3]) -where +async fn multiply_in_field( + args: &Args, + helper_clients: &[MpcHelperClient; 3], +) where F: Field + IntoShares>, ::Size: Add<::Size>, <::Size as Add<::Size>>::Output: ArrayLength, diff --git a/ipa-core/src/cli/playbook/input.rs b/ipa-core/src/cli/playbook/input.rs index b5f429a72..2405ee89f 100644 --- a/ipa-core/src/cli/playbook/input.rs +++ b/ipa-core/src/cli/playbook/input.rs @@ -6,16 +6,16 @@ use std::{ path::PathBuf, }; -use crate::{ff::Field, test_fixture::ipa::TestRawDataRecord}; +use crate::{ff::U128Conversions, test_fixture::ipa::TestRawDataRecord}; pub trait InputItem { fn from_str(s: &str) -> Self; } -impl InputItem for F { +impl InputItem for T { fn from_str(s: &str) -> Self { let int_v = s.parse::().unwrap(); - F::truncate_from(int_v) + T::truncate_from(int_v) } } @@ -170,7 +170,7 @@ mod tests { mod input_source { use super::*; - use crate::{cli::playbook::input::InputSource, ff::Field}; + use crate::{cli::playbook::input::InputSource, ff::U128Conversions}; #[test] fn multiline() { diff --git a/ipa-core/src/ff/boolean.rs b/ipa-core/src/ff/boolean.rs index fafd3bc2b..954d9806f 100644 --- a/ipa-core/src/ff/boolean.rs +++ b/ipa-core/src/ff/boolean.rs @@ -3,7 +3,7 @@ use typenum::U1; use super::Gf32Bit; use crate::{ - ff::{Field, Serializable}, + ff::{Field, Serializable, U128Conversions}, impl_shared_value_common, protocol::prss::FromRandomU128, secret_sharing::{ @@ -158,12 +158,13 @@ impl From for Boolean { } } -///implement Field because required by PRSS impl Field for Boolean { const NAME: &'static str = "Boolean"; const ONE: Boolean = Boolean(true); +} +impl U128Conversions for Boolean { fn as_u128(&self) -> u128 { Boolean::as_u128(self) } @@ -192,7 +193,7 @@ impl TryFrom for Boolean { impl FromRandomU128 for Boolean { fn from_random_u128(src: u128) -> Self { - Field::truncate_from(src) + Self::truncate_from(src) } } diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index ae34dc1e8..3078f5856 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -7,7 +7,7 @@ use typenum::{U14, U2, U32, U8}; use crate::{ error::LengthError, - ff::{boolean::Boolean, ArrayAccess, ArrayBuilder, Field, Serializable}, + ff::{boolean::Boolean, ArrayAccess, ArrayBuilder, Field, Serializable, U128Conversions}, protocol::prss::{FromRandom, FromRandomU128}, secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, }; @@ -134,11 +134,9 @@ macro_rules! boolean_array_impl_small { const NAME: &'static str = stringify!($name); const ONE: Self = Self(bitarr_one!($bits)); + } - fn as_u128(&self) -> u128 { - (*self).into() - } - + impl U128Conversions for $name { fn truncate_from>(v: T) -> Self { let v = v.into(); let mut val = ::ZERO; @@ -148,6 +146,10 @@ macro_rules! boolean_array_impl_small { val } + + fn as_u128(&self) -> u128 { + (*self).into() + } } impl TryFrom for $name { @@ -188,7 +190,7 @@ macro_rules! boolean_array_impl_small { impl FromRandomU128 for $name { fn from_random_u128(src: u128) -> Self { - Field::truncate_from(src) + Self::truncate_from(src) } } diff --git a/ipa-core/src/ff/ec_prime_field.rs b/ipa-core/src/ff/ec_prime_field.rs index c2478c8cf..147defaad 100644 --- a/ipa-core/src/ff/ec_prime_field.rs +++ b/ipa-core/src/ff/ec_prime_field.rs @@ -7,7 +7,7 @@ use sha2::Sha256; use typenum::U32; use crate::{ - ff::{boolean_array::BA256, Field, Serializable}, + ff::{boolean_array::BA256, Field, Serializable, U128Conversions}, impl_shared_value_common, protocol::prss::FromRandomU128, secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, @@ -187,12 +187,14 @@ impl FieldVectorizable<1> for Fp25519 { type ArrayAlias = StdArray; } -///implement Field because required by PRSS impl Field for Fp25519 { const NAME: &'static str = "Fp25519"; const ONE: Fp25519 = Fp25519::ONE; +} +// TODO(812): remove these impls +impl U128Conversions for Fp25519 { ///both following methods are based on hashing and do not allow to actually convert elements in Fp25519 /// from or into u128. However it is sufficient to generate random elements in Fp25519 fn as_u128(&self) -> u128 { @@ -205,7 +207,6 @@ impl Field for Fp25519 { } } -// TODO(812): remove this impl impl FromRandomU128 for Fp25519 { fn from_random_u128(v: u128) -> Self { let hk = Hkdf::::new(None, &v.to_le_bytes()); @@ -228,6 +229,7 @@ impl TryFrom for Fp25519 { Ok(f) } } +// TODO(812): end remove impls #[cfg(all(test, unit_test))] mod test { diff --git a/ipa-core/src/ff/field.rs b/ipa-core/src/ff/field.rs index 4e098cfda..88d41087b 100644 --- a/ipa-core/src/ff/field.rs +++ b/ipa-core/src/ff/field.rs @@ -37,15 +37,6 @@ pub trait Field: /// Multiplicative identity element const ONE: Self; - - /// Truncates the higher-order bits larger than `Self::BITS`, and converts - /// into this data type. This conversion is lossy. Callers are encouraged - /// to use `try_from` if the input is not known in advance. - fn truncate_from>(v: T) -> Self; - - /// Blanket implementation to represent the instance of this trait as 16 byte integer. - /// Uses the fact that such conversion already exists via `Self` -> `Self::Integer` -> `Into` - fn as_u128(&self) -> u128; } #[derive(Copy, Clone, Debug, Eq, PartialEq)] diff --git a/ipa-core/src/ff/galois_field.rs b/ipa-core/src/ff/galois_field.rs index 1b7d1f526..c1d7be389 100644 --- a/ipa-core/src/ff/galois_field.rs +++ b/ipa-core/src/ff/galois_field.rs @@ -12,7 +12,7 @@ use typenum::{Unsigned, U1, U2, U3, U4, U5}; use super::ArrayAccess; use crate::{ - ff::{boolean_array::NonZeroPadding, Field, Serializable}, + ff::{boolean_array::NonZeroPadding, Field, Serializable, U128Conversions}, impl_serializable_trait, impl_shared_value_common, protocol::prss::FromRandomU128, secret_sharing::{Block, FieldVectorizable, SharedValue, Vectorizable}, @@ -189,7 +189,9 @@ macro_rules! bit_array_impl { const NAME: &'static str = stringify!($field); const ONE: Self = Self($one); + } + impl U128Conversions for $name { fn as_u128(&self) -> u128 { (*self).into() } @@ -226,7 +228,7 @@ macro_rules! bit_array_impl { impl FromRandomU128 for $name { fn from_random_u128(src: u128) -> Self { - Field::truncate_from(src) + U128Conversions::truncate_from(src) } } @@ -503,7 +505,7 @@ macro_rules! bit_array_impl { type Strategy = prop::strategy::Map, fn(u128) -> Self>; fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - (0..=MASK).prop_map(Field::truncate_from as _) + (0..=MASK).prop_map(<$name as U128Conversions>::truncate_from as _) } } diff --git a/ipa-core/src/ff/mod.rs b/ipa-core/src/ff/mod.rs index 96bdbca60..dc72ba836 100644 --- a/ipa-core/src/ff/mod.rs +++ b/ipa-core/src/ff/mod.rs @@ -23,7 +23,7 @@ use generic_array::{ArrayLength, GenericArray}; pub use prime_field::Fp31; pub use prime_field::{Fp32BitPrime, PrimeField}; -use crate::error::UnwrapInfallible; +use crate::{error::UnwrapInfallible, protocol::prss::FromRandomU128}; #[derive(Debug, thiserror::Error, PartialEq, Eq)] pub enum Error { @@ -45,6 +45,16 @@ impl AddSub for T where pub trait AddSubAssign: AddAssign + SubAssign {} impl AddSubAssign for T where T: AddAssign + SubAssign {} +pub trait U128Conversions: FromRandomU128 + TryFrom { + /// Truncates higher-order bits and converts into this data type. This conversion is lossy if + /// the higher order bits are non-zero. Callers are encouraged to use `try_from` if the input may + /// not be convertible. + fn truncate_from>(v: T) -> Self; + + /// Blanket implementation to represent the instance of this trait as 16 byte integer. + fn as_u128(&self) -> u128; +} + /// Trait for items that have fixed-byte length representation. pub trait Serializable: Sized { /// Required number of bytes to store this message on disk/network diff --git a/ipa-core/src/ff/prime_field.rs b/ipa-core/src/ff/prime_field.rs index 27e22a74e..589f9b2c1 100644 --- a/ipa-core/src/ff/prime_field.rs +++ b/ipa-core/src/ff/prime_field.rs @@ -4,13 +4,13 @@ use generic_array::GenericArray; use super::Field; use crate::{ - ff::{FieldType, Serializable}, + ff::{FieldType, Serializable, U128Conversions}, impl_shared_value_common, protocol::prss::FromRandomU128, secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, }; -pub trait PrimeField: Field { +pub trait PrimeField: Field + U128Conversions { type PrimeInteger: Into; const PRIME: Self::PrimeInteger; @@ -47,10 +47,11 @@ macro_rules! field_impl { const NAME: &'static str = stringify!($field); const ONE: Self = $field(1); + } + impl U128Conversions for $field { fn as_u128(&self) -> u128 { - let int: Self::Storage = (*self).into(); - int.into() + u128::from(self.0) } /// An infallible conversion from `u128` to this type. This can be used to draw @@ -67,7 +68,7 @@ macro_rules! field_impl { impl FromRandomU128 for $field { fn from_random_u128(src: u128) -> Self { - Field::truncate_from(src) + U128Conversions::truncate_from(src) } } diff --git a/ipa-core/src/helpers/buffers/ordering_sender.rs b/ipa-core/src/helpers/buffers/ordering_sender.rs index 1e77a98a2..b2a9e9ec7 100644 --- a/ipa-core/src/helpers/buffers/ordering_sender.rs +++ b/ipa-core/src/helpers/buffers/ordering_sender.rs @@ -523,7 +523,7 @@ mod test { use super::OrderingSender; use crate::{ - ff::{Field, Fp31, Fp32BitPrime, Gf20Bit, Gf9Bit, Serializable}, + ff::{Fp31, Fp32BitPrime, Gf20Bit, Gf9Bit, Serializable, U128Conversions}, helpers::Message, rand::thread_rng, sync::Arc, diff --git a/ipa-core/src/helpers/buffers/unordered_receiver.rs b/ipa-core/src/helpers/buffers/unordered_receiver.rs index 080dadedb..4a236a59d 100644 --- a/ipa-core/src/helpers/buffers/unordered_receiver.rs +++ b/ipa-core/src/helpers/buffers/unordered_receiver.rs @@ -75,7 +75,7 @@ impl Spare { self.buf.extend_from_slice(v); } - /// Extend the buffer with new data. + /// Extend the buffer with new data. /// This returns a message if there is enough data. /// This returns a value because it can be more efficient in cases where /// received chunks don't align with messages. @@ -405,7 +405,7 @@ mod test { use typenum::Unsigned; use crate::{ - ff::{Field, Fp31, Fp32BitPrime, Serializable}, + ff::{Fp31, Fp32BitPrime, Serializable, U128Conversions}, helpers::buffers::unordered_receiver::UnorderedReceiver, }; diff --git a/ipa-core/src/helpers/gateway/mod.rs b/ipa-core/src/helpers/gateway/mod.rs index 4fd839ca5..018431d62 100644 --- a/ipa-core/src/helpers/gateway/mod.rs +++ b/ipa-core/src/helpers/gateway/mod.rs @@ -179,8 +179,8 @@ mod tests { use futures_util::future::{join, try_join, try_join_all}; use crate::{ - ff::{Field, Fp31, Fp32BitPrime, Gf2}, - helpers::{Direction, GatewayConfig, Role, SendingEnd}, + ff::{Fp31, Fp32BitPrime, Gf2, U128Conversions}, + helpers::{Direction, GatewayConfig, Message, Role, SendingEnd}, protocol::{context::Context, RecordId}, test_fixture::{Runner, TestWorld, TestWorldConfig}, }; @@ -192,9 +192,9 @@ mod tests { /// Gateway must be able to deal with it. #[tokio::test] async fn can_handle_heterogeneous_channels() { - async fn send(channel: &SendingEnd, i: usize) { + async fn send(channel: &SendingEnd, i: usize) { channel - .send(i.into(), F::truncate_from(u128::try_from(i).unwrap())) + .send(i.into(), V::truncate_from(u128::try_from(i).unwrap())) .await .unwrap(); } diff --git a/ipa-core/src/helpers/mod.rs b/ipa-core/src/helpers/mod.rs index ced453615..b2b15f305 100644 --- a/ipa-core/src/helpers/mod.rs +++ b/ipa-core/src/helpers/mod.rs @@ -660,7 +660,7 @@ mod concurrency_tests { use shuttle_crate::rand::thread_rng; use crate::{ - ff::{Field, FieldType, Fp31, Fp32BitPrime}, + ff::{FieldType, Fp31, Fp32BitPrime, U128Conversions}, helpers::{ query::{QueryConfig, QueryType::TestMultiply}, Direction, GatewayConfig, diff --git a/ipa-core/src/protocol/basics/check_zero.rs b/ipa-core/src/protocol/basics/check_zero.rs index d391ea7ce..192533d85 100644 --- a/ipa-core/src/protocol/basics/check_zero.rs +++ b/ipa-core/src/protocol/basics/check_zero.rs @@ -70,7 +70,7 @@ mod tests { use crate::{ error::Error, - ff::{Field, Fp31, PrimeField}, + ff::{Fp31, PrimeField, U128Conversions}, protocol::{basics::check_zero, context::Context, RecordId}, rand::thread_rng, secret_sharing::{IntoShares, SharedValue}, diff --git a/ipa-core/src/protocol/basics/mul/semi_honest.rs b/ipa-core/src/protocol/basics/mul/semi_honest.rs index 303027deb..0d1c1ad96 100644 --- a/ipa-core/src/protocol/basics/mul/semi_honest.rs +++ b/ipa-core/src/protocol/basics/mul/semi_honest.rs @@ -123,7 +123,7 @@ mod test { use super::multiply; use crate::{ - ff::{Field, Fp31, Fp32BitPrime}, + ff::{Field, Fp31, Fp32BitPrime, U128Conversions}, helpers::TotalRecords, protocol::{ basics::{SecureMul, ZeroPositions}, @@ -205,7 +205,7 @@ mod test { async fn multiply_sync(world: &TestWorld, a: u128, b: u128) -> u128 where - F: Field, + F: Field + U128Conversions, (F, F): Sized, Standard: Distribution, { diff --git a/ipa-core/src/protocol/basics/sum_of_product/semi_honest.rs b/ipa-core/src/protocol/basics/sum_of_product/semi_honest.rs index cee2f518a..bdbe06b09 100644 --- a/ipa-core/src/protocol/basics/sum_of_product/semi_honest.rs +++ b/ipa-core/src/protocol/basics/sum_of_product/semi_honest.rs @@ -87,7 +87,7 @@ impl super::SumOfProducts for Replicated { mod test { use super::sum_of_products; use crate::{ - ff::{Field, Fp31}, + ff::{Fp31, U128Conversions}, protocol::{context::Context, RecordId}, rand::{thread_rng, Rng}, secret_sharing::SharedValue, diff --git a/ipa-core/src/protocol/boolean/comparison.rs b/ipa-core/src/protocol/boolean/comparison.rs index b95f8cc94..81e1d05c0 100644 --- a/ipa-core/src/protocol/boolean/comparison.rs +++ b/ipa-core/src/protocol/boolean/comparison.rs @@ -308,7 +308,7 @@ mod tests { greater_than_constant, }; use crate::{ - ff::{Field, Fp31, Fp32BitPrime, PrimeField}, + ff::{Field, Fp31, Fp32BitPrime, PrimeField, U128Conversions}, protocol::{ boolean::random_bits_generator::RandomBitsGenerator, context::{Context, UpgradableContext, Validator}, diff --git a/ipa-core/src/protocol/boolean/random_bits_generator.rs b/ipa-core/src/protocol/boolean/random_bits_generator.rs index 520648dee..314a0ddd2 100644 --- a/ipa-core/src/protocol/boolean/random_bits_generator.rs +++ b/ipa-core/src/protocol/boolean/random_bits_generator.rs @@ -100,7 +100,7 @@ mod tests { use super::RandomBitsGenerator; use crate::{ - ff::{Field, Fp31}, + ff::{Fp31, U128Conversions}, protocol::{ context::{Context, UpgradableContext, Validator}, RecordId, diff --git a/ipa-core/src/protocol/boolean/solved_bits.rs b/ipa-core/src/protocol/boolean/solved_bits.rs index 2e3ef1b07..452383e24 100644 --- a/ipa-core/src/protocol/boolean/solved_bits.rs +++ b/ipa-core/src/protocol/boolean/solved_bits.rs @@ -153,7 +153,7 @@ mod tests { use rand::{distributions::Standard, prelude::Distribution}; use crate::{ - ff::{Field, Fp31, Fp32BitPrime, PrimeField}, + ff::{Field, Fp31, Fp32BitPrime, PrimeField, U128Conversions}, protocol::{ boolean::solved_bits::solved_bits, context::{Context, UpgradableContext, Validator}, diff --git a/ipa-core/src/protocol/boolean/xor.rs b/ipa-core/src/protocol/boolean/xor.rs index 95e20059a..ae1da2886 100644 --- a/ipa-core/src/protocol/boolean/xor.rs +++ b/ipa-core/src/protocol/boolean/xor.rs @@ -1,6 +1,6 @@ use crate::{ error::Error, - ff::Field, + ff::{Field, U128Conversions}, protocol::{ basics::{MultiplyZeroPositions, SecureMul, ZeroPositions}, context::Context, @@ -15,7 +15,7 @@ use crate::{ /// When communication fails. pub async fn xor(ctx: C, record_id: RecordId, a: &S, b: &S) -> Result where - F: Field, + F: Field + U128Conversions, C: Context, S: LinearSecretSharing + SecureMul, { @@ -33,7 +33,7 @@ pub async fn xor_sparse( zeros_at: MultiplyZeroPositions, ) -> Result where - F: Field, + F: Field + U128Conversions, C: Context, S: LinearSecretSharing + SecureMul, { @@ -47,7 +47,7 @@ mod tests { use super::xor; use crate::{ - ff::{Field, Fp31, Fp32BitPrime}, + ff::{Field, Fp31, Fp32BitPrime, U128Conversions}, protocol::{ basics::{mul::sparse::test::SparseField, MultiplyZeroPositions, ZeroPositions}, boolean::xor_sparse, @@ -60,7 +60,7 @@ mod tests { async fn run(world: &TestWorld, a: F, b: F) -> F where - F: ExtendableField, + F: ExtendableField + U128Conversions, Standard: Distribution, { let result = world diff --git a/ipa-core/src/protocol/context/mod.rs b/ipa-core/src/protocol/context/mod.rs index 69cd66934..ca1965135 100644 --- a/ipa-core/src/protocol/context/mod.rs +++ b/ipa-core/src/protocol/context/mod.rs @@ -281,7 +281,7 @@ mod tests { use typenum::Unsigned; use crate::{ - ff::{Field, Fp31, Serializable}, + ff::{Field, Fp31, Serializable, U128Conversions}, helpers::{Direction, Role}, protocol::{ context::{ @@ -326,7 +326,7 @@ mod tests { /// Toy protocol to execute PRSS generation and send/receive logic async fn toy_protocol(ctx: C, index: usize, share: &S) -> Replicated where - F: Field, + F: Field + U128Conversions, Standard: Distribution, C: Context, S: ReplicatedLeftValue, diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs index a506f0753..e4b937790 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs @@ -172,7 +172,7 @@ mod test { use crate::{ ff::{ boolean_array::{BA32, BA64}, - Field, + U128Conversions, }, protocol, protocol::{ diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs index 90f427d21..82b68e0e3 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs @@ -244,7 +244,7 @@ mod test { ff::{ boolean::Boolean, boolean_array::{BA3, BA32, BA5, BA64}, - Expand, Field, + Expand, Field, U128Conversions, }, protocol, protocol::{ @@ -406,7 +406,7 @@ mod test { let x = repeat_with(|| rng.gen()) .take(BENCH_COUNT) .collect::>(); - let x_int = x.iter().map(Field::as_u128).collect::>(); + let x_int = x.iter().map(U128Conversions::as_u128).collect::>(); let y: BA64 = rng.gen::(); let y_int = y.as_u128(); diff --git a/ipa-core/src/protocol/ipa_prf/mod.rs b/ipa-core/src/protocol/ipa_prf/mod.rs index e7dc68f52..8068a5684 100644 --- a/ipa-core/src/protocol/ipa_prf/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/mod.rs @@ -7,7 +7,10 @@ use typenum::{Unsigned, U18}; use self::{quicksort::quicksort_ranges_by_key_insecure, shuffle::shuffle_inputs}; use crate::{ error::{Error, UnwrapInfallible}, - ff::{boolean::Boolean, boolean_array::BA64, CustomArray, Field, PrimeField, Serializable}, + ff::{ + boolean::Boolean, boolean_array::BA64, CustomArray, Field, PrimeField, Serializable, + U128Conversions, + }, protocol::{ context::{UpgradableContext, UpgradedContext}, ipa_prf::{ @@ -168,10 +171,10 @@ where C: UpgradableContext, C::UpgradedContext: UpgradedContext>, C::UpgradedContext: UpgradedContext>, - BK: SharedValue + CustomArray + Field, - TV: SharedValue + CustomArray + Field, - TS: SharedValue + CustomArray + Field, - SS: SharedValue + CustomArray + Field, + BK: SharedValue + U128Conversions + CustomArray + Field, + TV: SharedValue + U128Conversions + CustomArray + Field, + TS: SharedValue + U128Conversions + CustomArray + Field, + SS: SharedValue + U128Conversions + CustomArray + Field, F: PrimeField + ExtendableField, Replicated: Serializable, { diff --git a/ipa-core/src/protocol/ipa_prf/prf_sharding/bucket.rs b/ipa-core/src/protocol/ipa_prf/prf_sharding/bucket.rs index 94da6a674..12ae48bf3 100644 --- a/ipa-core/src/protocol/ipa_prf/prf_sharding/bucket.rs +++ b/ipa-core/src/protocol/ipa_prf/prf_sharding/bucket.rs @@ -66,7 +66,7 @@ impl From for Error { /// produce [`row_contribution`]_r,0 =[`value`]-[`bd_key`]_r.[`value`] and [`row_contribution`]_r,1=[`bd_key`]_r.[`value`]. /// This takes the most significant bit of `bd_key` and places value in one of the two child nodes of the binary tree. /// At each successive round, the next most significant bit is propagated from the leaf nodes of the tree into further leaf nodes: -/// [`row_contribution`]_r+1,q,0 =[`row_contribution`]_r,q - [`bd_key`]_r+1.[`row_contribution`]_r,q and [`row_contribution`]_r+1,q,1 =[`bd_key`]_r+1.[`row_contribution`]_r,q. +/// [`row_contribution`]_r+1,q,0 =[`row_contribution`]_r,q - [`bd_key`]_r+1.[`row_contribution`]_r,q and [`row_contribution`]_r+1,q,1 =[`bd_key`]_r+1.[`row_contribution`]_r,q. /// The work of each iteration therefore doubles relative to the one preceding. /// /// In case a malicious entity sends a out of range breakdown key (i.e. greater than the max count) to this function, we need to do some @@ -146,7 +146,7 @@ pub mod tests { use rand::thread_rng; use crate::{ - ff::{Field, Fp32BitPrime, Gf8Bit, Gf9Bit}, + ff::{Fp32BitPrime, Gf8Bit, Gf9Bit, U128Conversions}, protocol::{ context::{Context, UpgradableContext, Validator}, ipa_prf::prf_sharding::bucket::move_single_value_to_bucket, diff --git a/ipa-core/src/protocol/ipa_prf/prf_sharding/feature_label_dot_product.rs b/ipa-core/src/protocol/ipa_prf/prf_sharding/feature_label_dot_product.rs index 3206263c1..c706395c4 100644 --- a/ipa-core/src/protocol/ipa_prf/prf_sharding/feature_label_dot_product.rs +++ b/ipa-core/src/protocol/ipa_prf/prf_sharding/feature_label_dot_product.rs @@ -346,7 +346,10 @@ where #[cfg(all(test, unit_test))] pub mod tests { use crate::{ - ff::{boolean::Boolean, boolean_array::BA32, CustomArray, Field, Fp32BitPrime}, + ff::{ + boolean::Boolean, boolean_array::BA32, CustomArray, Field, Fp32BitPrime, + U128Conversions, + }, protocol::ipa_prf::prf_sharding::feature_label_dot_product::{ compute_feature_label_dot_product, PrfShardedIpaInputRow, }, diff --git a/ipa-core/src/protocol/ipa_prf/prf_sharding/mod.rs b/ipa-core/src/protocol/ipa_prf/prf_sharding/mod.rs index c1de99f66..52a50b4d1 100644 --- a/ipa-core/src/protocol/ipa_prf/prf_sharding/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/prf_sharding/mod.rs @@ -16,7 +16,7 @@ use crate::{ ff::{ boolean::Boolean, boolean_array::{BA32, BA7}, - ArrayAccess, CustomArray, Expand, Field, PrimeField, Serializable, + ArrayAccess, CustomArray, Expand, Field, PrimeField, Serializable, U128Conversions, }, helpers::Role, protocol::{ @@ -100,12 +100,12 @@ struct InputsRequiredFromPrevRow, } -impl< - BK: SharedValue + CustomArray + Field, - TV: SharedValue + CustomArray + Field, - TS: SharedValue + CustomArray + Field, - SS: SharedValue + CustomArray + Field, - > InputsRequiredFromPrevRow +impl InputsRequiredFromPrevRow +where + BK: SharedValue + U128Conversions + CustomArray + Field, + TV: SharedValue + U128Conversions + CustomArray + Field, + TS: SharedValue + U128Conversions + CustomArray + Field, + SS: SharedValue + U128Conversions + CustomArray + Field, { /// /// This function contains the main logic for the per-user attribution circuit. @@ -466,10 +466,10 @@ where C::UpgradedContext: UpgradedContext>, C::UpgradedContext: UpgradedContext, S: LinearSecretSharing + Serializable + SecureMul>, - BK: SharedValue + CustomArray + Field, - TV: SharedValue + CustomArray + Field, - TS: SharedValue + CustomArray + Field, - SS: SharedValue + CustomArray + Field, + BK: SharedValue + U128Conversions + CustomArray + Field, + TV: SharedValue + U128Conversions + CustomArray + Field, + TS: SharedValue + U128Conversions + CustomArray + Field, + SS: SharedValue + U128Conversions + CustomArray + Field, F: PrimeField + ExtendableField, { // Get the validator and context to use for Boolean multiplication operations @@ -572,10 +572,10 @@ async fn evaluate_per_user_attribution_circuit( ) -> Result>, Error> where C: Context, - BK: SharedValue + CustomArray + Field, - TV: SharedValue + CustomArray + Field, - TS: SharedValue + CustomArray + Field, - SS: SharedValue + CustomArray + Field, + BK: SharedValue + U128Conversions + CustomArray + Field, + TV: SharedValue + U128Conversions + CustomArray + Field, + TS: SharedValue + U128Conversions + CustomArray + Field, + SS: SharedValue + U128Conversions + CustomArray + Field, { assert!(!rows_for_user.is_empty()); if rows_for_user.len() == 1 { @@ -670,7 +670,7 @@ async fn timestamp_of_most_recent_source_event( ) -> Result, Error> where C: Context, - TS: SharedValue + CustomArray + Field, + TS: SharedValue + U128Conversions + CustomArray + Field, { match attribution_window_seconds { None => Ok(prev_row_timestamp_bits.clone()), @@ -711,8 +711,8 @@ async fn zero_out_trigger_value_unless_attributed( ) -> Result, Error> where C: Context, - TV: SharedValue + CustomArray + Field, - TS: SharedValue + CustomArray + Field, + TV: SharedValue + U128Conversions + CustomArray + Field, + TS: SharedValue + U128Conversions + CustomArray + Field, { let (did_trigger_get_attributed, is_trigger_within_window) = try_join( is_trigger_bit.multiply( @@ -765,8 +765,7 @@ async fn is_trigger_event_within_attribution_window( ) -> Result, Error> where C: Context, - TS: SharedValue, - TS: SharedValue + CustomArray + Field, + TS: SharedValue + U128Conversions + CustomArray + Field, { if let Some(attribution_window_seconds) = attribution_window_seconds { let time_delta_bits = integer_sub( @@ -822,7 +821,7 @@ async fn compute_capped_trigger_value( ) -> Result, Error> where C: Context, - TV: SharedValue + CustomArray + Field, + TV: SharedValue + U128Conversions + CustomArray + Field, { let narrowed_ctx1 = ctx.narrow(&Step::ComputedCappedAttributedTriggerValueNotSaturatedCase); let narrowed_ctx2 = ctx.narrow(&Step::ComputedCappedAttributedTriggerValueJustSaturatedCase); @@ -860,7 +859,7 @@ pub mod tests { ff::{ boolean::Boolean, boolean_array::{BA20, BA3, BA5, BA8}, - CustomArray, Field, Fp32BitPrime, + CustomArray, Field, Fp32BitPrime, U128Conversions, }, protocol::ipa_prf::prf_sharding::attribute_cap_aggregate, rand::Rng, @@ -886,7 +885,7 @@ pub mod tests { trigger_value: u8, ) -> PreShardedAndSortedOPRFTestInput where - BK: SharedValue + Field, + BK: SharedValue + U128Conversions + Field, { oprf_test_input_with_timestamp( prf_of_match_key, @@ -905,7 +904,7 @@ pub mod tests { timestamp: u32, ) -> PreShardedAndSortedOPRFTestInput where - BK: SharedValue + Field, + BK: SharedValue + U128Conversions + Field, { let is_trigger_bit = if is_trigger { Boolean::ONE @@ -982,8 +981,8 @@ pub mod tests { impl Reconstruct for [&CappedAttributionOutputs; 3] where - BK: SharedValue + CustomArray + Field, - TV: SharedValue + CustomArray + Field, + BK: SharedValue + U128Conversions + CustomArray + Field, + TV: SharedValue + U128Conversions + CustomArray + Field, { fn reconstruct(&self) -> PreAggregationTestOutputInDecimal { let [s0, s1, s2] = self; diff --git a/ipa-core/src/protocol/ipa_prf/quicksort.rs b/ipa-core/src/protocol/ipa_prf/quicksort.rs index 0ac73a985..3c9caaf42 100644 --- a/ipa-core/src/protocol/ipa_prf/quicksort.rs +++ b/ipa-core/src/protocol/ipa_prf/quicksort.rs @@ -9,7 +9,7 @@ use ipa_macros::Step; use crate::{ error::Error, - ff::{boolean::Boolean, ArrayAccess, ArrayBuild, CustomArray, Field}, + ff::{boolean::Boolean, ArrayAccess, ArrayBuild, CustomArray}, protocol::{ basics::Reveal, context::Context, ipa_prf::boolean_ops::comparison_and_subtraction_sequential::compare_gt, RecordId, @@ -60,7 +60,7 @@ where C: Context, S: Send + Sync, F: Fn(&S) -> &AdditiveShare + Sync + Send + Copy, - K: SharedValue + Field + CustomArray, + K: SharedValue + CustomArray, AdditiveShare: ArrayAccess + ArrayBuild>, { assert!(!ranges_to_sort.iter().any(Range::is_empty)); @@ -163,7 +163,7 @@ pub mod tests { use crate::{ ff::{ boolean_array::{BA20, BA64}, - Field, + Field, U128Conversions, }, protocol::{context::Context, ipa_prf::quicksort::quicksort_ranges_by_key_insecure}, rand::thread_rng, diff --git a/ipa-core/src/protocol/ipa_prf/shuffle/base.rs b/ipa-core/src/protocol/ipa_prf/shuffle/base.rs index 970f79d14..7f0b92283 100644 --- a/ipa-core/src/protocol/ipa_prf/shuffle/base.rs +++ b/ipa-core/src/protocol/ipa_prf/shuffle/base.rs @@ -351,7 +351,7 @@ where pub mod tests { use super::shuffle; use crate::{ - ff::{Field, Gf40Bit}, + ff::{Gf40Bit, U128Conversions}, test_fixture::{Reconstruct, Runner, TestWorld, TestWorldConfig}, }; diff --git a/ipa-core/src/protocol/ipa_prf/shuffle/mod.rs b/ipa-core/src/protocol/ipa_prf/shuffle/mod.rs index 62a7ac5fc..5750f9c1d 100644 --- a/ipa-core/src/protocol/ipa_prf/shuffle/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/shuffle/mod.rs @@ -5,7 +5,7 @@ use crate::{ ff::{ boolean::Boolean, boolean_array::{BA112, BA64}, - ArrayAccess, CustomArray, Expand, Field, + ArrayAccess, CustomArray, Expand, }, protocol::{ context::{UpgradableContext, UpgradedContext}, @@ -27,9 +27,9 @@ pub async fn shuffle_inputs( where C: UpgradableContext, C::UpgradedContext: UpgradedContext>, - BK: SharedValue + CustomArray + Field, - TV: SharedValue + CustomArray + Field, - TS: SharedValue + CustomArray + Field, + BK: SharedValue + CustomArray, + TV: SharedValue + CustomArray, + TS: SharedValue + CustomArray, { let shuffle_input: Vec> = input .into_iter() diff --git a/ipa-core/src/protocol/modulus_conversion/convert_shares.rs b/ipa-core/src/protocol/modulus_conversion/convert_shares.rs index ab3581e96..03d26543c 100644 --- a/ipa-core/src/protocol/modulus_conversion/convert_shares.rs +++ b/ipa-core/src/protocol/modulus_conversion/convert_shares.rs @@ -34,7 +34,7 @@ use pin_project::pin_project; use crate::{ error::Error, exact::ExactSizeStream, - ff::{ArrayAccess, Field, Gf2, PrimeField}, + ff::{ArrayAccess, Field, Gf2, PrimeField, U128Conversions}, helpers::Role, protocol::{ basics::{SecureMul, ZeroPositions}, @@ -266,7 +266,7 @@ async fn convert_bit( locally_converted_bits: &BitConversionTriple, ) -> Result where - F: Field, + F: Field + U128Conversions, C: Context, S: LinearSecretSharing + SecureMul, { @@ -398,7 +398,7 @@ mod tests { use crate::{ error::Error, - ff::{Field, Fp31, Fp32BitPrime, Gf2, PrimeField}, + ff::{Field, Fp31, Fp32BitPrime, Gf2, PrimeField, U128Conversions}, helpers::{Direction, Role}, protocol::{ context::{Context, UpgradableContext, UpgradedContext, Validator}, diff --git a/ipa-core/src/protocol/prss/mod.rs b/ipa-core/src/protocol/prss/mod.rs index 9ddf3a874..15690fd7e 100644 --- a/ipa-core/src/protocol/prss/mod.rs +++ b/ipa-core/src/protocol/prss/mod.rs @@ -350,7 +350,7 @@ pub mod test { use super::{Generator, KeyExchange, SequentialSharedRandomness}; use crate::{ - ff::{Field, Fp31}, + ff::{Field, Fp31, U128Conversions}, protocol::{ prss::{Endpoint, PrssIndex, SharedRandomness}, step::{Gate, StepNarrow}, diff --git a/ipa-core/src/query/executor.rs b/ipa-core/src/query/executor.rs index 75c6b2e1a..b2085980e 100644 --- a/ipa-core/src/query/executor.rs +++ b/ipa-core/src/query/executor.rs @@ -147,7 +147,7 @@ where #[cfg(all(test, unit_test))] mod tests { use crate::{ - ff::{Field, Fp31}, + ff::{Fp31, U128Conversions}, query::ProtocolResult, secret_sharing::{replicated::semi_honest::AdditiveShare, IntoShares}, }; diff --git a/ipa-core/src/query/processor.rs b/ipa-core/src/query/processor.rs index a18641661..5e96a0140 100644 --- a/ipa-core/src/query/processor.rs +++ b/ipa-core/src/query/processor.rs @@ -538,7 +538,7 @@ mod tests { error::BoxError, ff::{ boolean_array::{BA20, BA3, BA8}, - Field, Fp31, + Fp31, U128Conversions, }, helpers::query::{IpaQueryConfig, QueryType}, protocol::ipa_prf::OPRFIPAInputRow, diff --git a/ipa-core/src/query/runner/oprf_ipa.rs b/ipa-core/src/query/runner/oprf_ipa.rs index b1ab90495..2df91cb7a 100644 --- a/ipa-core/src/query/runner/oprf_ipa.rs +++ b/ipa-core/src/query/runner/oprf_ipa.rs @@ -136,7 +136,7 @@ mod tests { use crate::{ ff::{ boolean_array::{BA20, BA3, BA8}, - Field, Fp31, + Fp31, U128Conversions, }, helpers::{ query::{IpaQueryConfig, QuerySize}, @@ -235,7 +235,7 @@ mod tests { assert_eq!( results.reconstruct()[0..3] .iter() - .map(Field::as_u128) + .map(U128Conversions::as_u128) .collect::>(), EXPECTED ); diff --git a/ipa-core/src/query/runner/test_multiply.rs b/ipa-core/src/query/runner/test_multiply.rs index 02f6ece81..18fcc2c9c 100644 --- a/ipa-core/src/query/runner/test_multiply.rs +++ b/ipa-core/src/query/runner/test_multiply.rs @@ -73,7 +73,7 @@ mod tests { use super::*; use crate::{ - ff::{Field, Fp31}, + ff::{Fp31, U128Conversions}, secret_sharing::IntoShares, test_fixture::{join3v, Reconstruct, TestWorld}, }; diff --git a/ipa-core/src/secret_sharing/replicated/malicious/additive_share.rs b/ipa-core/src/secret_sharing/replicated/malicious/additive_share.rs index 8a74b9cae..6e8c84b80 100644 --- a/ipa-core/src/secret_sharing/replicated/malicious/additive_share.rs +++ b/ipa-core/src/secret_sharing/replicated/malicious/additive_share.rs @@ -13,7 +13,8 @@ use generic_array::{ArrayLength, GenericArray}; use typenum::Unsigned; use crate::{ - ff::{Field, Gf2, Gf32Bit, PrimeField, Serializable}, + ff::{Field, Gf2, Gf32Bit, PrimeField, Serializable, U128Conversions}, + protocol::prss::FromRandom, secret_sharing::{ replicated::semi_honest::AdditiveShare as SemiHonestAdditiveShare, BitDecomposed, Linear as LinearSecretSharing, SecretSharing, SharedValue, @@ -40,7 +41,7 @@ pub struct AdditiveShare { } pub trait ExtendableField: Field { - type ExtendedField: Field; + type ExtendedField: Field + FromRandom; fn to_extended(&self) -> Self::ExtendedField; } @@ -415,7 +416,7 @@ impl ThisCodeIsAuthorizedToDowngradeFromMalicious for UnauthorizedDowngrad mod tests { use super::{AdditiveShare, Downgrade, ThisCodeIsAuthorizedToDowngradeFromMalicious}; use crate::{ - ff::{Field, Fp31}, + ff::{Field, Fp31, U128Conversions}, helpers::Role, rand::{thread_rng, Rng}, secret_sharing::{ diff --git a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs index 9310a0bf2..817c870cd 100644 --- a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs +++ b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs @@ -511,7 +511,7 @@ mod tests { }; use crate::{ - ff::{Field, Fp31, Fp32BitPrime}, + ff::{Fp31, Fp32BitPrime, U128Conversions}, secret_sharing::{ replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, SharedValue, StdArray, Vectorizable, diff --git a/ipa-core/src/test_fixture/circuit.rs b/ipa-core/src/test_fixture/circuit.rs index 1fce74ead..2f1f67cb0 100644 --- a/ipa-core/src/test_fixture/circuit.rs +++ b/ipa-core/src/test_fixture/circuit.rs @@ -3,7 +3,7 @@ use rand::distributions::{Distribution, Standard}; use super::join3v; use crate::{ - ff::Field, + ff::{Field, U128Conversions}, helpers::TotalRecords, protocol::{ basics::SecureMul, @@ -21,7 +21,7 @@ use crate::{ /// panics when circuits did not produce the expected value. pub async fn arithmetic(width: u32, depth: u16) where - F: Field + FieldSimd, + F: Field + FieldSimd + U128Conversions, for<'a> Replicated: SecureMul>, [F; N]: IntoShares>, Standard: Distribution, diff --git a/ipa-core/src/test_fixture/input/sharing.rs b/ipa-core/src/test_fixture/input/sharing.rs index 206c07958..1d674efff 100644 --- a/ipa-core/src/test_fixture/input/sharing.rs +++ b/ipa-core/src/test_fixture/input/sharing.rs @@ -1,7 +1,7 @@ use std::iter::{repeat, zip}; use crate::{ - ff::{boolean::Boolean, boolean_array::BA64, Field}, + ff::{boolean::Boolean, boolean_array::BA64, Field, U128Conversions}, protocol::ipa_prf::OPRFIPAInputRow, rand::Rng, report::{EventType, OprfReport}, @@ -22,9 +22,9 @@ const DOMAINS: &[&str] = &[ // TODO: this mostly duplicates the impl for GenericReportTestInput, can we avoid that? impl IntoShares> for TestRawDataRecord where - BK: SharedValue + Field + IntoShares>, - TV: SharedValue + Field + IntoShares>, - TS: SharedValue + Field + IntoShares>, + BK: SharedValue + U128Conversions + IntoShares>, + TV: SharedValue + U128Conversions + IntoShares>, + TS: SharedValue + U128Conversions + IntoShares>, { fn share_with(self, rng: &mut R) -> [OprfReport; 3] { let match_key = BA64::try_from(u128::from(self.user_id)) @@ -82,10 +82,10 @@ where let timestamp: [Replicated; 3] = TS::try_from(u128::from(self.timestamp)) .unwrap() .share_with(rng); - let breakdown_key = BK::try_from(self.breakdown_key.into()) + let breakdown_key = BK::try_from(u128::from(self.breakdown_key)) .unwrap() .share_with(rng); - let trigger_value = TV::try_from(self.trigger_value.into()) + let trigger_value = TV::try_from(u128::from(self.trigger_value)) .unwrap() .share_with(rng); @@ -112,9 +112,9 @@ where impl Reconstruct for [&OPRFIPAInputRow; 3] where - BK: SharedValue + Field, - TV: SharedValue + Field, - TS: SharedValue + Field, + BK: SharedValue + U128Conversions, + TV: SharedValue + U128Conversions, + TS: SharedValue + U128Conversions, { fn reconstruct(&self) -> TestRawDataRecord { let [s0, s1, s2] = self; diff --git a/ipa-core/src/test_fixture/mod.rs b/ipa-core/src/test_fixture/mod.rs index e383d4db0..0f96aee7b 100644 --- a/ipa-core/src/test_fixture/mod.rs +++ b/ipa-core/src/test_fixture/mod.rs @@ -28,13 +28,15 @@ pub use sharing::{get_bits, into_bits, Reconstruct, ReconstructArr}; pub use world::{Runner, TestWorld, TestWorldConfig}; use crate::{ - ff::Field, + ff::{Field, U128Conversions}, protocol::{ context::Context, prss::Endpoint as PrssEndpoint, step::{Gate, Step, StepNarrow}, }, - secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, IntoShares}, + secret_sharing::{ + replicated::semi_honest::AdditiveShare as Replicated, IntoShares, SharedValue, + }, }; /// Narrows a set of contexts all at once. @@ -80,11 +82,11 @@ pub type ReplicatedShares = [Vec>; 3]; /// Generate vector shares from vector of inputs for three participant /// /// # Panics -/// If the input cannot be converted into the given field `F` without truncation. +/// If the input cannot be converted into the given value type `V` without truncation. #[must_use] -pub fn generate_shares(input: &[u128]) -> ReplicatedShares +pub fn generate_shares(input: &[u128]) -> ReplicatedShares where - Standard: Distribution, + Standard: Distribution, { let mut rand = StepRng::new(100, 1); @@ -94,7 +96,7 @@ where let mut shares2 = Vec::with_capacity(len); for i in input { - let [s0, s1, s2] = F::try_from(*i).unwrap().share_with(&mut rand); + let [s0, s1, s2] = V::try_from(*i).unwrap().share_with(&mut rand); shares0.push(s0); shares1.push(s1); shares2.push(s2); @@ -156,7 +158,7 @@ where } /// Take a slice of bits in `{0,1} ⊆ F_p`, and reconstruct the integer in `Z` -pub fn bits_to_value(x: &[F]) -> u128 { +pub fn bits_to_value(x: &[F]) -> u128 { #[allow(clippy::cast_possible_truncation)] let v = x .iter() @@ -169,6 +171,6 @@ pub fn bits_to_value(x: &[F]) -> u128 { /// /// # Panics /// If the input cannot be converted into the given field `F` without truncation. -pub fn bits_to_field(x: &[F]) -> F { +pub fn bits_to_field(x: &[F]) -> F { F::try_from(bits_to_value(x)).unwrap() } diff --git a/ipa-core/src/test_fixture/sharing.rs b/ipa-core/src/test_fixture/sharing.rs index 32286a853..d120090d4 100644 --- a/ipa-core/src/test_fixture/sharing.rs +++ b/ipa-core/src/test_fixture/sharing.rs @@ -1,30 +1,32 @@ use std::{borrow::Borrow, iter::zip, ops::Deref}; use crate::{ - ff::{Field, PrimeField}, + ff::{Field, PrimeField, U128Conversions}, secret_sharing::{ replicated::{ malicious::{AdditiveShare as MaliciousReplicated, ExtendableField}, semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing, }, - BitDecomposed, FieldSimd, Vectorizable, + BitDecomposed, FieldSimd, SharedValue, Vectorizable, }, }; /// Deconstructs a field value into N values, one for each bit. -pub fn into_bits(v: F) -> BitDecomposed { +/// +/// The bit width is determined based on the field type. +pub fn into_bits(v: F) -> BitDecomposed { BitDecomposed::decompose(u128::BITS - F::PRIME.into().leading_zeros(), |i| { F::truncate_from((v.as_u128() >> i) & 1) }) } /// Deconstructs a value into N values, one for each bit. -/// # Panics -/// It won't +/// +/// The bit width is specified explicitly. #[must_use] -pub fn get_bits(x: u32, num_bits: u32) -> BitDecomposed { - BitDecomposed::decompose(num_bits, |i| F::truncate_from((x >> i) & 1)) +pub fn get_bits(x: u32, num_bits: u32) -> BitDecomposed { + BitDecomposed::decompose(num_bits, |i| V::truncate_from((x >> i) & 1)) } /// A trait that is helpful for reconstruction of values in tests. @@ -49,8 +51,8 @@ pub trait ReconstructArr { fn reconstruct_arr(&self) -> T; } -impl Reconstruct for [&Replicated; 3] { - fn reconstruct(&self) -> F { +impl Reconstruct for [&Replicated; 3] { + fn reconstruct(&self) -> V { let s0 = &self[0]; let s1 = &self[1]; let s2 = &self[2]; @@ -68,8 +70,8 @@ impl Reconstruct for [&Replicated; 3] { } } -impl Reconstruct for [Replicated; 3] { - fn reconstruct(&self) -> F { +impl Reconstruct for [Replicated; 3] { + fn reconstruct(&self) -> V { [&self[0], &self[1], &self[2]].reconstruct() } } @@ -153,7 +155,7 @@ where #[cfg(feature = "descriptive-gate")] impl Reconstruct for [crate::protocol::boolean::RandomBitsShare; 3] where - F: Field, + F: Field + U128Conversions, S: crate::secret_sharing::SecretSharing, for<'a> [&'a S; 3]: Reconstruct, { From fbff7f1a0c200bc1f84091325281104e04a09db5 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Tue, 20 Feb 2024 17:28:57 -0800 Subject: [PATCH 032/135] Unwind panics occurred in spawned tasks (#950) * Unwind panics occurred in spawned tasks We panic in these cases anyway, but it would be better to see the real message * Shim for Shuttle's `JoinError` --- ipa-core/src/lib.rs | 19 +++++++++++++++ ipa-core/src/seq_join/multi_thread.rs | 34 ++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/ipa-core/src/lib.rs b/ipa-core/src/lib.rs index 547817339..50e2d98d6 100644 --- a/ipa-core/src/lib.rs +++ b/ipa-core/src/lib.rs @@ -74,6 +74,25 @@ pub(crate) mod task { pub use shuttle::future::{JoinError, JoinHandle}; } +#[cfg(feature = "shuttle")] +pub(crate) mod shim { + use std::any::Any; + + use shuttle_crate::future::JoinError; + + /// There is currently an API mismatch between Tokio and Shuttle `JoinError` implementations. + /// This trait brings them closer together, until it is addressed + pub trait Tokio: Sized { + fn try_into_panic(self) -> Result, Self>; + } + + impl Tokio for JoinError { + fn try_into_panic(self) -> Result, Self> { + Err(self) // Shuttle `JoinError` does not wrap panics + } + } +} + #[cfg(not(all(feature = "shuttle", test)))] pub(crate) mod task { pub use tokio::task::{JoinError, JoinHandle}; diff --git a/ipa-core/src/seq_join/multi_thread.rs b/ipa-core/src/seq_join/multi_thread.rs index 0022c7bc3..492dcae9f 100644 --- a/ipa-core/src/seq_join/multi_thread.rs +++ b/ipa-core/src/seq_join/multi_thread.rs @@ -89,6 +89,9 @@ where type Item = F::Output; fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + #[cfg(feature = "shuttle")] + use crate::shim::Tokio; + let mut this = self.project(); // Draw more values from the input, up to the capacity. @@ -114,7 +117,13 @@ where if this.spawner.remaining() > 0 { this.spawner.as_mut().poll_next(cx).map(|v| match v { Some(Ok(v)) => Some(v), - Some(Err(_)) => panic!("SequentialFutures: spawned task aborted"), + Some(Err(e)) => { + if let Ok(reason) = e.try_into_panic() { + std::panic::resume_unwind(reason); + } else { + panic!("SequentialFutures: spawned task is cancelled") + } + } None => None, }) } else if this.source.is_done() { @@ -168,9 +177,11 @@ where #[cfg(all(test, unit_test))] mod tests { - use std::{future::Future, pin::Pin}; + use std::{future::Future, num::NonZeroUsize, pin::Pin}; + + use futures_util::future::lazy; - use crate::test_executor::run; + use crate::{seq_join::seq_try_join_all, test_executor::run}; /// This test demonstrates that forgetting the future returned by `parallel_join` is not safe and will cause /// use-after-free safety error. It spawns a few tasks that constantly try to access the `borrow_from_me` weak @@ -248,4 +259,21 @@ mod tests { drop(f); }); } + + #[test] + #[should_panic(expected = "panic in task 1")] + fn panic_from_task_unwinds_to_main() { + fn f(i: u32) -> impl Future> { + lazy(move |_| match i { + 1 => panic!("panic in task 1"), + i => Ok(i), + }) + } + + run(|| async { + let active = NonZeroUsize::new(10).unwrap(); + let _ = seq_try_join_all(active, (1..=3).map(f)).await; + assert!(false, "Should have aborted earlier"); + }); + } } From 5e23eb0a9ff151da92d30dcfe87ae9924f67c75b Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 25 Jan 2024 11:23:12 -0800 Subject: [PATCH 033/135] Clean up `Field` trait * Remove `Field` trait impl from Boolean arrays. * Remove u128 conversions from `Fp25519`. * Add `select` variant of `if_else`. `select` is bus multiplexer with a single-bit control input. `if_else` is a vectorizable multiplexer, with condition input the same width as the data inputs. * Remove `Field` (or replace with `SharedValue`) in various trait bounds. * Implement `Vectorizable` and related traits for more boolean arrays. Fixes #812 --- ipa-core/src/ff/boolean.rs | 16 ---- ipa-core/src/ff/boolean_array.rs | 72 +++------------ ipa-core/src/ff/ec_prime_field.rs | 50 +++-------- ipa-core/src/ff/field.rs | 6 +- ipa-core/src/protocol/basics/check_zero.rs | 4 +- ipa-core/src/protocol/basics/if_else.rs | 62 ++++++++++++- ipa-core/src/protocol/basics/mod.rs | 4 +- ipa-core/src/protocol/basics/mul/mod.rs | 60 +++++++++++++ .../boolean_ops/addition_sequential.rs | 19 ++-- .../comparison_and_subtraction_sequential.rs | 25 +++--- .../boolean_ops/share_conversion_aby.rs | 4 +- ipa-core/src/protocol/ipa_prf/mod.rs | 20 +++-- .../prf_sharding/feature_label_dot_product.rs | 18 ++-- .../src/protocol/ipa_prf/prf_sharding/mod.rs | 90 ++++++++++--------- ipa-core/src/protocol/ipa_prf/quicksort.rs | 19 ++-- ipa-core/src/protocol/prss/crypto.rs | 2 +- ipa-core/src/secret_sharing/array.rs | 8 +- ipa-core/src/secret_sharing/mod.rs | 75 ++++++++++++++-- ipa-core/src/test_fixture/input/sharing.rs | 8 +- 19 files changed, 327 insertions(+), 235 deletions(-) diff --git a/ipa-core/src/ff/boolean.rs b/ipa-core/src/ff/boolean.rs index 954d9806f..04bb22551 100644 --- a/ipa-core/src/ff/boolean.rs +++ b/ipa-core/src/ff/boolean.rs @@ -197,22 +197,6 @@ impl FromRandomU128 for Boolean { } } -impl Vectorizable<64> for Boolean { - type Array = crate::ff::boolean_array::BA64; -} - -impl FieldVectorizable<64> for Boolean { - type ArrayAlias = crate::ff::boolean_array::BA64; -} - -impl Vectorizable<256> for Boolean { - type Array = crate::ff::boolean_array::BA256; -} - -impl FieldVectorizable<256> for Boolean { - type ArrayAlias = crate::ff::boolean_array::BA256; -} - #[cfg(all(test, unit_test))] mod test { use generic_array::GenericArray; diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index 3078f5856..ba43f05ea 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -1,5 +1,5 @@ use bitvec::{ - prelude::{bitarr, BitArr, Lsb0}, + prelude::{BitArr, Lsb0}, slice::Iter, }; use generic_array::GenericArray; @@ -9,7 +9,7 @@ use crate::{ error::LengthError, ff::{boolean::Boolean, ArrayAccess, ArrayBuilder, Field, Serializable, U128Conversions}, protocol::prss::{FromRandom, FromRandomU128}, - secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, + secret_sharing::{Block, SharedValue, StdArray, Vectorizable}, }; /// The implementation below cannot be constrained without breaking Rust's @@ -78,64 +78,11 @@ where } } -/// A value of ONE has a one in the first element of the bit array, followed by `$bits-1` zeros. -/// This macro uses a bit of recursive repetition to produce those zeros. -/// -/// The longest call is 8 bits, which involves `2(n+1)` macro expansions in addition to `bitarr!`. -macro_rules! bitarr_one { - - // The binary value of `$bits-1` is expanded in MSB order for each of the values we care about. - // e.g., 20 =(-1)=> 19 =(binary)=> 0b10011 =(expand)=> 1 0 0 1 1 - - (2) => { bitarr_one!(1) }; - (3) => { bitarr_one!(1 0) }; - (4) => { bitarr_one!(1 1) }; - (5) => { bitarr_one!(1 0 0) }; - (6) => { bitarr_one!(1 0 1) }; - (7) => { bitarr_one!(1 1 0) }; - (8) => { bitarr_one!(1 1 1) }; - (20) => { bitarr_one!(1 0 0 1 1) }; - (32) => { bitarr_one!(1 1 1 1 1) }; - (64) => { bitarr_one!(1 1 1 1 1 1) }; - (112) => { bitarr_one!(1 1 0 1 1 1 1) }; - (256) => { bitarr_one!(1 1 1 1 1 1 1 1) }; - - // Incrementally convert 1 or 0 into `[0,]` or `[]` as needed for the recursion step. - // This also reverses the bit order so that the MSB comes last, as needed for recursion. - - // This passes a value back once the conversion is done. - ($([$($x:tt)*])*) => { bitarr_one!(@r $([$($x)*])*) }; - // This converts one 1 into `[0,]`. - ($([$($x:tt)*])* 1 $($y:tt)*) => { bitarr_one!([0,] $([$($x)*])* $($y)*) }; - // This converts one 0 into `[]`. - ($([$($x:tt)*])* 0 $($y:tt)*) => { bitarr_one!([] $([$($x)*])* $($y)*) }; - - // Recursion step. - - // This is where recursion ends with a `BitArray`. - (@r [$($x:tt)*]) => { bitarr![const u8, Lsb0; 1, $($x)*] }; - // This is the recursion workhorse. It takes a list of lists. The outer lists are bracketed. - // The inner lists contain any form that can be repeated and concatenated, which probably - // means comma-separated values with a trailing comma. - // The first value is repeated once. - // The second value is repeated twice and merged into the first value. - // The third and subsequent values are repeated twice and shifted along one place. - // One-valued bits are represented as `[0,]`, zero-valued bits as `[]`. - (@r [$($x:tt)*] [$($y:tt)*] $([$($z:tt)*])*) => { bitarr_one!(@r [$($x)* $($y)* $($y)*] $([$($z)* $($z)*])*) }; -} - // Macro for boolean arrays <= 128 bits. macro_rules! boolean_array_impl_small { ($modname:ident, $name:ident, $bits:tt, $deser_type:tt) => { boolean_array_impl!($modname, $name, $bits, $deser_type); - // TODO(812): remove this impl; BAs are not field elements. - impl Field for $name { - const NAME: &'static str = stringify!($name); - - const ONE: Self = Self(bitarr_one!($bits)); - } - impl U128Conversions for $name { fn truncate_from>(v: T) -> Self { let v = v.into(); @@ -193,10 +140,6 @@ macro_rules! boolean_array_impl_small { Self::truncate_from(src) } } - - impl FieldVectorizable<1> for $name { - type ArrayAlias = StdArray<$name, 1>; - } }; } @@ -237,6 +180,8 @@ macro_rules! impl_serializable_trait { #[cfg(all(test, unit_test))] mod fallible_serialization_tests { + use rand::{thread_rng, Rng}; + use super::*; /// [`https://github.com/private-attribution/ipa/issues/911`] @@ -252,6 +197,8 @@ macro_rules! impl_serializable_trait { "Padding only makes sense for lengths that are not multiples of 8." ); + let mut rng = thread_rng(); + let mut non_zero_padding = $name::ZERO.0; non_zero_padding.set($bits, true); assert_eq!( @@ -262,12 +209,13 @@ macro_rules! impl_serializable_trait { let min_value = $name::ZERO.0; deserialize(min_value).unwrap(); - let one = $name::ONE.0; - deserialize(one).unwrap(); - let mut max_value = $name::ZERO.0; max_value[..$bits].fill(true); deserialize(max_value).unwrap(); + + let mut rnd_value = $name::ZERO.0; + rnd_value[..$bits].fill_with(|_| rng.gen()); + deserialize(rnd_value).unwrap(); } } }; diff --git a/ipa-core/src/ff/ec_prime_field.rs b/ipa-core/src/ff/ec_prime_field.rs index 147defaad..dad5ca0f4 100644 --- a/ipa-core/src/ff/ec_prime_field.rs +++ b/ipa-core/src/ff/ec_prime_field.rs @@ -2,14 +2,12 @@ use std::convert::Infallible; use curve25519_dalek::scalar::Scalar; use generic_array::GenericArray; -use hkdf::Hkdf; -use sha2::Sha256; -use typenum::U32; +use typenum::{U2, U32}; use crate::{ - ff::{boolean_array::BA256, Field, Serializable, U128Conversions}, + ff::{boolean_array::BA256, Field, Serializable}, impl_shared_value_common, - protocol::prss::FromRandomU128, + protocol::prss::FromRandom, secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, }; @@ -193,43 +191,17 @@ impl Field for Fp25519 { const ONE: Fp25519 = Fp25519::ONE; } -// TODO(812): remove these impls -impl U128Conversions for Fp25519 { - ///both following methods are based on hashing and do not allow to actually convert elements in Fp25519 - /// from or into u128. However it is sufficient to generate random elements in Fp25519 - fn as_u128(&self) -> u128 { - unimplemented!() - } +impl FromRandom for Fp25519 { + type SourceLength = U2; - ///PRSS uses `truncate_from function`, we need to expand the u128 using a PRG (Sha256) to a [u8;32] - fn truncate_from>(_v: T) -> Self { - unimplemented!() - } -} - -impl FromRandomU128 for Fp25519 { - fn from_random_u128(v: u128) -> Self { - let hk = Hkdf::::new(None, &v.to_le_bytes()); - let mut okm = [0u8; 32]; - //error invalid length from expand only happens when okm is very large - hk.expand(&[], &mut okm).unwrap(); - Fp25519::deserialize_infallible(&okm.into()) - } -} - -///implement `TryFrom` since required by Field -impl TryFrom for Fp25519 { - type Error = crate::error::Error; - - fn try_from(v: u128) -> Result { - let mut bits = [0u8; 32]; - bits[..].copy_from_slice(&v.to_le_bytes()); - let f: Fp25519 = Fp25519::ONE; - f.serialize((&mut bits).into()); - Ok(f) + fn from_random(src: GenericArray) -> Self { + let mut src_bytes = [0u8; 32]; + src_bytes[0..16].copy_from_slice(&src[0].to_le_bytes()); + src_bytes[16..32].copy_from_slice(&src[1].to_le_bytes()); + // Reduces mod order + Fp25519::deserialize_infallible(<&GenericArray>::from(&src_bytes)) } } -// TODO(812): end remove impls #[cfg(all(test, unit_test))] mod test { diff --git a/ipa-core/src/ff/field.rs b/ipa-core/src/ff/field.rs index 88d41087b..a7e9932ff 100644 --- a/ipa-core/src/ff/field.rs +++ b/ipa-core/src/ff/field.rs @@ -6,8 +6,7 @@ use std::{ use typenum::{U1, U4}; use crate::{ - error, - protocol::prss::FromRandomU128, + protocol::prss::FromRandom, secret_sharing::{Block, FieldVectorizable, SharedValue, Vectorizable}, }; @@ -26,8 +25,7 @@ pub trait Field: SharedValue + Mul + MulAssign - + FromRandomU128 - + TryFrom + + FromRandom + Into + Vectorizable<1> + FieldVectorizable<1, ArrayAlias = >::Array> diff --git a/ipa-core/src/protocol/basics/check_zero.rs b/ipa-core/src/protocol/basics/check_zero.rs index 192533d85..97d9f3723 100644 --- a/ipa-core/src/protocol/basics/check_zero.rs +++ b/ipa-core/src/protocol/basics/check_zero.rs @@ -6,7 +6,7 @@ use crate::{ protocol::{ basics::{reveal::Reveal, SecureMul}, context::Context, - prss::SharedRandomness, + prss::{FromRandom, SharedRandomness}, RecordId, }, secret_sharing::replicated::semi_honest::AdditiveShare as Replicated, @@ -47,7 +47,7 @@ pub(crate) enum Step { /// ## Errors /// Lots of things may go wrong here, from timeouts to bad output. They will be signalled /// back via the error response -pub async fn check_zero( +pub async fn check_zero( ctx: C, record_id: RecordId, v: &Replicated, diff --git a/ipa-core/src/protocol/basics/if_else.rs b/ipa-core/src/protocol/basics/if_else.rs index 3fe486983..0a2416f9f 100644 --- a/ipa-core/src/protocol/basics/if_else.rs +++ b/ipa-core/src/protocol/basics/if_else.rs @@ -1,11 +1,23 @@ use crate::{ error::Error, - ff::Field, - protocol::{basics::SecureMul, context::Context, RecordId}, - secret_sharing::{Linear as LinearSecretSharing, LinearRefOps}, + ff::{boolean::Boolean, Field}, + protocol::{ + basics::{mul::BooleanArrayMul, SecureMul}, + context::Context, + RecordId, + }, + secret_sharing::{replicated::semi_honest::AdditiveShare, LinearRefOps}, }; +/// Multiplexer. +/// /// Returns `true_value` if `condition` is a share of 1, else `false_value`. +/// If the arguments are vectors, all must have the same dimension and the +/// operation is performed element-wise. +/// +/// Each `condition` must be a share of either 0 or 1. +/// Each `true_value` and `false_value` may be any type supporting multiplication. +/// /// # Errors /// If the protocol fails to execute. pub async fn if_else( @@ -18,7 +30,7 @@ pub async fn if_else( where F: Field, C: Context, - S: LinearSecretSharing + SecureMul, + S: SecureMul, for<'a> &'a S: LinearRefOps<'a, S, F>, { // If `condition` is a share of 1 (true), then @@ -34,3 +46,45 @@ where .multiply(&(true_value - false_value), ctx, record_id) .await?) } + +/// Wide multiplexer. +/// +/// Returns `true_value` if `condition` is a share of 1, else `false_value`. +/// `condition` must be a single shared value. `true_value` and `false_value` +/// may be vectors, in which case one or the other is selected in its entirety, +/// depending on `condition`. +/// +/// `condition` must be a share of either 0 or 1. +/// `true_value` and `false_value` may be any type supporting multiplication, +/// vectors of a type supporting multiplication, or a type convertible to +/// one of those. +/// +/// # Errors +/// If the protocol fails to execute. +pub async fn select( + ctx: C, + record_id: RecordId, + condition: &AdditiveShare, + true_value: &B, + false_value: &B, +) -> Result +where + C: Context, + B: Clone + BooleanArrayMul, +{ + let false_value = false_value.clone().into(); + let true_value = true_value.clone().into(); + let condition = B::expand(condition).into(); + // If `condition` is a share of 1 (true), then + // false_value + condition * (true_value - false_value) + // = false_value + true_value - false_value + // = true_value + // + // If `condition` is a share of 0 (false), then + // false_value + condition * (true_value - false_value) + // = false_value + 0 + // = false_value + let product = B::multiply(ctx, record_id, &condition, &(true_value - &false_value)).await?; + + Ok((false_value + &product).into()) +} diff --git a/ipa-core/src/protocol/basics/mod.rs b/ipa-core/src/protocol/basics/mod.rs index f4db7fc9b..2b4065dd1 100644 --- a/ipa-core/src/protocol/basics/mod.rs +++ b/ipa-core/src/protocol/basics/mod.rs @@ -10,8 +10,8 @@ pub mod sum_of_product; #[cfg(feature = "descriptive-gate")] pub use check_zero::check_zero; -pub use if_else::if_else; -pub use mul::{MultiplyZeroPositions, SecureMul, ZeroPositions}; +pub use if_else::{if_else, select}; +pub use mul::{BooleanArrayMul, MultiplyZeroPositions, SecureMul, ZeroPositions}; pub use reshare::Reshare; pub use reveal::Reveal; pub use share_known_value::ShareKnownValue; diff --git a/ipa-core/src/protocol/basics/mul/mod.rs b/ipa-core/src/protocol/basics/mul/mod.rs index acab715c2..443982e00 100644 --- a/ipa-core/src/protocol/basics/mul/mod.rs +++ b/ipa-core/src/protocol/basics/mul/mod.rs @@ -1,8 +1,16 @@ +use std::ops::{Add, Sub}; + use async_trait::async_trait; use crate::{ error::Error, + ff::{ + boolean::Boolean, + boolean_array::{BA20, BA3, BA32, BA5, BA8}, + Expand, + }, protocol::{context::Context, RecordId}, + secret_sharing::replicated::semi_honest::AdditiveShare as Replicated, }; #[cfg(feature = "descriptive-gate")] @@ -39,3 +47,55 @@ pub trait SecureMul: Send + Sync + Sized { where C: 'fut; } + +use semi_honest::multiply as semi_honest_mul; + +// The BooleanArrayMul trait is implemented for types like `Replicated`. It hides the `N` +// const parameter so that implementations parameterized with a Boolean array type parameter (e.g. +// breakdown key type BK is BA8) can invoke vectorized multiply. Without this trait, those +// implementations would need to specify the `N` const parameter, which is tricky, because you +// can't supply an expression involving a type parameter (BK::BITS) as a const parameter. +#[async_trait] +pub trait BooleanArrayMul: + Expand> + From + Into +{ + type Vectorized: Send + + for<'a> Add<&'a Self::Vectorized, Output = Self::Vectorized> + + for<'a> Sub<&'a Self::Vectorized, Output = Self::Vectorized>; + + async fn multiply<'fut, C>( + ctx: C, + record_id: RecordId, + a: &'fut Self::Vectorized, + b: &'fut Self::Vectorized, + ) -> Result + where + C: Context + 'fut; +} + +macro_rules! boolean_array_mul { + ($dim:expr, $vec:ty) => { + #[async_trait] + impl BooleanArrayMul for Replicated<$vec> { + type Vectorized = Replicated; + + async fn multiply<'fut, C>( + ctx: C, + record_id: RecordId, + a: &'fut Self::Vectorized, + b: &'fut Self::Vectorized, + ) -> Result + where + C: Context + 'fut, + { + semi_honest_mul(ctx, record_id, a, b, ZeroPositions::NONE).await + } + } + }; +} + +boolean_array_mul!(3, BA3); +boolean_array_mul!(5, BA5); +boolean_array_mul!(8, BA8); +boolean_array_mul!(20, BA20); +boolean_array_mul!(32, BA32); diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs index e4b937790..dc27e6ef7 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs @@ -1,6 +1,8 @@ #[cfg(all(test, unit_test))] use ipa_macros::Step; +#[cfg(all(test, unit_test))] +use crate::secret_sharing::{FieldSimd, FieldVectorizable}; use crate::{ error::Error, ff::{ArrayAccess, CustomArray, Field}, @@ -46,19 +48,20 @@ where /// # Errors /// propagates errors from multiply #[cfg(all(test, unit_test))] -pub async fn integer_sat_add( +pub async fn integer_sat_add( ctx: C, record_id: RecordId, x: &AdditiveShare, y: &AdditiveShare, ) -> Result, Error> where + F: Field + FieldSimd + FieldVectorizable, C: Context, - S: CustomArray + Field, - S::Element: Field, + S: SharedValue + CustomArray, + AdditiveShare: From> + Into>, { use crate::{ff::Expand, protocol::basics::if_else}; - let mut carry = AdditiveShare::::ZERO; + let mut carry = AdditiveShare::::ZERO; let result = addition_circuit( ctx.narrow(&Step::SaturatedAddition), record_id, @@ -66,10 +69,11 @@ where y, &mut carry, ) - .await?; + .await? + .into(); // expand carry bit to array - let carry_array = AdditiveShare::::expand(&carry); + let carry_array = AdditiveShare::::expand(&carry).into(); // if carry_array==1 then {carry_array} else {result}: if_else( @@ -80,6 +84,7 @@ where &result, ) .await + .map(Into::into) } /// addition using bit adder @@ -237,7 +242,7 @@ mod test { let result = world .semi_honest((x_ba64, y_ba64), |ctx, x_y| async move { - integer_sat_add::<_, BA64>( + integer_sat_add::<_, _, _, 64>( ctx.set_total_records(1), protocol::RecordId(0), &x_y.0, diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs index 82b68e0e3..21b86aed5 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs @@ -9,6 +9,8 @@ use std::{borrow::Borrow, iter::repeat, ops::Not}; #[cfg(all(test, unit_test))] use ipa_macros::Step; +#[cfg(all(test, unit_test))] +use crate::secret_sharing::FieldVectorizable; use crate::{ error::Error, ff::{ArrayAccessRef, ArrayBuild, ArrayBuilder, Field}, @@ -113,22 +115,22 @@ where /// # Errors /// propagates errors from multiply #[cfg(all(test, unit_test))] -pub async fn integer_sat_sub( +pub async fn integer_sat_sub( ctx: C, record_id: RecordId, x: &AdditiveShare, y: &AdditiveShare, ) -> Result, Error> where + F: Field + FieldSimd + FieldVectorizable, C: Context, - S::Element: Field, - S: SharedValue + CustomArray + Expand, - AdditiveShare: SecureMul - + ArrayAccessRef> - + ArrayBuild>, - AdditiveShare: SecureMul + Not>, + S: SharedValue + CustomArray, + AdditiveShare: + ArrayAccessRef> + ArrayBuild>, + AdditiveShare: SecureMul + Not>, + AdditiveShare: From> + Into>, { - let mut carry = AdditiveShare::::share_known_value(&ctx, S::Element::ONE); + let mut carry = AdditiveShare::::share_known_value(&ctx, F::ONE); let result = subtraction_circuit( ctx.narrow(&Step::SaturatedSubtraction), record_id, @@ -136,14 +138,17 @@ where y, &mut carry, ) - .await?; + .await? + .into(); // carry computes carry=(x>=y) // if carry==0 {all 0 array, i.e. Array[carry]} else {result}: // compute (1-carry)*Array[carry]+carry*result =carry*result AdditiveShare::::expand(&carry) + .into() .multiply(&result, ctx.narrow(&Step::MultiplyWithCarry), record_id) .await + .map(Into::into) } /// subtraction using bit subtractor @@ -569,7 +574,7 @@ mod test { let result = world .semi_honest(records.into_iter(), |ctx, x_y| async move { - integer_sat_sub::<_, BA64>( + integer_sat_sub::<_, _, _, 64>( ctx.set_total_records(1), protocol::RecordId(0), &x_y[0], diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs index 95fcf4417..9ac7ca68a 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs @@ -6,7 +6,7 @@ use crate::{ error::Error, ff::{ boolean::Boolean, boolean_array::BA256, ec_prime_field::Fp25519, ArrayAccess, CustomArray, - Expand, Field, + Expand, }, helpers::Role, protocol::{ @@ -99,7 +99,7 @@ pub async fn convert_to_fp25519( ) -> Result, Error> where C: Context, - B: SharedValue + CustomArray + Field, + B: SharedValue + CustomArray, { // generate sh_r = (0, 0, sh_r) and sh_s = (sh_s, 0, 0) // the two highest bits are set to 0 to allow carries for two additions diff --git a/ipa-core/src/protocol/ipa_prf/mod.rs b/ipa-core/src/protocol/ipa_prf/mod.rs index 8068a5684..2c241f9ad 100644 --- a/ipa-core/src/protocol/ipa_prf/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/mod.rs @@ -8,10 +8,11 @@ use self::{quicksort::quicksort_ranges_by_key_insecure, shuffle::shuffle_inputs} use crate::{ error::{Error, UnwrapInfallible}, ff::{ - boolean::Boolean, boolean_array::BA64, CustomArray, Field, PrimeField, Serializable, + boolean::Boolean, boolean_array::BA64, CustomArray, PrimeField, Serializable, U128Conversions, }, protocol::{ + basics::BooleanArrayMul, context::{UpgradableContext, UpgradedContext}, ipa_prf::{ boolean_ops::convert_to_fp25519, @@ -171,10 +172,13 @@ where C: UpgradableContext, C::UpgradedContext: UpgradedContext>, C::UpgradedContext: UpgradedContext>, - BK: SharedValue + U128Conversions + CustomArray + Field, - TV: SharedValue + U128Conversions + CustomArray + Field, - TS: SharedValue + U128Conversions + CustomArray + Field, - SS: SharedValue + U128Conversions + CustomArray + Field, + BK: SharedValue + U128Conversions + CustomArray, + TV: SharedValue + U128Conversions + CustomArray, + TS: SharedValue + U128Conversions + CustomArray, + SS: SharedValue + U128Conversions + CustomArray, + Replicated: BooleanArrayMul, + Replicated: BooleanArrayMul, + Replicated: BooleanArrayMul, F: PrimeField + ExtendableField, Replicated: Serializable, { @@ -212,9 +216,9 @@ where C: UpgradableContext, C::UpgradedContext: UpgradedContext>, C::UpgradedContext: UpgradedContext>, - BK: SharedValue + CustomArray + Field, - TV: SharedValue + CustomArray + Field, - TS: SharedValue + CustomArray + Field, + BK: SharedValue + CustomArray, + TV: SharedValue + CustomArray, + TS: SharedValue + CustomArray, F: PrimeField + ExtendableField, Replicated: Serializable, { diff --git a/ipa-core/src/protocol/ipa_prf/prf_sharding/feature_label_dot_product.rs b/ipa-core/src/protocol/ipa_prf/prf_sharding/feature_label_dot_product.rs index c706395c4..8cb9bec5a 100644 --- a/ipa-core/src/protocol/ipa_prf/prf_sharding/feature_label_dot_product.rs +++ b/ipa-core/src/protocol/ipa_prf/prf_sharding/feature_label_dot_product.rs @@ -6,9 +6,9 @@ use ipa_macros::Step; use crate::{ error::Error, - ff::{boolean::Boolean, CustomArray, Expand, Field, PrimeField, Serializable}, + ff::{boolean::Boolean, CustomArray, Field, PrimeField, Serializable}, protocol::{ - basics::{if_else, SecureMul, ShareKnownValue}, + basics::{select, BooleanArrayMul, SecureMul, ShareKnownValue}, boolean::or::or, context::{Context, UpgradableContext, UpgradedContext, Validator}, modulus_conversion::convert_bits, @@ -57,7 +57,8 @@ impl InputsRequiredFromPrevRow { ) -> Result, Error> where C: UpgradedContext>, - FV: CustomArray + Field, + FV: SharedValue + CustomArray, + Replicated: BooleanArrayMul, { let share_of_one = Replicated::share_known_value(&ctx, Boolean::ONE); let is_source_event = &share_of_one - &input_row.is_trigger_bit; @@ -92,11 +93,10 @@ impl InputsRequiredFromPrevRow { ) .await?; - let capped_label_vector = Replicated::::expand(&capped_label); - let capped_attributed_feature_vector = if_else( + let capped_attributed_feature_vector = select( ctx.narrow(&Step::ComputedCappedFeatureVector), record_id, - &capped_label_vector, + &capped_label, &input_row.feature_vector, &Replicated::::ZERO, ) @@ -223,7 +223,8 @@ where C::UpgradedContext: UpgradedContext>, C::UpgradedContext: UpgradedContext, S: LinearSecretSharing + Serializable + SecureMul>, - FV: CustomArray + Field, + FV: SharedValue + CustomArray, + Replicated: BooleanArrayMul, F: PrimeField + ExtendableField, { assert!(::BITS > 0); @@ -300,7 +301,8 @@ async fn evaluate_per_user_attribution_circuit( ) -> Result>, Error> where C: UpgradedContext>, - FV: CustomArray + Field, + FV: SharedValue + CustomArray, + Replicated: BooleanArrayMul, { assert!(!rows_for_user.is_empty()); if rows_for_user.len() == 1 { diff --git a/ipa-core/src/protocol/ipa_prf/prf_sharding/mod.rs b/ipa-core/src/protocol/ipa_prf/prf_sharding/mod.rs index 52a50b4d1..eb7a9d9e1 100644 --- a/ipa-core/src/protocol/ipa_prf/prf_sharding/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/prf_sharding/mod.rs @@ -20,7 +20,7 @@ use crate::{ }, helpers::Role, protocol::{ - basics::{if_else, SecureMul, ShareKnownValue}, + basics::{select, BooleanArrayMul, SecureMul, ShareKnownValue}, boolean::or::or, context::{Context, UpgradableContext, UpgradedContext, Validator}, ipa_prf::boolean_ops::{ @@ -102,10 +102,13 @@ struct InputsRequiredFromPrevRow InputsRequiredFromPrevRow where - BK: SharedValue + U128Conversions + CustomArray + Field, - TV: SharedValue + U128Conversions + CustomArray + Field, - TS: SharedValue + U128Conversions + CustomArray + Field, - SS: SharedValue + U128Conversions + CustomArray + Field, + BK: SharedValue + U128Conversions + CustomArray, + TV: SharedValue + U128Conversions + CustomArray, + TS: SharedValue + U128Conversions + CustomArray, + SS: SharedValue + U128Conversions + CustomArray, + Replicated: BooleanArrayMul, + Replicated: BooleanArrayMul, + Replicated: BooleanArrayMul, { /// /// This function contains the main logic for the per-user attribution circuit. @@ -466,10 +469,13 @@ where C::UpgradedContext: UpgradedContext>, C::UpgradedContext: UpgradedContext, S: LinearSecretSharing + Serializable + SecureMul>, - BK: SharedValue + U128Conversions + CustomArray + Field, - TV: SharedValue + U128Conversions + CustomArray + Field, - TS: SharedValue + U128Conversions + CustomArray + Field, - SS: SharedValue + U128Conversions + CustomArray + Field, + BK: SharedValue + U128Conversions + CustomArray, + TV: SharedValue + U128Conversions + CustomArray, + TS: SharedValue + U128Conversions + CustomArray, + SS: SharedValue + U128Conversions + CustomArray, + Replicated: BooleanArrayMul, + Replicated: BooleanArrayMul, + Replicated: BooleanArrayMul, F: PrimeField + ExtendableField, { // Get the validator and context to use for Boolean multiplication operations @@ -572,10 +578,13 @@ async fn evaluate_per_user_attribution_circuit( ) -> Result>, Error> where C: Context, - BK: SharedValue + U128Conversions + CustomArray + Field, - TV: SharedValue + U128Conversions + CustomArray + Field, - TS: SharedValue + U128Conversions + CustomArray + Field, - SS: SharedValue + U128Conversions + CustomArray + Field, + BK: SharedValue + U128Conversions + CustomArray, + TV: SharedValue + U128Conversions + CustomArray, + TS: SharedValue + U128Conversions + CustomArray, + SS: SharedValue + U128Conversions + CustomArray, + Replicated: BooleanArrayMul, + Replicated: BooleanArrayMul, + Replicated: BooleanArrayMul, { assert!(!rows_for_user.is_empty()); if rows_for_user.len() == 1 { @@ -644,14 +653,13 @@ async fn breakdown_key_of_most_recent_source_event( ) -> Result, Error> where C: Context, - BK: SharedValue + CustomArray + Field, + BK: SharedValue + CustomArray, + Replicated: BooleanArrayMul, { - let is_trigger_bit_array = Replicated::::expand(is_trigger_bit); - - if_else( + select( ctx, record_id, - &is_trigger_bit_array, + is_trigger_bit, prev_row_breakdown_key_bits, cur_row_breakdown_key_bits, ) @@ -670,17 +678,16 @@ async fn timestamp_of_most_recent_source_event( ) -> Result, Error> where C: Context, - TS: SharedValue + U128Conversions + CustomArray + Field, + TS: SharedValue + U128Conversions + CustomArray, + Replicated: BooleanArrayMul, { match attribution_window_seconds { None => Ok(prev_row_timestamp_bits.clone()), Some(_) => { - let is_trigger_bit_array = Replicated::::expand(is_trigger_bit); - - if_else( + select( ctx, record_id, - &is_trigger_bit_array, + is_trigger_bit, prev_row_timestamp_bits, cur_row_timestamp_bits, ) @@ -711,8 +718,9 @@ async fn zero_out_trigger_value_unless_attributed( ) -> Result, Error> where C: Context, - TV: SharedValue + U128Conversions + CustomArray + Field, - TS: SharedValue + U128Conversions + CustomArray + Field, + TV: SharedValue + U128Conversions + CustomArray, + TS: SharedValue + U128Conversions + CustomArray, + Replicated: BooleanArrayMul, { let (did_trigger_get_attributed, is_trigger_within_window) = try_join( is_trigger_bit.multiply( @@ -740,12 +748,10 @@ where did_trigger_get_attributed.clone() }; - let zero_out_flag_array = Replicated::::expand(&zero_out_flag); - - if_else( + select( ctx, record_id, - &zero_out_flag_array, + &zero_out_flag, trigger_value, &Replicated::::ZERO, ) @@ -765,7 +771,7 @@ async fn is_trigger_event_within_attribution_window( ) -> Result, Error> where C: Context, - TS: SharedValue + U128Conversions + CustomArray + Field, + TS: SharedValue + U128Conversions + CustomArray, { if let Some(attribution_window_seconds) = attribution_window_seconds { let time_delta_bits = integer_sub( @@ -821,29 +827,25 @@ async fn compute_capped_trigger_value( ) -> Result, Error> where C: Context, - TV: SharedValue + U128Conversions + CustomArray + Field, + TV: SharedValue + U128Conversions + CustomArray, + Replicated: BooleanArrayMul, { let narrowed_ctx1 = ctx.narrow(&Step::ComputedCappedAttributedTriggerValueNotSaturatedCase); let narrowed_ctx2 = ctx.narrow(&Step::ComputedCappedAttributedTriggerValueJustSaturatedCase); - let is_saturated_array = Replicated::::expand(is_saturated); - - let is_saturated_and_prev_row_not_saturated_array = - Replicated::::expand(is_saturated_and_prev_row_not_saturated); - - let attributed_trigger_value_or_zero = if_else( + let attributed_trigger_value_or_zero = select( narrowed_ctx1, record_id, - &is_saturated_array, + is_saturated, &Replicated::new(::ZERO, ::ZERO), attributed_trigger_value, ) .await?; - if_else( + select( narrowed_ctx2, record_id, - &is_saturated_and_prev_row_not_saturated_array, + is_saturated_and_prev_row_not_saturated, prev_row_diff_to_cap, &attributed_trigger_value_or_zero, ) @@ -885,7 +887,7 @@ pub mod tests { trigger_value: u8, ) -> PreShardedAndSortedOPRFTestInput where - BK: SharedValue + U128Conversions + Field, + BK: SharedValue + U128Conversions, { oprf_test_input_with_timestamp( prf_of_match_key, @@ -904,7 +906,7 @@ pub mod tests { timestamp: u32, ) -> PreShardedAndSortedOPRFTestInput where - BK: SharedValue + U128Conversions + Field, + BK: SharedValue + U128Conversions, { let is_trigger_bit = if is_trigger { Boolean::ONE @@ -981,8 +983,8 @@ pub mod tests { impl Reconstruct for [&CappedAttributionOutputs; 3] where - BK: SharedValue + U128Conversions + CustomArray + Field, - TV: SharedValue + U128Conversions + CustomArray + Field, + BK: SharedValue + U128Conversions + CustomArray, + TV: SharedValue + U128Conversions + CustomArray, { fn reconstruct(&self) -> PreAggregationTestOutputInDecimal { let [s0, s1, s2] = self; diff --git a/ipa-core/src/protocol/ipa_prf/quicksort.rs b/ipa-core/src/protocol/ipa_prf/quicksort.rs index 3c9caaf42..dbc0ca189 100644 --- a/ipa-core/src/protocol/ipa_prf/quicksort.rs +++ b/ipa-core/src/protocol/ipa_prf/quicksort.rs @@ -155,7 +155,10 @@ where #[cfg(all(test, unit_test))] pub mod tests { - use std::cmp::Ordering; + use std::{ + cmp::Ordering, + iter::{repeat, repeat_with}, + }; use ipa_macros::Step; use rand::Rng; @@ -163,7 +166,7 @@ pub mod tests { use crate::{ ff::{ boolean_array::{BA20, BA64}, - Field, U128Conversions, + U128Conversions, }, protocol::{context::Context, ipa_prf::quicksort::quicksort_ranges_by_key_insecure}, rand::thread_rng, @@ -188,8 +191,7 @@ pub mod tests { for desc in bools { // generate vector of random values - let mut records: Vec = vec![::ONE; 20]; - records.iter_mut().for_each(|x| *x = rng.gen::()); + let records: Vec = repeat_with(|| rng.gen()).take(20).collect(); // convert expected into more readable format let mut expected: Vec = @@ -236,10 +238,8 @@ pub mod tests { let bools = vec![false, true]; for desc in bools { - // generate vector of random values - let element = rng.gen::(); - let mut records: Vec = vec![::ONE; 20]; - records.iter_mut().for_each(|x| *x = element); + // generate vector of 20 copies of same random value + let records: Vec = repeat(rng.gen()).take(20).collect(); // convert expected into more readable format let mut expected: Vec = @@ -334,8 +334,7 @@ pub mod tests { for desc in bools { // generate vector of random values - let mut records: Vec = vec![::ONE; 20]; - records.iter_mut().for_each(|x| *x = rng.gen::()); + let records: Vec = repeat_with(|| rng.gen()).take(20).collect(); // convert expected into more readable format let mut expected: Vec = diff --git a/ipa-core/src/protocol/prss/crypto.rs b/ipa-core/src/protocol/prss/crypto.rs index 25e68a1fe..a332b9bea 100644 --- a/ipa-core/src/protocol/prss/crypto.rs +++ b/ipa-core/src/protocol/prss/crypto.rs @@ -140,7 +140,7 @@ pub trait SharedRandomness { // Equivalent functionality could be obtained by defining an `Unreplicated` type that // implements `FromPrss`. #[must_use] - fn zero>(&self, index: I) -> V { + fn zero>(&self, index: I) -> V { let (l, r): (V, V) = self.generate(index); l - r } diff --git a/ipa-core/src/secret_sharing/array.rs b/ipa-core/src/secret_sharing/array.rs index effce79f1..f38e608c0 100644 --- a/ipa-core/src/secret_sharing/array.rs +++ b/ipa-core/src/secret_sharing/array.rs @@ -6,7 +6,7 @@ use std::{ }; use generic_array::{ArrayLength, GenericArray}; -use typenum::{U1, U32}; +use typenum::U32; use crate::{ error::LengthError, @@ -270,9 +270,9 @@ impl, const N: usize> Not for StdArray { } } -impl> FromRandom for StdArray { - type SourceLength = U1; - fn from_random(src: GenericArray) -> Self { +impl FromRandom for StdArray { + type SourceLength = ::SourceLength; + fn from_random(src: GenericArray) -> Self { Self([F::from_random(src)]) } } diff --git a/ipa-core/src/secret_sharing/mod.rs b/ipa-core/src/secret_sharing/mod.rs index a7ac163b9..7fa77a89f 100644 --- a/ipa-core/src/secret_sharing/mod.rs +++ b/ipa-core/src/secret_sharing/mod.rs @@ -22,8 +22,12 @@ //! a trait bound, something like `F: Field + FieldSimd`. //! //! The other traits are `Vectorizable` (for `SharedValue`s) and `FieldVectorizable`. These traits -//! are needed to work around a limitation in the rust type system. See the `FieldVectorizable` -//! documentation for details. +//! are needed to work around a limitation in the rust type system. In most cases, you do not need +//! to reference the `Vectorizable` or `FieldVectorizable` traits directly when implementing +//! protocols. Usually the vector type is hidden within `AdditiveShare`, but if you are writing a +//! vectorized low-level primitive, you may need to refer to it directly, as `>::Array`. It is even more rare to need to use `FieldVectorizable`; see its +//! documentation and the documentation of `FieldSimd` for details. //! //! We require that each supported vectorization configuration (i.e. combination of data type and //! width) be explicitly identified, by implementing the `Vectorizable` and/or `FieldVectorizable` @@ -64,14 +68,17 @@ use rand::{ distributions::{Distribution, Standard}, Rng, }; -#[cfg(any(test, feature = "test-fixture", feature = "cli"))] -use replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}; pub use scheme::{Bitwise, Linear, LinearRefOps, SecretSharing}; use crate::{ error::LengthError, - ff::{boolean::Boolean, AddSub, AddSubAssign, Field, Fp32BitPrime, Serializable}, + ff::{ + boolean::Boolean, + boolean_array::{BA20, BA256, BA3, BA32, BA5, BA64, BA8}, + AddSub, AddSubAssign, Field, Fp32BitPrime, Serializable, + }, protocol::prss::FromRandom, + secret_sharing::replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, }; /// Operations supported for weak shared values. @@ -190,13 +197,35 @@ pub trait Vectorizable: Sized { /// `Array` so that references to the `Array` associated type do not require qualification /// with a trait name. /// 3. `F: Vectorizable`. This is implied by the previous two, because `FieldArray` -/// is a sub-trait of `SharedValueArray`. +/// is a sub-trait of `SharedValueArray`. (See the `FieldSimd` documentation for another +/// important consequence of this sub-trait relationship.) pub trait FieldVectorizable: SharedValue + Sized { type ArrayAlias: FieldArray; } +// Convenience alias to express a supported vectorization when writing protocols. +// +// Typically appears like this: `F: Field + FieldSimd`. +// // We could define a `SharedValueSimd` trait that is the analog of this for `SharedValue`s, but // there are not currently any protocols that need it. +// +// Because we have constrained the associated types Vectorizable::Array and +// FieldVectorizable::ArrayAlias to be equal, the type they refer to must satisfy the union of all +// trait bounds applicable to either. However, in some cases the compiler has trouble proving +// properties related to this. (See rust issues [41118] and [60471].) A typical workaround for +// problems of this sort is to redundantly list a trait bound on both associated types, but for us +// that is not necessary in most cases because `FieldArray` is a sub-trait of `SharedValueArray`. +// +// Another consequence of this limitation of the compiler is that if you write the bound `F: Field + +// FieldSimd + Vectorizable`, you will get the error ``type annotations needed: +// cannot satisfy `>::Array == >::ArrayAlias```. The compiler is not smart enough to +// coalesce the constraints and see that `S`, `::Array`, and `::ArrayAlias` must all to refer to the same type. +// +// [41118](https://github.com/rust-lang/rust/issues/41118) +// [60471](https://github.com/rust-lang/rust/issues/60471) pub trait FieldSimd: Field + Vectorizable>::ArrayAlias> + FieldVectorizable { @@ -211,9 +240,39 @@ impl FieldSimd<1> for F {} impl FieldSimd<32> for Fp32BitPrime {} -impl FieldSimd<64> for Boolean {} +macro_rules! boolean_vector { + ($dim:expr, $vec:ty) => { + impl Vectorizable<$dim> for Boolean { + type Array = $vec; + } + + impl FieldVectorizable<$dim> for Boolean { + type ArrayAlias = $vec; + } + + impl FieldSimd<$dim> for Boolean {} + + impl From> for AdditiveShare { + fn from(value: AdditiveShare<$vec>) -> Self { + AdditiveShare::new_arr(value.left(), value.right()) + } + } + + impl From> for AdditiveShare<$vec> { + fn from(value: AdditiveShare) -> Self { + AdditiveShare::new(*value.left_arr(), *value.right_arr()) + } + } + }; +} -impl FieldSimd<256> for Boolean {} +boolean_vector!(3, BA3); +boolean_vector!(5, BA5); +boolean_vector!(8, BA8); +boolean_vector!(20, BA20); +boolean_vector!(32, BA32); +boolean_vector!(64, BA64); +boolean_vector!(256, BA256); pub trait SharedValueArray: Clone diff --git a/ipa-core/src/test_fixture/input/sharing.rs b/ipa-core/src/test_fixture/input/sharing.rs index 1d674efff..eb706bd4f 100644 --- a/ipa-core/src/test_fixture/input/sharing.rs +++ b/ipa-core/src/test_fixture/input/sharing.rs @@ -1,7 +1,7 @@ use std::iter::{repeat, zip}; use crate::{ - ff::{boolean::Boolean, boolean_array::BA64, Field, U128Conversions}, + ff::{boolean::Boolean, boolean_array::BA64, U128Conversions}, protocol::ipa_prf::OPRFIPAInputRow, rand::Rng, report::{EventType, OprfReport}, @@ -67,9 +67,9 @@ where impl IntoShares> for TestRawDataRecord where - BK: SharedValue + Field + IntoShares>, - TV: SharedValue + Field + IntoShares>, - TS: SharedValue + Field + IntoShares>, + BK: SharedValue + U128Conversions + IntoShares>, + TV: SharedValue + U128Conversions + IntoShares>, + TS: SharedValue + U128Conversions + IntoShares>, { fn share_with(self, rng: &mut R) -> [OPRFIPAInputRow; 3] { let is_trigger = Replicated::new( From 38e2461ae200ccbe7a27a87e9fbac646b53d874a Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Wed, 21 Feb 2024 12:08:01 -0800 Subject: [PATCH 034/135] Eliminate async_trait for BooleanArrayMul --- ipa-core/src/protocol/basics/if_else.rs | 9 ++++-- ipa-core/src/protocol/basics/mul/mod.rs | 37 +++++++++++++++++++------ 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/ipa-core/src/protocol/basics/if_else.rs b/ipa-core/src/protocol/basics/if_else.rs index 0a2416f9f..ee89c19ea 100644 --- a/ipa-core/src/protocol/basics/if_else.rs +++ b/ipa-core/src/protocol/basics/if_else.rs @@ -2,7 +2,10 @@ use crate::{ error::Error, ff::{boolean::Boolean, Field}, protocol::{ - basics::{mul::BooleanArrayMul, SecureMul}, + basics::{ + mul::{boolean_array_multiply, BooleanArrayMul}, + SecureMul, + }, context::Context, RecordId, }, @@ -84,7 +87,9 @@ where // false_value + condition * (true_value - false_value) // = false_value + 0 // = false_value - let product = B::multiply(ctx, record_id, &condition, &(true_value - &false_value)).await?; + let product = + boolean_array_multiply::<_, B>(ctx, record_id, &condition, &(true_value - &false_value)) + .await?; Ok((false_value + &product).into()) } diff --git a/ipa-core/src/protocol/basics/mul/mod.rs b/ipa-core/src/protocol/basics/mul/mod.rs index 443982e00..82b6e9420 100644 --- a/ipa-core/src/protocol/basics/mul/mod.rs +++ b/ipa-core/src/protocol/basics/mul/mod.rs @@ -1,4 +1,7 @@ -use std::ops::{Add, Sub}; +use std::{ + future::Future, + ops::{Add, Sub}, +}; use async_trait::async_trait; @@ -55,40 +58,56 @@ use semi_honest::multiply as semi_honest_mul; // breakdown key type BK is BA8) can invoke vectorized multiply. Without this trait, those // implementations would need to specify the `N` const parameter, which is tricky, because you // can't supply an expression involving a type parameter (BK::BITS) as a const parameter. -#[async_trait] pub trait BooleanArrayMul: Expand> + From + Into { type Vectorized: Send + + Sync + for<'a> Add<&'a Self::Vectorized, Output = Self::Vectorized> - + for<'a> Sub<&'a Self::Vectorized, Output = Self::Vectorized>; + + for<'a> Sub<&'a Self::Vectorized, Output = Self::Vectorized> + + 'static; - async fn multiply<'fut, C>( + fn multiply<'fut, C>( ctx: C, record_id: RecordId, a: &'fut Self::Vectorized, b: &'fut Self::Vectorized, - ) -> Result + ) -> impl Future> + Send + 'fut where C: Context + 'fut; } +// Workaround for https://github.com/rust-lang/rust/issues/100013. Calling this wrapper function +// instead of `<_ as BooleanArrayMul>::multiply` seems to hide the BooleanArrayMul `impl Future` +// GAT. +pub fn boolean_array_multiply<'fut, C, B>( + ctx: C, + record_id: RecordId, + a: &'fut B::Vectorized, + b: &'fut B::Vectorized, +) -> impl Future> + Send + 'fut +where + C: Context + 'fut, + B: BooleanArrayMul, +{ + B::multiply(ctx, record_id, a, b) +} + macro_rules! boolean_array_mul { ($dim:expr, $vec:ty) => { - #[async_trait] impl BooleanArrayMul for Replicated<$vec> { type Vectorized = Replicated; - async fn multiply<'fut, C>( + fn multiply<'fut, C>( ctx: C, record_id: RecordId, a: &'fut Self::Vectorized, b: &'fut Self::Vectorized, - ) -> Result + ) -> impl Future> + Send + 'fut where C: Context + 'fut, { - semi_honest_mul(ctx, record_id, a, b, ZeroPositions::NONE).await + semi_honest_mul(ctx, record_id, a, b, ZeroPositions::NONE) } } }; From 2de66ed48a932e77b67007f14c7c6359865b10fd Mon Sep 17 00:00:00 2001 From: danielmasny Date: Wed, 21 Feb 2024 15:32:35 -0800 Subject: [PATCH 035/135] address Alex's comments --- ipa-core/src/ff/prime_field.rs | 7 +- .../ipa_prf/malicious_security/lagrange.rs | 118 ++++++++++++------ 2 files changed, 85 insertions(+), 40 deletions(-) diff --git a/ipa-core/src/ff/prime_field.rs b/ipa-core/src/ff/prime_field.rs index 5f32eb337..ef000cc0b 100644 --- a/ipa-core/src/ff/prime_field.rs +++ b/ipa-core/src/ff/prime_field.rs @@ -25,7 +25,6 @@ pub trait PrimeField: Field { /// /// ## Panics /// When `self` is `Zero` - #[must_use] fn invert(&self) -> Self { assert_ne!(*self, Self::ZERO); @@ -36,7 +35,7 @@ pub trait PrimeField: Field { let mut newr = self.as_u128(); let mut sign = 1u128; - while newr != 0u128 { + while newr != 0 { let quotient = r / newr; mem::swap(&mut t, &mut newt); mem::swap(&mut r, &mut newr); @@ -332,8 +331,8 @@ macro_rules! field_impl { assert!(matches!(err, GreaterThanPrimeError(..))) } - #[test] - fn test_invert(element: $field) { + #[test] + fn invert(element: $field) { if element != $field::ZERO { assert_eq!($field::ONE,element * element.invert() ); diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index 2ed9eee0f..0a3ab3291 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -1,9 +1,9 @@ use std::iter; use generic_array::{ArrayLength, GenericArray}; -use typenum::U1; +use typenum::{Unsigned, U1}; -use crate::ff::{Field, PrimeField}; +use crate::ff::{Field, PrimeField, Serializable}; /// A degree `N-1` polynomial is stored as `N` points `(x,y)` /// where the "x coordinates" of the input points are `x_0` to `x_N` are `F::ZERO` to `(N-1)*F::ONE` @@ -32,8 +32,16 @@ where /// When the field size is too small for `N` evaluation points pub fn new() -> Self { // assertion that field is large enough - // also checks that `try_from` for conversions from sufficiently small `u128` to `F` do not panic - debug_assert!(F::BITS > usize::BITS - N::USIZE.leading_zeros()); + // when it is large enough, `F::try_from().unwrap()` below does not panic + assert!( + F::BITS > usize::BITS - N::USIZE.leading_zeros(), + "Field size {} is not large enough to hold {} points", + F::BITS, + N::USIZE + ); + + // assertion that table is not too large for the stack + assert!(::Size::USIZE * N::USIZE < 2024); let mut denominator = iter::repeat(F::ONE) .take(N::USIZE) @@ -48,10 +56,18 @@ where } } -/// `LagrangeTable` is a precomputation table for the Lagrange evaluation. -/// The "x coordinates" of the input points are `x_0` to `x_(N-1)` are `F::ZERO` to `(N-1)*F::ONE`. -/// The `LagrangeTable` also specifies `M` "x coordinates" for the output points -/// The "x coordinates" of the output points are `x_N` to `x_(N+M-1)` are `N*F::ONE` to `(N+M-1)*F::ONE`. +/// `LagrangeTable` is a precomputed table for the Lagrange evaluation. +/// Allows to compute points on the polynomial, i.e. output points, +/// given enough points on the polynomial, i.e. input points, +/// by using the `eval` function. +/// The "x coordinates" are implicit. +/// The "y coordinates" of the input points are inputs to `eval`. +/// The output of `eval` are the "y coordinates" of the output points . +/// The "x coordinates" of the input points `x_0` to `x_(N-1)` are `F::ZERO` to `(N-1)*F::ONE`. +/// The `LagrangeTable` also specifies `M` "x coordinates" for the output points. +/// The "x coordinates" of the output points `x_N` to `x_(N+M-1)` are `N*F::ONE` to `(N+M-1)*F::ONE` +/// when generated using `from(denominator)` +/// unless generated using `new(denominator, x_output)` for a specific output "x coordinate" `x_output`. pub struct LagrangeTable { table: GenericArray, M>, } @@ -64,6 +80,9 @@ where /// generates a `CanonicalLagrangeTable` from `CanoncialLagrangeDenominators` for a single output point /// The "x coordinate" of the output point is `x_output`. pub fn new(denominator: CanonicalLagrangeDenominator, x_output: &F) -> Self { + // assertion that table is not too large for the stack + assert!(::Size::USIZE * N::USIZE < 2024); + let mut table = denominator.denominator; Self::compute_table_row(x_output, &mut table); LagrangeTable:: { @@ -103,7 +122,7 @@ where } } - /// helper function to compute a single row of `CanonicalLagrangeTable` + /// helper function to compute a single row of `LagrangeTable` /// /// ## Panics /// When the field size is too small for `N` evaluation points @@ -128,8 +147,17 @@ where { fn from(value: CanonicalLagrangeDenominator) -> Self { // assertion that field is large enough - // also checks that `try_from` for conversions from sufficiently small `u128` to `F` do not panic - debug_assert!(F::BITS > usize::BITS - (N::USIZE + M::USIZE).leading_zeros()); + // when it is large enough, `F::try_from().unwrap()` below does not panic + assert!( + F::BITS > usize::BITS - (N::USIZE + M::USIZE).leading_zeros(), + "Field size {} is not large enough to hold {} + {} points", + F::BITS, + N::USIZE, + M::USIZE + ); + + // assertion that table is not too large for the stack + assert!(::Size::USIZE * N::USIZE * M::USIZE < 2024); let mut table = iter::repeat(value.denominator.clone()) .take(M::USIZE) @@ -206,35 +234,53 @@ mod test { } } + fn lagrange_single_output_point_using_new( + output_point: TestField, + input_points: [TestField; 32], + ) { + let polynomial_monomial_form = MonomialFormPolynomial { + coefficients: GenericArray::::from_array(input_points), + }; + let output_expected = polynomial_monomial_form.eval( + &GenericArray::::from_array([output_point; 1]), + ); + let polynomial = Polynomial::from(polynomial_monomial_form.clone()); + let denominator = CanonicalLagrangeDenominator::::new(); + // generate table using new + let lagrange_table = LagrangeTable::::new(denominator, &output_point); + let output = lagrange_table.eval(&polynomial); + assert_eq!(output, output_expected); + } + proptest! { - #[test] - fn lagrange_single_output_point_using_new(output_point: TestField, input_points in prop::array::uniform32(any::())){ - let polynomial_monomial_form = MonomialFormPolynomial{ - coefficients: GenericArray::::from_array(input_points)}; - let output_expected = polynomial_monomial_form.eval( - &GenericArray::::from_array([output_point;1])); - let polynomial = Polynomial::from(polynomial_monomial_form.clone()); - let denominator = CanonicalLagrangeDenominator::::new(); - // generate table using new - let lagrange_table = LagrangeTable::::new(denominator,&output_point); - let output = lagrange_table.eval(&polynomial); - assert_eq!(output,output_expected); - } + #[test] + fn proptest_lagrange_single_output_point_using_new(output_point: TestField, input_points in prop::array::uniform32(any::())){ + lagrange_single_output_point_using_new(output_point,input_points); + } + } + fn lagrange_canonical_using_from(input_points: [TestField; 8]) { + let polynomial_monomial_form = MonomialFormPolynomial { + coefficients: GenericArray::::from_array(input_points), + }; + // the canonical x coordinates are 0..15, the outputs use coordinates 8..15: + let x_coordinates_output = (8..15) + .map(|i| TestField::try_from(i).unwrap()) + .collect::>(); + let output_expected = polynomial_monomial_form.eval(&x_coordinates_output); + let polynomial = Polynomial::from(polynomial_monomial_form.clone()); + let denominator = CanonicalLagrangeDenominator::::new(); + // generate table using from + let lagrange_table = LagrangeTable::::from(denominator); + let output = lagrange_table.eval(&polynomial); + assert_eq!(output, output_expected); + } + + proptest! { #[test] - fn lagrange_cannonical_using_from(input_points in prop::array::uniform8(any::())) + fn proptest_lagrange_canonical_using_from(input_points in prop::array::uniform8(any::())) { - let polynomial_monomial_form = MonomialFormPolynomial{ - coefficients: GenericArray::::from_array(input_points)}; - // the canonical x coordinates are 0..15, the outputs use coordinates 8..15: - let x_coordinates_output = (8..15).map(|i|TestField::try_from(i).unwrap()).collect::>(); - let output_expected = polynomial_monomial_form.eval(&x_coordinates_output); - let polynomial = Polynomial::from(polynomial_monomial_form.clone()); - let denominator = CanonicalLagrangeDenominator::::new(); - // generate table using from - let lagrange_table = LagrangeTable::::from(denominator); - let output = lagrange_table.eval(&polynomial); - assert_eq!(output,output_expected); + lagrange_canonical_using_from(input_points); } } } From 3c10b1b606551279c966f1226de2d3989ce478c8 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Wed, 21 Feb 2024 17:11:52 -0800 Subject: [PATCH 036/135] Rewritten arithmetic circuit benchmark The previous version of the benchmark did not use seq_join. Using seq_join is necessary for parallel execution, and also provides a fairer baseline for unvectorized serial operation. This change also generates test data outside the timed region (except under the iai framework, where that is not supported). --- ipa-core/benches/ct/arithmetic_circuit.rs | 40 +++-- ipa-core/benches/iai/arithmetic_circuit.rs | 10 +- .../benches/oneshot/arithmetic_circuit.rs | 3 +- ipa-core/src/test_fixture/circuit.rs | 150 ++++++++++++------ 4 files changed, 140 insertions(+), 63 deletions(-) diff --git a/ipa-core/benches/ct/arithmetic_circuit.rs b/ipa-core/benches/ct/arithmetic_circuit.rs index ee7a3ae75..73d45befc 100644 --- a/ipa-core/benches/ct/arithmetic_circuit.rs +++ b/ipa-core/benches/ct/arithmetic_circuit.rs @@ -1,6 +1,6 @@ use criterion::{ - black_box, criterion_group, criterion_main, measurement::Measurement, BenchmarkGroup, - BenchmarkId, Criterion, SamplingMode, Throughput, + black_box, criterion_group, criterion_main, measurement::Measurement, BatchSize, + BenchmarkGroup, BenchmarkId, Criterion, SamplingMode, Throughput, }; use ipa_core::{ ff::{Field, Fp31, Fp32BitPrime, U128Conversions}, @@ -16,6 +16,7 @@ fn do_benchmark( group: &mut BenchmarkGroup, width: u32, depth: u16, + active_work: usize, ) where M: Measurement, F: Field + FieldSimd + U128Conversions, @@ -25,11 +26,24 @@ fn do_benchmark( { group.throughput(Throughput::Elements((width * depth as u32) as u64)); group.bench_with_input( - BenchmarkId::new("circuit", format!("{width}:{depth}:{}x{}", F::NAME, N)), + BenchmarkId::new( + "circuit", + format!("{width}:{depth}:{active_work}:{}x{}", F::NAME, N), + ), &(width, depth), |b, &(width, depth)| { - b.to_async(rt) - .iter(|| circuit::arithmetic::(black_box(width), black_box(depth))); + b.to_async(rt).iter_batched( + || circuit::arithmetic_setup(width, depth), + |input| { + circuit::arithmetic::( + black_box(width), + black_box(depth), + active_work, + input, + ) + }, + BatchSize::PerIteration, + ); }, ); } @@ -46,14 +60,16 @@ pub fn criterion_benchmark(c: &mut Criterion) { group.sample_size(10); group.sampling_mode(SamplingMode::Flat); - do_benchmark::<_, Fp31, 1>(&rt, &mut group, 512_000, 1); - do_benchmark::<_, Fp31, 1>(&rt, &mut group, 51_200, 10); - do_benchmark::<_, Fp31, 1>(&rt, &mut group, 8_000, 64); + // Note that the width parameter (3rd-to-last argument to do_benchmark) must + // be a multiple of the vectorization width. - do_benchmark::<_, Fp32BitPrime, 1>(&rt, &mut group, 25_600, 10); - do_benchmark::<_, Fp32BitPrime, 1>(&rt, &mut group, 2_560, 100); - do_benchmark::<_, Fp32BitPrime, 32>(&rt, &mut group, 4_000, 64); - do_benchmark::<_, Fp32BitPrime, 32>(&rt, &mut group, 250, 1_024); + do_benchmark::<_, Fp31, 1>(&rt, &mut group, 4_096, 64, 1024); + do_benchmark::<_, Fp31, 1>(&rt, &mut group, 1_024, 256, 1024); + + do_benchmark::<_, Fp32BitPrime, 1>(&rt, &mut group, 4_096, 64, 1024); + do_benchmark::<_, Fp32BitPrime, 1>(&rt, &mut group, 1_024, 256, 1024); + do_benchmark::<_, Fp32BitPrime, 32>(&rt, &mut group, 4_096, 64, 32); + do_benchmark::<_, Fp32BitPrime, 32>(&rt, &mut group, 1_024, 256, 32); } criterion_group!(benches, criterion_benchmark); diff --git a/ipa-core/benches/iai/arithmetic_circuit.rs b/ipa-core/benches/iai/arithmetic_circuit.rs index ef43e70a0..912c4648d 100644 --- a/ipa-core/benches/iai/arithmetic_circuit.rs +++ b/ipa-core/benches/iai/arithmetic_circuit.rs @@ -12,8 +12,16 @@ pub fn iai_benchmark() { const CIRCUIT_WIDTH: u32 = 500_000; const CIRCUIT_DEPTH: u16 = 1; + tracing::warn!("test data generation may skew results of this benchmark"); rt.block_on(async { - circuit::arithmetic::(black_box(CIRCUIT_WIDTH), black_box(CIRCUIT_DEPTH)).await; + let input = circuit::arithmetic_setup(CIRCUIT_WIDTH, CIRCUIT_DEPTH); + circuit::arithmetic::( + black_box(CIRCUIT_WIDTH), + black_box(CIRCUIT_DEPTH), + 1024, + input, + ) + .await; }) } diff --git a/ipa-core/benches/oneshot/arithmetic_circuit.rs b/ipa-core/benches/oneshot/arithmetic_circuit.rs index c78a409ea..459bd2e58 100644 --- a/ipa-core/benches/oneshot/arithmetic_circuit.rs +++ b/ipa-core/benches/oneshot/arithmetic_circuit.rs @@ -33,8 +33,9 @@ pub async fn main() { println!("benchmark parameters: Field size: {field_size} bits, circuit width: {width}, depth: {depth}"); } + let input = circuit::arithmetic_setup(args.width, args.depth); let start = Instant::now(); - circuit::arithmetic::(args.width, args.depth).await; + circuit::arithmetic::(args.width, args.depth, 1024, input).await; let duration = start.elapsed().as_secs_f32(); println!("benchmark complete after {duration}s"); diff --git a/ipa-core/src/test_fixture/circuit.rs b/ipa-core/src/test_fixture/circuit.rs index 2f1f67cb0..8bb3655b5 100644 --- a/ipa-core/src/test_fixture/circuit.rs +++ b/ipa-core/src/test_fixture/circuit.rs @@ -1,10 +1,11 @@ -use futures_util::future::join_all; +use std::{array, num::NonZeroUsize}; + +use futures::{future::join3, stream, StreamExt}; use rand::distributions::{Distribution, Standard}; -use super::join3v; use crate::{ ff::{Field, U128Conversions}, - helpers::TotalRecords, + helpers::{GatewayConfig, TotalRecords}, protocol::{ basics::SecureMul, context::{Context, SemiHonestContext}, @@ -12,78 +13,129 @@ use crate::{ }, rand::thread_rng, secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, FieldSimd, IntoShares}, - test_fixture::{narrow_contexts, ReconstructArr, TestWorld}, + seq_join::seq_join, + test_fixture::{ReconstructArr, TestWorld, TestWorldConfig}, }; -/// Creates an arithmetic circuit with the given width and depth. +pub struct Inputs, const N: usize> { + a: Replicated, + b: Vec>, +} + +impl, const N: usize> Inputs { + fn new(a: Replicated, b: Vec>) -> Self { + Self { a, b } + } +} + +/// Generates test data for the arithmetic ciruit benchmark. /// /// # Panics -/// panics when circuits did not produce the expected value. -pub async fn arithmetic(width: u32, depth: u16) +/// On functional errors, since this is a benchmark. +#[must_use] +pub fn arithmetic_setup(width: u32, depth: u16) -> [Vec>; 3] where + F: Field + FieldSimd, + Standard: Distribution, +{ + let mut rng = thread_rng(); + let mut data = array::from_fn(|_| Vec::with_capacity(width as usize / N)); + for _ in 0..(width / u32::try_from(N).unwrap()) { + let [a0, a1, a2] = [F::ONE; N].share_with(&mut rng); + let mut b0 = Vec::with_capacity(depth as usize); + let mut b1 = Vec::with_capacity(depth as usize); + let mut b2 = Vec::with_capacity(depth as usize); + for _ in 0..(depth as usize) { + let [s0, s1, s2] = [F::ONE; N].share_with(&mut rng); + b0.push(s0); + b1.push(s1); + b2.push(s2); + } + data[0].push(Inputs::new(a0, b0)); + data[1].push(Inputs::new(a1, b1)); + data[2].push(Inputs::new(a2, b2)); + } + data +} + +/// Creates an arithmetic circuit with the given width and depth. +/// +/// # Panics +/// On functional errors, since this is a benchmark. +pub async fn arithmetic( + width: u32, + depth: u16, + active_work: usize, + input_data: [Vec>; 3], +) where F: Field + FieldSimd + U128Conversions, for<'a> Replicated: SecureMul>, [F; N]: IntoShares>, Standard: Distribution, { - let world = TestWorld::default(); + let config = TestWorldConfig { + gateway_config: GatewayConfig::new(active_work), + ..Default::default() + }; + let world = TestWorld::new_with(config); + // Re-use contexts for the entire execution because record identifiers are contiguous. let contexts = world.contexts(); - let mut multiplications = Vec::new(); - for record in 0..width { - let circuit_result = circuit(&contexts, RecordId::from(record), depth); - multiplications.push(circuit_result); - } + let [inp0, inp1, inp2] = input_data; + + let Ok([fut0, fut1, fut2]): Result<[_; 3], _> = contexts + .into_iter() + .zip([inp0, inp1, inp2]) + .map(|(ctx, col_data)| { + // Setting TotalRecords::Indeterminate causes OrderingSender to make data available to + // the channel immediately, instead of doing so only after active_work records have + // accumulated. This gives the best performance for vectorized operation. + let ctx = ctx.set_total_records(TotalRecords::Indeterminate); + seq_join( + NonZeroUsize::new(active_work).unwrap(), + stream::iter((0..(width / u32::try_from(N).unwrap())).zip(col_data)).map( + move |(record, Inputs { a, b })| { + circuit(ctx.clone(), RecordId::from(record), depth, a, b) + }, + ), + ) + .collect::>() + }) + .collect::>() + .try_into() + else { + panic!("infallible try_into array"); + }; - #[allow(clippy::disallowed_methods)] // Just for testing purposes. - let results = join_all(multiplications).await; - let mut sum = [0u128; N]; - for line in results { - for (this_sum, this_value) in sum.iter_mut().zip(line.reconstruct_arr()) { - *this_sum += this_value.as_u128(); + let (res0, res1, res2) = join3(fut0, fut1, fut2).await; + + let mut sum = 0; + for line in res0.into_iter().zip(res1).zip(res2) { + let ((s0, s1), s2) = line; + for col_sum in [s0, s1, s2].reconstruct_arr() { + sum += col_sum.as_u128(); } } - assert_eq!(sum, [u128::from(width); N]); + assert_eq!(sum, u128::from(width)); } async fn circuit<'a, F, const N: usize>( - top_ctx: &[SemiHonestContext<'a>; 3], + ctx: SemiHonestContext<'a>, record_id: RecordId, depth: u16, -) -> [Replicated; 3] + mut a: Replicated, + b: Vec>, +) -> Replicated where F: Field + FieldSimd, Replicated: SecureMul>, - [F; N]: IntoShares>, { - assert_eq!( - depth % u16::try_from(N).unwrap(), - 0, - "depth must be a multiple of vectorization factor" - ); - - let mut a = [F::ONE; N].share_with(&mut thread_rng()); - - for stripe in 0..(depth / u16::try_from(N).unwrap()) { - let b = [F::ONE; N].share_with(&mut thread_rng()); - let stripe_ctx = narrow_contexts(top_ctx, &format!("s{stripe}")); - a = async move { - let mut coll = Vec::new(); - for (i, ctx) in stripe_ctx.iter().enumerate() { - let mul = a[i].multiply( - &b[i], - ctx.narrow("mult") - .set_total_records(TotalRecords::Indeterminate), - record_id, - ); - coll.push(mul); - } - - join3v(coll).await - } - .await; + assert_eq!(b.len(), usize::from(depth)); + for (stripe_ix, stripe) in b.iter().enumerate() { + let stripe_ctx = ctx.narrow(&format!("s{stripe_ix}")); + a = a.multiply(stripe, stripe_ctx, record_id).await.unwrap(); } a From 2276c1b2cfbcfba7f4ee3f85b6a11e223904d42d Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 22 Feb 2024 12:14:42 -0800 Subject: [PATCH 037/135] Add benchmarks to coverage --- ipa-core/benches/ct/arithmetic_circuit.rs | 22 ++++++++++++++++------ pre-commit | 2 ++ scripts/coverage-ci | 4 ++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ipa-core/benches/ct/arithmetic_circuit.rs b/ipa-core/benches/ct/arithmetic_circuit.rs index 73d45befc..d3b19c7f3 100644 --- a/ipa-core/benches/ct/arithmetic_circuit.rs +++ b/ipa-core/benches/ct/arithmetic_circuit.rs @@ -63,13 +63,23 @@ pub fn criterion_benchmark(c: &mut Criterion) { // Note that the width parameter (3rd-to-last argument to do_benchmark) must // be a multiple of the vectorization width. - do_benchmark::<_, Fp31, 1>(&rt, &mut group, 4_096, 64, 1024); - do_benchmark::<_, Fp31, 1>(&rt, &mut group, 1_024, 256, 1024); + #[cfg(not(coverage))] + { + do_benchmark::<_, Fp31, 1>(&rt, &mut group, 4_096, 64, 1024); + do_benchmark::<_, Fp31, 1>(&rt, &mut group, 1_024, 256, 1024); - do_benchmark::<_, Fp32BitPrime, 1>(&rt, &mut group, 4_096, 64, 1024); - do_benchmark::<_, Fp32BitPrime, 1>(&rt, &mut group, 1_024, 256, 1024); - do_benchmark::<_, Fp32BitPrime, 32>(&rt, &mut group, 4_096, 64, 32); - do_benchmark::<_, Fp32BitPrime, 32>(&rt, &mut group, 1_024, 256, 32); + do_benchmark::<_, Fp32BitPrime, 1>(&rt, &mut group, 4_096, 64, 1024); + do_benchmark::<_, Fp32BitPrime, 1>(&rt, &mut group, 1_024, 256, 1024); + do_benchmark::<_, Fp32BitPrime, 32>(&rt, &mut group, 4_096, 64, 32); + do_benchmark::<_, Fp32BitPrime, 32>(&rt, &mut group, 1_024, 256, 32); + } + + #[cfg(coverage)] + { + do_benchmark::<_, Fp31, 1>(&rt, &mut group, 256, 64, 32); + do_benchmark::<_, Fp32BitPrime, 1>(&rt, &mut group, 256, 64, 32); + do_benchmark::<_, Fp32BitPrime, 32>(&rt, &mut group, 256, 64, 32); + } } criterion_group!(benches, criterion_benchmark); diff --git a/pre-commit b/pre-commit index f081393e2..05e65a720 100755 --- a/pre-commit +++ b/pre-commit @@ -90,6 +90,8 @@ check "Clippy concurrency checks" \ check "Clippy web checks" \ cargo clippy --tests --no-default-features --features "cli web-app real-world-infra test-fixture descriptive-gate" -- -D warnings +# The tests here need to be kept in sync with scripts/coverage-ci. + check "Tests" \ cargo test diff --git a/scripts/coverage-ci b/scripts/coverage-ci index eefcbb21d..b7b026534 100755 --- a/scripts/coverage-ci +++ b/scripts/coverage-ci @@ -14,4 +14,8 @@ for gate in "compact" "descriptive"; do cargo test --no-default-features --features "cli web-app real-world-infra test-fixture $gate-gate" done +cargo test --bench oneshot_ipa --no-default-features --features "enable-benches descriptive-gate" -- -n 62 -c 16 + +cargo test --bench criterion_arithmetic --no-default-features --features "enable-benches descriptive-gate" + cargo llvm-cov report "$@" From 79642a2f027d4a0ccfe0de9ce1eba6e3aa7ff7ac Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 22 Feb 2024 14:47:33 -0800 Subject: [PATCH 038/135] Fix a trait solver issue that only shows up in coverage builds --- ipa-core/src/test_fixture/sharing.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ipa-core/src/test_fixture/sharing.rs b/ipa-core/src/test_fixture/sharing.rs index d120090d4..f1559e123 100644 --- a/ipa-core/src/test_fixture/sharing.rs +++ b/ipa-core/src/test_fixture/sharing.rs @@ -8,7 +8,7 @@ use crate::{ semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing, }, - BitDecomposed, FieldSimd, SharedValue, Vectorizable, + BitDecomposed, SharedValue, Vectorizable, }, }; @@ -76,7 +76,7 @@ impl Reconstruct for [Replicated; 3] { } } -impl, const N: usize> ReconstructArr<>::Array> +impl, const N: usize> ReconstructArr<>::Array> for [Replicated; 3] { fn reconstruct_arr(&self) -> >::Array { From fb191e0168a1d42c41678eb8840d7d7ab0bbc18a Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Fri, 23 Feb 2024 09:58:46 -0800 Subject: [PATCH 039/135] PR feedback --- ipa-core/src/ff/boolean_array.rs | 8 -------- ipa-core/src/protocol/basics/if_else.rs | 6 +++--- ipa-core/src/protocol/basics/mul/mod.rs | 9 ++++----- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index ba43f05ea..78265ca27 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -180,8 +180,6 @@ macro_rules! impl_serializable_trait { #[cfg(all(test, unit_test))] mod fallible_serialization_tests { - use rand::{thread_rng, Rng}; - use super::*; /// [`https://github.com/private-attribution/ipa/issues/911`] @@ -197,8 +195,6 @@ macro_rules! impl_serializable_trait { "Padding only makes sense for lengths that are not multiples of 8." ); - let mut rng = thread_rng(); - let mut non_zero_padding = $name::ZERO.0; non_zero_padding.set($bits, true); assert_eq!( @@ -212,10 +208,6 @@ macro_rules! impl_serializable_trait { let mut max_value = $name::ZERO.0; max_value[..$bits].fill(true); deserialize(max_value).unwrap(); - - let mut rnd_value = $name::ZERO.0; - rnd_value[..$bits].fill_with(|_| rng.gen()); - deserialize(rnd_value).unwrap(); } } }; diff --git a/ipa-core/src/protocol/basics/if_else.rs b/ipa-core/src/protocol/basics/if_else.rs index ee89c19ea..33a467908 100644 --- a/ipa-core/src/protocol/basics/if_else.rs +++ b/ipa-core/src/protocol/basics/if_else.rs @@ -75,9 +75,9 @@ where C: Context, B: Clone + BooleanArrayMul, { - let false_value = false_value.clone().into(); - let true_value = true_value.clone().into(); - let condition = B::expand(condition).into(); + let false_value = B::Vectorized::from(false_value.clone()); + let true_value = B::Vectorized::from(true_value.clone()); + let condition = B::Vectorized::from(B::expand(condition)); // If `condition` is a share of 1 (true), then // false_value + condition * (true_value - false_value) // = false_value + true_value - false_value diff --git a/ipa-core/src/protocol/basics/mul/mod.rs b/ipa-core/src/protocol/basics/mul/mod.rs index 82b6e9420..e77672b6c 100644 --- a/ipa-core/src/protocol/basics/mul/mod.rs +++ b/ipa-core/src/protocol/basics/mul/mod.rs @@ -58,13 +58,12 @@ use semi_honest::multiply as semi_honest_mul; // breakdown key type BK is BA8) can invoke vectorized multiply. Without this trait, those // implementations would need to specify the `N` const parameter, which is tricky, because you // can't supply an expression involving a type parameter (BK::BITS) as a const parameter. -pub trait BooleanArrayMul: - Expand> + From + Into -{ - type Vectorized: Send - + Sync +pub trait BooleanArrayMul: Expand> + From { + type Vectorized: From + for<'a> Add<&'a Self::Vectorized, Output = Self::Vectorized> + for<'a> Sub<&'a Self::Vectorized, Output = Self::Vectorized> + + Send + + Sync + 'static; fn multiply<'fut, C>( From f738a81c55b26b02a55c062098a4b31e58e40adf Mon Sep 17 00:00:00 2001 From: danielmasny Date: Fri, 23 Feb 2024 10:25:53 -0800 Subject: [PATCH 040/135] use generate --- .../ipa_prf/malicious_security/lagrange.rs | 34 ++++++------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index 0a3ab3291..5356fb96f 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -1,6 +1,4 @@ -use std::iter; - -use generic_array::{ArrayLength, GenericArray}; +use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; use typenum::{Unsigned, U1}; use crate::ff::{Field, PrimeField, Serializable}; @@ -43,9 +41,7 @@ where // assertion that table is not too large for the stack assert!(::Size::USIZE * N::USIZE < 2024); - let mut denominator = iter::repeat(F::ONE) - .take(N::USIZE) - .collect::>(); + let mut denominator = GenericArray::generate(|_| F::ONE); for (i, d) in denominator.iter_mut().enumerate() { for j in (0usize..N::USIZE).filter(|&j| i != j) { *d *= F::try_from(i as u128).unwrap() - F::try_from(j as u128).unwrap(); @@ -100,9 +96,7 @@ where /// This function uses the `LagrangeTable` to evaluate `polynomial` on the specified output "x coordinates" /// outputs the "y coordinates" such that `(x,y)` lies on `polynomial` pub fn eval(&self, polynomial: &Polynomial) -> GenericArray { - let mut result = iter::repeat(F::ONE) - .take(M::USIZE) - .collect::>(); + let mut result = GenericArray::generate(|_| F::ONE); self.mult_result_by_evaluation(polynomial, &mut result); result } @@ -159,9 +153,7 @@ where // assertion that table is not too large for the stack assert!(::Size::USIZE * N::USIZE * M::USIZE < 2024); - let mut table = iter::repeat(value.denominator.clone()) - .take(M::USIZE) - .collect::>(); + let mut table = GenericArray::generate(|_| value.denominator.clone()); table.iter_mut().enumerate().for_each(|(i, row)| { Self::compute_table_row(&F::try_from((i + N::USIZE) as u128).unwrap(), row); }); @@ -171,9 +163,7 @@ where #[cfg(all(test, unit_test))] mod test { - use std::iter; - - use generic_array::{ArrayLength, GenericArray}; + use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; use proptest::{prelude::*, proptest}; use typenum::{U1, U32, U7, U8}; @@ -203,9 +193,7 @@ mod test { M: ArrayLength, { // evaluate polynomial p at evaluation_points and random point using monomial base - let mut y_values = iter::repeat(F::ZERO) - .take(M::USIZE) - .collect::>(); + let mut y_values = GenericArray::generate(|_| F::ZERO); for (x, y) in x_output.iter().zip(y_values.iter_mut()) { // monomial base, i.e. `x^k` let mut base = F::ONE; @@ -225,9 +213,8 @@ mod test { N: ArrayLength, { fn from(value: MonomialFormPolynomial) -> Self { - let canonical_points: GenericArray = (0..N::USIZE) - .map(|i| F::try_from(i as u128).unwrap()) - .collect::>(); + let canonical_points: GenericArray = + GenericArray::generate(|i| F::try_from(i as u128).unwrap()); Polynomial { y_coordinates: value.eval(&canonical_points), } @@ -264,9 +251,8 @@ mod test { coefficients: GenericArray::::from_array(input_points), }; // the canonical x coordinates are 0..15, the outputs use coordinates 8..15: - let x_coordinates_output = (8..15) - .map(|i| TestField::try_from(i).unwrap()) - .collect::>(); + let x_coordinates_output = + GenericArray::<_, U7>::generate(|i| TestField::try_from(i as u128 + 8).unwrap()); let output_expected = polynomial_monomial_form.eval(&x_coordinates_output); let polynomial = Polynomial::from(polynomial_monomial_form.clone()); let denominator = CanonicalLagrangeDenominator::::new(); From d47cb77e1646782fd018ecfa867590ed5c5d3b02 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Fri, 23 Feb 2024 10:38:29 -0800 Subject: [PATCH 041/135] Use unreachable! instead of panic! I was hoping that this would exclude it from coverage, but it didn't. --- ipa-core/src/test_fixture/circuit.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipa-core/src/test_fixture/circuit.rs b/ipa-core/src/test_fixture/circuit.rs index 8bb3655b5..278d57195 100644 --- a/ipa-core/src/test_fixture/circuit.rs +++ b/ipa-core/src/test_fixture/circuit.rs @@ -105,7 +105,7 @@ pub async fn arithmetic( .collect::>() .try_into() else { - panic!("infallible try_into array"); + unreachable!("infallible try_into array"); }; let (res0, res1, res2) = join3(fut0, fut1, fut2).await; From 5293492a344bea8fa9dc6fd376e72e2197d59e2a Mon Sep 17 00:00:00 2001 From: danielmasny <46358615+danielmasny@users.noreply.github.com> Date: Fri, 23 Feb 2024 11:24:07 -0800 Subject: [PATCH 042/135] delete commented out code (#960) --- ipa-core/src/report.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/ipa-core/src/report.rs b/ipa-core/src/report.rs index 067043118..d2addb24d 100644 --- a/ipa-core/src/report.rs +++ b/ipa-core/src/report.rs @@ -332,11 +332,9 @@ where let mut ct_mk: GenericArray = *GenericArray::from_slice(self.mk_ciphertext()); - // let mut ct_mk = self.mk_ciphertext().to_vec(); let plaintext_mk = open_in_place(key_registry, self.encap_key_mk(), &mut ct_mk, &info)?; let mut ct_btt: GenericArray> = GenericArray::from_slice(self.btt_ciphertext()).clone(); - // let mut ct_btt = self.btt_ciphertext().to_vec(); let plaintext_btt = open_in_place(key_registry, self.encap_key_btt(), &mut ct_btt, &info)?; Ok(OprfReport:: { From 0c88a3947db1e6c022fb97b76f11baf197cf5300 Mon Sep 17 00:00:00 2001 From: danielmasny Date: Fri, 23 Feb 2024 17:27:22 -0800 Subject: [PATCH 043/135] remove primitive cast --- .../ipa_prf/malicious_security/lagrange.rs | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index 5356fb96f..51fb33f97 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -42,9 +42,9 @@ where assert!(::Size::USIZE * N::USIZE < 2024); let mut denominator = GenericArray::generate(|_| F::ONE); - for (i, d) in denominator.iter_mut().enumerate() { - for j in (0usize..N::USIZE).filter(|&j| i != j) { - *d *= F::try_from(i as u128).unwrap() - F::try_from(j as u128).unwrap(); + for (d, i) in denominator.iter_mut().zip(0u64..) { + for j in (0..N::U64).filter(|&j| i != j) { + *d *= F::try_from(u128::from(i)).unwrap() - F::try_from(u128::from(j)).unwrap(); } *d = d.invert(); } @@ -125,9 +125,9 @@ where F: Field, N: ArrayLength, { - for (i, entry) in table_row.iter_mut().enumerate() { - for j in (0usize..N::USIZE).filter(|&j| j != i) { - *entry *= *x_output - F::try_from(j as u128).unwrap(); + for (entry, i) in table_row.iter_mut().zip(0u64..) { + for j in (0..N::U64).filter(|&j| j != i) { + *entry *= *x_output - F::try_from(u128::from(j)).unwrap(); } } } @@ -154,8 +154,8 @@ where assert!(::Size::USIZE * N::USIZE * M::USIZE < 2024); let mut table = GenericArray::generate(|_| value.denominator.clone()); - table.iter_mut().enumerate().for_each(|(i, row)| { - Self::compute_table_row(&F::try_from((i + N::USIZE) as u128).unwrap(), row); + table.iter_mut().zip(0u64..).for_each(|(row, i)| { + Self::compute_table_row(&F::try_from(u128::from(i + N::U64)).unwrap(), row); }); LagrangeTable { table } } @@ -214,7 +214,7 @@ mod test { { fn from(value: MonomialFormPolynomial) -> Self { let canonical_points: GenericArray = - GenericArray::generate(|i| F::try_from(i as u128).unwrap()); + GenericArray::generate(|i| F::try_from(u128::try_from(i).unwrap()).unwrap()); Polynomial { y_coordinates: value.eval(&canonical_points), } @@ -251,8 +251,9 @@ mod test { coefficients: GenericArray::::from_array(input_points), }; // the canonical x coordinates are 0..15, the outputs use coordinates 8..15: - let x_coordinates_output = - GenericArray::<_, U7>::generate(|i| TestField::try_from(i as u128 + 8).unwrap()); + let x_coordinates_output = GenericArray::<_, U7>::generate(|i| { + TestField::try_from(u128::try_from(i).unwrap() + 8).unwrap() + }); let output_expected = polynomial_monomial_form.eval(&x_coordinates_output); let polynomial = Polynomial::from(polynomial_monomial_form.clone()); let denominator = CanonicalLagrangeDenominator::::new(); From 5ea2171ea8bc17bc89aeeff7477242bfb7f23932 Mon Sep 17 00:00:00 2001 From: danielmasny Date: Mon, 26 Feb 2024 14:44:59 -0800 Subject: [PATCH 044/135] add TryFrom trait bound --- .../protocol/ipa_prf/malicious_security/lagrange.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index 51fb33f97..66e92e782 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -21,7 +21,7 @@ pub struct CanonicalLagrangeDenominator { impl CanonicalLagrangeDenominator where - F: PrimeField, + F: PrimeField + TryFrom, N: ArrayLength, { /// generates canonical Lagrange denominators @@ -70,7 +70,7 @@ pub struct LagrangeTable { impl LagrangeTable where - F: Field, + F: Field + TryFrom, N: ArrayLength, { /// generates a `CanonicalLagrangeTable` from `CanoncialLagrangeDenominators` for a single output point @@ -122,7 +122,7 @@ where /// When the field size is too small for `N` evaluation points fn compute_table_row(x_output: &F, table_row: &mut GenericArray) where - F: Field, + F: Field + TryFrom, N: ArrayLength, { for (entry, i) in table_row.iter_mut().zip(0u64..) { @@ -135,7 +135,7 @@ where impl From> for LagrangeTable where - F: Field, + F: Field + TryFrom, N: ArrayLength, M: ArrayLength, { @@ -209,7 +209,7 @@ mod test { impl From> for Polynomial where - F: Field, + F: Field + TryFrom, N: ArrayLength, { fn from(value: MonomialFormPolynomial) -> Self { From 0a81a8e5e6c32880c1d932d2647d972adb005de6 Mon Sep 17 00:00:00 2001 From: danielmasny Date: Mon, 26 Feb 2024 15:00:30 -0800 Subject: [PATCH 045/135] add debug trait bound --- .../src/protocol/ipa_prf/malicious_security/lagrange.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index 66e92e782..04ddeae4b 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -1,3 +1,5 @@ +use std::fmt::Debug; + use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; use typenum::{Unsigned, U1}; @@ -22,6 +24,7 @@ pub struct CanonicalLagrangeDenominator { impl CanonicalLagrangeDenominator where F: PrimeField + TryFrom, + >::Error: Debug, N: ArrayLength, { /// generates canonical Lagrange denominators @@ -71,6 +74,7 @@ pub struct LagrangeTable { impl LagrangeTable where F: Field + TryFrom, + >::Error: Debug, N: ArrayLength, { /// generates a `CanonicalLagrangeTable` from `CanoncialLagrangeDenominators` for a single output point @@ -123,6 +127,7 @@ where fn compute_table_row(x_output: &F, table_row: &mut GenericArray) where F: Field + TryFrom, + >::Error: Debug, N: ArrayLength, { for (entry, i) in table_row.iter_mut().zip(0u64..) { @@ -136,6 +141,7 @@ where impl From> for LagrangeTable where F: Field + TryFrom, + >::Error: Debug, N: ArrayLength, M: ArrayLength, { @@ -163,6 +169,8 @@ where #[cfg(all(test, unit_test))] mod test { + use std::fmt::Debug; + use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; use proptest::{prelude::*, proptest}; use typenum::{U1, U32, U7, U8}; @@ -210,6 +218,7 @@ mod test { impl From> for Polynomial where F: Field + TryFrom, + >::Error: Debug, N: ArrayLength, { fn from(value: MonomialFormPolynomial) -> Self { From 7df7b291d218ed8cb7e6bcf64fe089b2f5a2ff79 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Tue, 27 Feb 2024 17:46:14 -0800 Subject: [PATCH 046/135] Vectorized reveal This change also removes the `B: RecordBinding` type parameter on the `Reveal` trait, which is no longer used after removal of IPAv2. --- ipa-core/src/protocol/basics/check_zero.rs | 8 +- ipa-core/src/protocol/basics/mod.rs | 8 +- ipa-core/src/protocol/basics/reveal.rs | 107 ++++++++++++------ ipa-core/src/protocol/boolean/comparison.rs | 8 +- ipa-core/src/protocol/boolean/solved_bits.rs | 9 +- ipa-core/src/protocol/context/validator.rs | 5 +- .../boolean_ops/share_conversion_aby.rs | 4 +- ipa-core/src/protocol/ipa_prf/prf_eval.rs | 9 +- ipa-core/src/protocol/ipa_prf/quicksort.rs | 2 +- 9 files changed, 107 insertions(+), 53 deletions(-) diff --git a/ipa-core/src/protocol/basics/check_zero.rs b/ipa-core/src/protocol/basics/check_zero.rs index 97d9f3723..4bbc5a5ad 100644 --- a/ipa-core/src/protocol/basics/check_zero.rs +++ b/ipa-core/src/protocol/basics/check_zero.rs @@ -57,9 +57,11 @@ pub async fn check_zero( let rv_share = r_sharing .multiply(v, ctx.narrow(&Step::MultiplyWithR), record_id) .await?; - let rv = rv_share - .reveal(ctx.narrow(&Step::RevealR), record_id) - .await?; + let rv = F::from_array( + &rv_share + .reveal(ctx.narrow(&Step::RevealR), record_id) + .await?, + ); Ok(rv == F::ZERO) } diff --git a/ipa-core/src/protocol/basics/mod.rs b/ipa-core/src/protocol/basics/mod.rs index 2b4065dd1..33ef5979c 100644 --- a/ipa-core/src/protocol/basics/mod.rs +++ b/ipa-core/src/protocol/basics/mod.rs @@ -20,7 +20,9 @@ pub use sum_of_product::SumOfProducts; use crate::{ ff::Field, protocol::{context::Context, RecordId}, - secret_sharing::{replicated::semi_honest::AdditiveShare, SecretSharing, SharedValue}, + secret_sharing::{ + replicated::semi_honest::AdditiveShare, SecretSharing, SharedValue, Vectorizable, + }, }; #[cfg(feature = "descriptive-gate")] use crate::{ @@ -30,10 +32,10 @@ use crate::{ }, }; -pub trait BasicProtocols: +pub trait BasicProtocols, const N: usize = 1>: SecretSharing + Reshare - + Reveal + + Reveal>::Array> + SecureMul + ShareKnownValue + SumOfProducts diff --git a/ipa-core/src/protocol/basics/reveal.rs b/ipa-core/src/protocol/basics/reveal.rs index c35a1ffea..5a2c5c8b9 100644 --- a/ipa-core/src/protocol/basics/reveal.rs +++ b/ipa-core/src/protocol/basics/reveal.rs @@ -4,8 +4,10 @@ use embed_doc_image::embed_doc_image; use crate::{ error::Error, helpers::{Direction, Role}, - protocol::{context::Context, RecordBinding, RecordId}, - secret_sharing::{replicated::semi_honest::AdditiveShare as Replicated, SharedValue}, + protocol::{context::Context, RecordId}, + secret_sharing::{ + replicated::semi_honest::AdditiveShare as Replicated, SharedValue, Vectorizable, + }, }; #[cfg(feature = "descriptive-gate")] use crate::{ @@ -17,12 +19,12 @@ use crate::{ /// Trait for reveal protocol to open a shared secret to all helpers inside the MPC ring. #[async_trait] -pub trait Reveal: Sized { +pub trait Reveal: Sized { type Output; /// reveal the secret to all helpers in MPC circuit. Note that after method is called, /// it must be assumed that the secret value has been revealed to at least one of the helpers. /// Even in case when method never terminates, returns an error, etc. - async fn reveal<'fut>(&self, ctx: C, record_binding: B) -> Result + async fn reveal<'fut>(&self, ctx: C, record_id: RecordId) -> Result where C: 'fut; @@ -30,7 +32,7 @@ pub trait Reveal: Sized { async fn partial_reveal<'fut>( &self, ctx: C, - record_binding: B, + record_id: RecordId, left_out: Role, ) -> Result, Error> where @@ -50,26 +52,33 @@ pub trait Reveal: Sized { /// i.e. their own shares and received share. #[async_trait] #[embed_doc_image("reveal", "images/reveal.png")] -impl Reveal for Replicated { - type Output = V; +impl, const N: usize> Reveal + for Replicated +{ + type Output = >::Array; - async fn reveal<'fut>(&self, ctx: C, record_id: RecordId) -> Result + async fn reveal<'fut>( + &self, + ctx: C, + record_id: RecordId, + ) -> Result<>::Array, Error> where C: 'fut, { - let (left, right) = self.as_tuple(); + let left = self.left_arr(); + let right = self.right_arr(); - ctx.send_channel(ctx.role().peer(Direction::Right)) + ctx.send_channel::<>::Array>(ctx.role().peer(Direction::Right)) .send(record_id, left) .await?; // Sleep until `helper's left` sends their share - let share = ctx + let share: >::Array = ctx .recv_channel(ctx.role().peer(Direction::Left)) .receive(record_id) .await?; - Ok(left + right + share) + Ok(share + left + right) } /// TODO: implement reveal through partial reveal where `left_out` is optional @@ -78,15 +87,16 @@ impl Reveal for Replicated { ctx: C, record_id: RecordId, left_out: Role, - ) -> Result, Error> + ) -> Result>::Array>, Error> where C: 'fut, { - let (left, right) = self.as_tuple(); + let left = self.left_arr(); + let right = self.right_arr(); // send except to left_out if ctx.role().peer(Direction::Right) != left_out { - ctx.send_channel(ctx.role().peer(Direction::Right)) + ctx.send_channel::<>::Array>(ctx.role().peer(Direction::Right)) .send(record_id, left) .await?; } @@ -94,12 +104,12 @@ impl Reveal for Replicated { if ctx.role() == left_out { Ok(None) } else { - let share = ctx + let share: >::Array = ctx .recv_channel(ctx.role().peer(Direction::Left)) .receive(record_id) .await?; - Ok(Some(left + right + share)) + Ok(Some(share + left + right)) } } } @@ -110,16 +120,14 @@ impl Reveal for Replicated { /// indeed match. #[cfg(feature = "descriptive-gate")] #[async_trait] -impl<'a, F: ExtendableField> Reveal, RecordId> - for MaliciousReplicated -{ - type Output = F; +impl<'a, F: ExtendableField> Reveal, 1> for MaliciousReplicated { + type Output = >::Array; async fn reveal<'fut>( &self, ctx: UpgradedMaliciousContext<'a, F>, record_id: RecordId, - ) -> Result + ) -> Result<>::Array, Error> where UpgradedMaliciousContext<'a, F>: 'fut, { @@ -147,7 +155,7 @@ impl<'a, F: ExtendableField> Reveal, RecordId> .await?; if share_from_left == share_from_right { - Ok(left + right + share_from_left) + Ok((left + right + share_from_left).into_array()) } else { Err(Error::MaliciousRevealFailed) } @@ -158,7 +166,7 @@ impl<'a, F: ExtendableField> Reveal, RecordId> ctx: UpgradedMaliciousContext<'a, F>, record_id: RecordId, left_out: Role, - ) -> Result, Error> + ) -> Result>::Array>, Error> where UpgradedMaliciousContext<'a, F>: 'fut, { @@ -190,7 +198,7 @@ impl<'a, F: ExtendableField> Reveal, RecordId> .await?; if share_from_left == share_from_right { - Ok(Some(left + right + share_from_left)) + Ok(Some((left + right + share_from_left).into_array())) } else { Err(Error::MaliciousRevealFailed) } @@ -202,11 +210,11 @@ impl<'a, F: ExtendableField> Reveal, RecordId> mod tests { use std::iter::zip; - use futures::future::{try_join, try_join3}; + use futures::future::{join_all, try_join, try_join3}; use crate::{ error::Error, - ff::{Field, Fp31}, + ff::{Field, Fp31, Fp32BitPrime}, helpers::Direction, protocol::{ basics::Reveal, @@ -221,17 +229,45 @@ mod tests { AdditiveShare as MaliciousReplicated, ExtendableField, ThisCodeIsAuthorizedToDowngradeFromMalicious, }, - IntoShares, + IntoShares, SharedValue, }, test_fixture::{join3v, Runner, TestWorld}, }; #[tokio::test] pub async fn simple() -> Result<(), Error> { + type TestField = Fp31; + + let mut rng = thread_rng(); + let world = TestWorld::default(); + + let input = rng.gen::(); + let results = world + .semi_honest(input, |ctx, share| async move { + TestField::from_array( + &share + .reveal(ctx.set_total_records(1), RecordId::from(0)) + .await + .unwrap(), + ) + }) + .await; + + assert_eq!(input, results[0]); + assert_eq!(input, results[1]); + assert_eq!(input, results[2]); + + Ok(()) + } + + #[tokio::test] + pub async fn vectorized() -> Result<(), Error> { + type TestField = [Fp32BitPrime; 32]; + let mut rng = thread_rng(); let world = TestWorld::default(); - let input = rng.gen::(); + let input = rng.gen::(); let results = world .semi_honest(input, |ctx, share| async move { share @@ -250,6 +286,8 @@ mod tests { #[tokio::test] pub async fn malicious() -> Result<(), Error> { + type TestField = Fp31; + let mut rng = thread_rng(); let world = TestWorld::default(); let sh_ctx = world.malicious_contexts(); @@ -262,7 +300,7 @@ mod tests { .unwrap(); let record_id = RecordId::from(0); - let input: Fp31 = rng.gen(); + let input: TestField = rng.gen(); let m_shares = join3v( zip(m_ctx.iter(), input.share_with(&mut rng)) @@ -270,10 +308,11 @@ mod tests { ) .await; - let results = join3v( - zip(m_ctx.clone().into_iter(), m_shares) - .map(|(m_ctx, m_share)| async move { m_share.reveal(m_ctx, record_id).await }), - ) + let results = join_all(zip(m_ctx.clone().into_iter(), m_shares).map( + |(m_ctx, m_share)| async move { + TestField::from_array(&m_share.reveal(m_ctx, record_id).await.unwrap()) + }, + )) .await; assert_eq!(input, results[0]); diff --git a/ipa-core/src/protocol/boolean/comparison.rs b/ipa-core/src/protocol/boolean/comparison.rs index 81e1d05c0..7407b1ab4 100644 --- a/ipa-core/src/protocol/boolean/comparison.rs +++ b/ipa-core/src/protocol/boolean/comparison.rs @@ -82,9 +82,11 @@ where let r = rbg.generate(record_id).await?; // Mask `a` with random `r` and reveal. - let b = (r.b_p + a) - .reveal(ctx.narrow(&Step::Reveal), record_id) - .await?; + let b = F::from_array( + &(r.b_p + a) + .reveal(ctx.narrow(&Step::Reveal), record_id) + .await?, + ); let RBounds { r_lo, r_hi, invert } = compute_r_bounds(b.as_u128(), c, F::PRIME.into()); diff --git a/ipa-core/src/protocol/boolean/solved_bits.rs b/ipa-core/src/protocol/boolean/solved_bits.rs index 452383e24..2f2d3227e 100644 --- a/ipa-core/src/protocol/boolean/solved_bits.rs +++ b/ipa-core/src/protocol/boolean/solved_bits.rs @@ -7,6 +7,7 @@ use crate::{ error::Error, ff::{Field, PrimeField}, protocol::{ + basics::Reveal, boolean::{ bitwise_less_than_prime::BitwiseLessThanPrime, generate_random_bits::one_random_bit, }, @@ -18,7 +19,7 @@ use crate::{ AdditiveShare as MaliciousReplicated, DowngradeMalicious, ExtendableField, UnauthorizedDowngradeWrapper, }, - BitDecomposed, Linear as LinearSecretSharing, LinearRefOps, SecretSharing, + BitDecomposed, Linear as LinearSecretSharing, LinearRefOps, SecretSharing, Vectorizable, }, }; @@ -128,12 +129,14 @@ async fn is_less_than_p(ctx: C, record_id: RecordId, b_b: &[S]) -> Resu where F: PrimeField, C: Context, - S: LinearSecretSharing + BasicProtocols, + S: LinearSecretSharing + + BasicProtocols + + Reveal>::Array>, { let c_b = BitwiseLessThanPrime::less_than_prime(ctx.narrow(&Step::IsPLessThanB), record_id, b_b) .await?; - if c_b.reveal(ctx.narrow(&Step::RevealC), record_id).await? == F::ZERO { + if F::from_array(&c_b.reveal(ctx.narrow(&Step::RevealC), record_id).await?) == F::ZERO { return Ok(false); } Ok(true) diff --git a/ipa-core/src/protocol/context/validator.rs b/ipa-core/src/protocol/context/validator.rs index d38473a33..74353e250 100644 --- a/ipa-core/src/protocol/context/validator.rs +++ b/ipa-core/src/protocol/context/validator.rs @@ -27,6 +27,7 @@ use crate::{ protocol::basics::Reveal, protocol::context::Context, protocol::context::{MaliciousContext, UpgradedMaliciousContext}, + secret_sharing::SharedValue, sync::Arc, }; @@ -229,7 +230,9 @@ impl<'a, F: ExtendableField> Validator, F> for Malicious<'a .validate_ctx .narrow(&ValidateStep::RevealR) .set_total_records(1); - let r = self.r_share.reveal(narrow_ctx, RecordId::FIRST).await?; + let r = ::ExtendedField::from_array( + &self.r_share.reveal(narrow_ctx, RecordId::FIRST).await?, + ); let t = u_share - &(w_share * r); let check_zero_ctx = self diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs index 9ac7ca68a..8f8ae7ee2 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs @@ -169,10 +169,10 @@ where match ctx.role() { Role::H1 => Ok(AdditiveShare::::new( Fp25519::from(sh_s.left()).neg(), - Fp25519::from(y.unwrap()), + Fp25519::from(BA256::from_array(&y.unwrap())), )), Role::H2 => Ok(AdditiveShare::::new( - Fp25519::from(y.unwrap()), + Fp25519::from(BA256::from_array(&y.unwrap())), Fp25519::from(sh_r.right()).neg(), )), Role::H3 => Ok(AdditiveShare::::new( diff --git a/ipa-core/src/protocol/ipa_prf/prf_eval.rs b/ipa-core/src/protocol/ipa_prf/prf_eval.rs index 2686f01a7..10bbad630 100644 --- a/ipa-core/src/protocol/ipa_prf/prf_eval.rs +++ b/ipa-core/src/protocol/ipa_prf/prf_eval.rs @@ -9,7 +9,10 @@ use crate::{ prss::SharedRandomness, RecordId, }, - secret_sharing::replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, + secret_sharing::{ + replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, + SharedValue, + }, }; #[derive(Step)] @@ -88,8 +91,8 @@ where .await?; //reconstruct (z,R) - let gr: RP25519 = sh_gr.reveal(ctx.narrow(&Step::RevealR), record_id).await?; - let z = y.reveal(ctx.narrow(&Step::Revealz), record_id).await?; + let gr = RP25519::from_array(&sh_gr.reveal(ctx.narrow(&Step::RevealR), record_id).await?); + let z = Fp25519::from_array(&y.reveal(ctx.narrow(&Step::Revealz), record_id).await?); //compute R^(1/z) to u64 Ok(u64::from(gr * (z.invert()))) diff --git a/ipa-core/src/protocol/ipa_prf/quicksort.rs b/ipa-core/src/protocol/ipa_prf/quicksort.rs index dbc0ca189..4f07b7a13 100644 --- a/ipa-core/src/protocol/ipa_prf/quicksort.rs +++ b/ipa-core/src/protocol/ipa_prf/quicksort.rs @@ -112,7 +112,7 @@ where .await?; // desc = true will flip the order of the sort - Ok::<_, Error>(Boolean::from(desc) == comparison) + Ok::<_, Error>(Boolean::from(desc) == Boolean::from_array(&comparison)) } }), ), From 55d7cfff39d8d36cc4a9b5378014a59eaad481a1 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Mon, 4 Mar 2024 15:19:06 -0800 Subject: [PATCH 047/135] Add partial reveal tests --- ipa-core/src/protocol/basics/reveal.rs | 135 +++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 6 deletions(-) diff --git a/ipa-core/src/protocol/basics/reveal.rs b/ipa-core/src/protocol/basics/reveal.rs index 5a2c5c8b9..fc7f1ab87 100644 --- a/ipa-core/src/protocol/basics/reveal.rs +++ b/ipa-core/src/protocol/basics/reveal.rs @@ -215,7 +215,7 @@ mod tests { use crate::{ error::Error, ff::{Field, Fp31, Fp32BitPrime}, - helpers::Direction, + helpers::{Direction, Role}, protocol::{ basics::Reveal, context::{ @@ -260,6 +260,37 @@ mod tests { Ok(()) } + #[tokio::test] + pub async fn partial() -> Result<(), Error> { + type TestField = Fp31; + + let mut rng = thread_rng(); + let world = TestWorld::default(); + + for &left_out in Role::all() { + let input = rng.gen::(); + let results = world + .semi_honest(input, |ctx, share| async move { + share + .partial_reveal(ctx.set_total_records(1), RecordId::from(0), left_out) + .await + .unwrap() + .map(|revealed| TestField::from_array(&revealed)) + }) + .await; + + for &helper in Role::all() { + if helper == left_out { + assert_eq!(None, results[helper]); + } else { + assert_eq!(Some(input), results[helper]); + } + } + } + + Ok(()) + } + #[tokio::test] pub async fn vectorized() -> Result<(), Error> { type TestField = [Fp32BitPrime; 32]; @@ -322,6 +353,54 @@ mod tests { Ok(()) } + #[tokio::test] + pub async fn malicious_partial() -> Result<(), Error> { + type TestField = Fp31; + + let mut rng = thread_rng(); + let world = TestWorld::default(); + + for &left_out in Role::all() { + let sh_ctx = world.malicious_contexts(); + let v = sh_ctx.map(UpgradableContext::validator); + let m_ctx: [_; 3] = v + .iter() + .map(|v| v.context().set_total_records(1)) + .collect::>() + .try_into() + .unwrap(); + + let record_id = RecordId::from(0); + let input: TestField = rng.gen(); + + let m_shares = join3v( + zip(m_ctx.iter(), input.share_with(&mut rng)) + .map(|(m_ctx, share)| async { m_ctx.upgrade(share).await }), + ) + .await; + + let results = join_all(zip(m_ctx.clone().into_iter(), m_shares).map( + |(m_ctx, m_share)| async move { + m_share + .partial_reveal(m_ctx, record_id, left_out) + .await + .unwrap() + }, + )) + .await; + + for &helper in Role::all() { + if helper == left_out { + assert_eq!(None, results[helper]); + } else { + assert_eq!(Some(input.into_array()), results[helper]); + } + } + } + + Ok(()) + } + #[tokio::test] pub async fn malicious_validation_fail() -> Result<(), Error> { let mut rng = thread_rng(); @@ -346,7 +425,46 @@ mod tests { let result = try_join3( m_shares[0].reveal(m_ctx[0].clone(), record_id), m_shares[1].reveal(m_ctx[1].clone(), record_id), - reveal_with_additive_attack(m_ctx[2].clone(), record_id, &m_shares[2], Fp31::ONE), + reveal_with_additive_attack( + m_ctx[2].clone(), + record_id, + &m_shares[2], + false, + Fp31::ONE, + ), + ) + .await; + + assert!(matches!(result, Err(Error::MaliciousRevealFailed))); + + Ok(()) + } + + #[tokio::test] + pub async fn malicious_partial_validation_fail() -> Result<(), Error> { + let mut rng = thread_rng(); + let world = TestWorld::default(); + let sh_ctx = world.malicious_contexts(); + let v = sh_ctx.map(UpgradableContext::validator); + let m_ctx: [_; 3] = v + .iter() + .map(|v| v.context().set_total_records(1)) + .collect::>() + .try_into() + .unwrap(); + + let record_id = RecordId::from(0); + let input: Fp31 = rng.gen(); + + let m_shares = join3v( + zip(m_ctx.iter(), input.share_with(&mut rng)) + .map(|(m_ctx, share)| async { m_ctx.upgrade(share).await }), + ) + .await; + let result = try_join3( + m_shares[0].partial_reveal(m_ctx[0].clone(), record_id, Role::H3), + m_shares[1].partial_reveal(m_ctx[1].clone(), record_id, Role::H3), + reveal_with_additive_attack(m_ctx[2].clone(), record_id, &m_shares[2], true, Fp31::ONE), ) .await; @@ -359,8 +477,9 @@ mod tests { ctx: UpgradedMaliciousContext<'_, F>, record_id: RecordId, input: &MaliciousReplicated, + left_out: bool, additive_error: F, - ) -> Result { + ) -> Result, Error> { let (left, right) = input.x().access_without_downgrade().as_tuple(); let left_sender = ctx.send_channel(ctx.role().peer(Direction::Left)); let right_sender = ctx.send_channel(ctx.role().peer(Direction::Right)); @@ -374,9 +493,13 @@ mod tests { ) .await?; - let (share_from_left, _share_from_right): (F, F) = - try_join(left_recv.receive(record_id), right_recv.receive(record_id)).await?; + if left_out { + Ok(None) + } else { + let (share_from_left, _share_from_right): (F, F) = + try_join(left_recv.receive(record_id), right_recv.receive(record_id)).await?; - Ok(left + right + share_from_left) + Ok(Some(left + right + share_from_left)) + } } } From c2cbeec5475679b7a6531a1ee4151ff0d0676bd2 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Wed, 28 Feb 2024 18:28:26 -0800 Subject: [PATCH 048/135] Turn off debug assertions in benchmark configs * Enable strings as steps based on `cfg(test)` rather than based on `cfg(debug_assertions)`. * Define real `Step` in the arithmetic circuit benchmark and TestWorld. --- Cargo.toml | 4 ---- ipa-core/src/ff/curve_points.rs | 9 ++++----- ipa-core/src/ff/galois_field.rs | 6 ++++++ ipa-core/src/protocol/context/mod.rs | 6 +++--- ipa-core/src/protocol/step/mod.rs | 6 ++++-- ipa-core/src/test_fixture/circuit.rs | 9 ++++++++- ipa-core/src/test_fixture/mod.rs | 2 +- ipa-core/src/test_fixture/world.rs | 19 ++++++++++++------- 8 files changed, 38 insertions(+), 23 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7609592a7..0a09034d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,12 +6,8 @@ members = ["ipa-core", "ipa-macros"] incremental = true lto = "thin" -[profile.bench] -debug-assertions = true - [profile.bench-dhat] inherits = "bench" -debug-assertions = false incremental = true lto = "thin" debug = 1 diff --git a/ipa-core/src/ff/curve_points.rs b/ipa-core/src/ff/curve_points.rs index 7a92be3b7..c5789e420 100644 --- a/ipa-core/src/ff/curve_points.rs +++ b/ipa-core/src/ff/curve_points.rs @@ -197,11 +197,7 @@ mod test { use typenum::U32; use crate::{ - ff::{ - curve_points::{NonCanonicalEncoding, RP25519}, - ec_prime_field::Fp25519, - Serializable, - }, + ff::{curve_points::RP25519, ec_prime_field::Fp25519, Serializable}, secret_sharing::SharedValue, }; @@ -258,7 +254,10 @@ mod test { } #[test] + #[cfg(debug_assertions)] fn non_canonical() { + use crate::ff::curve_points::NonCanonicalEncoding; + const ZERO: u128 = 0; // 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF is not a valid Ristretto point let buf: [u8; 32] = unsafe { std::mem::transmute([!ZERO, !ZERO]) }; diff --git a/ipa-core/src/ff/galois_field.rs b/ipa-core/src/ff/galois_field.rs index c1d7be389..119187fcf 100644 --- a/ipa-core/src/ff/galois_field.rs +++ b/ipa-core/src/ff/galois_field.rs @@ -530,8 +530,14 @@ macro_rules! bit_array_impl { } #[test] + #[cfg(debug_assertions)] #[should_panic(expected = "index < usize::try_from")] pub fn out_of_count_index() { + // With debug assertions enabled, this test will panic on any out-of-bounds + // access. Without debug assertions, it will not panic on access to the unused + // bits for non-multiple-of-8 bitwidths. Enable the test only with debug + // assertions, rather than try to do something conditioned on the bit width. + let s = $name::try_from(1_u128).unwrap(); // Below assert doesn't matter. The indexing should panic assert_eq!(s[<$name>::BITS as usize], false); diff --git a/ipa-core/src/protocol/context/mod.rs b/ipa-core/src/protocol/context/mod.rs index ca1965135..4a54302ce 100644 --- a/ipa-core/src/protocol/context/mod.rs +++ b/ipa-core/src/protocol/context/mod.rs @@ -300,7 +300,7 @@ mod tests { telemetry::metrics::{ BYTES_SENT, INDEXED_PRSS_GENERATED, RECORDS_SENT, SEQUENTIAL_PRSS_GENERATED, }, - test_fixture::{Reconstruct, Runner, TestWorld, TestWorldConfig}, + test_fixture::{Reconstruct, Runner, TestExecutionStep, TestWorld, TestWorldConfig}, }; trait ReplicatedLeftValue { @@ -391,7 +391,7 @@ mod tests { let input_size = input.len(); let snapshot = world.metrics_snapshot(); let metrics_step = Gate::default() - .narrow(&TestWorld::execution_step(0)) + .narrow(&TestExecutionStep::Iter(0)) .narrow("metrics"); // for semi-honest protocols, amplification factor per helper is 1. @@ -448,7 +448,7 @@ mod tests { .await; let metrics_step = Gate::default() - .narrow(&TestWorld::execution_step(0)) + .narrow(&TestExecutionStep::Iter(0)) // TODO: leaky abstraction, test world should tell us the exact step .narrow(&MaliciousProtocol) .narrow("metrics"); diff --git a/ipa-core/src/protocol/step/mod.rs b/ipa-core/src/protocol/step/mod.rs index e96c9417d..73815967b 100644 --- a/ipa-core/src/protocol/step/mod.rs +++ b/ipa-core/src/protocol/step/mod.rs @@ -36,10 +36,12 @@ pub trait StepNarrow { pub trait Step: AsRef {} // In test code, allow a string (or string reference) to be used as a `Step`. -#[cfg(any(feature = "test-fixture", debug_assertions))] +// Note: Since the creation of the `derive(Step)` macro, hardly any code is +// required to define a step. Doing so is highly encouraged, even in tests. +#[cfg(test)] impl Step for String {} -#[cfg(any(feature = "test-fixture", debug_assertions))] +#[cfg(test)] impl Step for str {} /// A step generator for bitwise secure operations. diff --git a/ipa-core/src/test_fixture/circuit.rs b/ipa-core/src/test_fixture/circuit.rs index 278d57195..d5c983140 100644 --- a/ipa-core/src/test_fixture/circuit.rs +++ b/ipa-core/src/test_fixture/circuit.rs @@ -1,6 +1,7 @@ use std::{array, num::NonZeroUsize}; use futures::{future::join3, stream, StreamExt}; +use ipa_macros::Step; use rand::distributions::{Distribution, Standard}; use crate::{ @@ -121,6 +122,12 @@ pub async fn arithmetic( assert_eq!(sum, u128::from(width)); } +#[derive(Step)] +enum Step { + #[dynamic(1024)] + Stripe(usize), +} + async fn circuit<'a, F, const N: usize>( ctx: SemiHonestContext<'a>, record_id: RecordId, @@ -134,7 +141,7 @@ where { assert_eq!(b.len(), usize::from(depth)); for (stripe_ix, stripe) in b.iter().enumerate() { - let stripe_ctx = ctx.narrow(&format!("s{stripe_ix}")); + let stripe_ctx = ctx.narrow(&Step::Stripe(stripe_ix)); a = a.multiply(stripe, stripe_ctx, record_id).await.unwrap(); } diff --git a/ipa-core/src/test_fixture/mod.rs b/ipa-core/src/test_fixture/mod.rs index 0f96aee7b..e54e5eba4 100644 --- a/ipa-core/src/test_fixture/mod.rs +++ b/ipa-core/src/test_fixture/mod.rs @@ -25,7 +25,7 @@ use rand::{distributions::Standard, prelude::Distribution, rngs::mock::StepRng}; use rand_core::{CryptoRng, RngCore}; pub use sharing::{get_bits, into_bits, Reconstruct, ReconstructArr}; #[cfg(feature = "in-memory-infra")] -pub use world::{Runner, TestWorld, TestWorldConfig}; +pub use world::{Runner, TestExecutionStep, TestWorld, TestWorldConfig}; use crate::{ ff::{Field, U128Conversions}, diff --git a/ipa-core/src/test_fixture/world.rs b/ipa-core/src/test_fixture/world.rs index 14734c352..1b5a691d2 100644 --- a/ipa-core/src/test_fixture/world.rs +++ b/ipa-core/src/test_fixture/world.rs @@ -2,6 +2,7 @@ use std::{fmt::Debug, io::stdout, iter::zip}; use async_trait::async_trait; use futures::{future::join_all, Future}; +use ipa_macros::Step; use rand::{distributions::Standard, prelude::Distribution, rngs::StdRng}; use rand_core::{RngCore, SeedableRng}; use tracing::{Instrument, Level, Span}; @@ -31,6 +32,14 @@ use crate::{ }, }; +// This is used by the metrics tests in `protocol::context`. It otherwise would/should not be pub. +#[derive(Step)] +pub enum TestExecutionStep { + /// Provides a unique per-iteration context in tests. + #[dynamic(1024)] + Iter(usize), +} + /// Test environment for protocols to run tests that require communication between helpers. /// For now the messages sent through it never leave the test infra memory perimeter, so /// there is no need to associate each of them with `QueryId`, but this API makes it possible @@ -139,7 +148,7 @@ impl TestWorld { zip(&self.participants, &self.gateways) .map(|(participant, gateway)| { SemiHonestContext::new(participant, gateway) - .narrow(&Self::execution_step(execution)) + .narrow(&TestExecutionStep::Iter(execution)) }) .collect::>() .try_into() @@ -155,7 +164,8 @@ impl TestWorld { let execution = self.executions.fetch_add(1, Ordering::Relaxed); zip(&self.participants, &self.gateways) .map(|(participant, gateway)| { - MaliciousContext::new(participant, gateway).narrow(&Self::execution_step(execution)) + MaliciousContext::new(participant, gateway) + .narrow(&TestExecutionStep::Iter(execution)) }) .collect::>() .try_into() @@ -167,11 +177,6 @@ impl TestWorld { self.metrics_handle.snapshot() } - #[must_use] - pub fn execution_step(execution: usize) -> String { - format!("run-{execution}") - } - pub fn gateway(&self, role: Role) -> &Gateway { &self.gateways[role] } From f3e138b478a6b8384890c1fb7ff30d2e06798374 Mon Sep 17 00:00:00 2001 From: Erik Taubeneck Date: Fri, 8 Mar 2024 09:20:27 -0800 Subject: [PATCH 049/135] add command line flag to collect_steps.py for multi-threading (#966) * add command line flag to collect_steps.py for multi-threading * martin's suggestion --- scripts/collect_steps.py | 45 ++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/scripts/collect_steps.py b/scripts/collect_steps.py index 3491d018f..240e85573 100755 --- a/scripts/collect_steps.py +++ b/scripts/collect_steps.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import argparse import os import re import subprocess @@ -8,17 +9,6 @@ # all possible configurations. IPA_ENV = [["RUST_LOG", "ipa_core=DEBUG"]] -ARGS = [ - "cargo", - "bench", - "--bench", - "oneshot_ipa", - "--no-default-features", - "--features=enable-benches debug-trace step-trace", - "--", - "--num-multi-bits", - "3", -] QUERY_SIZE = 100 # attribution_window_seconds = 0 runs an optimized protocol, so 0 and anything larger ATTRIBUTION_WINDOW = [0, 86400] @@ -147,12 +137,12 @@ def extract_intermediate_steps(steps): return steps -def ipa_steps(): +def ipa_steps(base_args): output = set() for c in USER_CAP: for w in ATTRIBUTION_WINDOW: for tv in TRIGGER_VALUES: - args = ARGS + [ + args = base_args + [ "-n", str(QUERY_SIZE), "-c", @@ -165,14 +155,39 @@ def ipa_steps(): SECURITY_MODEL, "-t", str(tv), - ] + ] print(" ".join(args), file=sys.stderr) output.update(collect_steps(args)) return output + if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Generate steps file") + parser.add_argument( + "-m", + "--multi-threading", + action="store_true", + ) + args = parser.parse_args() + + features = ["enable-benches", "debug-trace", "step-trace"] + if args.multi_threading: + features.append("multi-threading") + + ARGS = [ + "cargo", + "bench", + "--bench", + "oneshot_ipa", + "--no-default-features", + f'--features={" ".join(features)}', + "--", + "--num-multi-bits", + "3", + ] + steps = set() - steps.update(ipa_steps()) + steps.update(ipa_steps(ARGS)) full_steps = extract_intermediate_steps(steps) sorted_steps = sorted(full_steps) From 6690fb0ad2a7ea50ad990fe7b1a095995bca3dfa Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Fri, 8 Mar 2024 22:42:10 -0800 Subject: [PATCH 050/135] Change boolean debug representation (#964) * Change boolean debug representation The default one is too verbose. Before: ``` (StdArray([BA32(BitArray { addr: 0x12b842774, head: 000, bits: 32 } [1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1])]), StdArray([BA32(BitArray { addr: 0x12b842778, head: 000, bits: 32 } [0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0])])) ``` after ``` (StdArray([BA32([1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1])]), StdArray([BA32([0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0])])) ``` * Add a test and fix a bug It is always about not having the tests --- ipa-core/src/ff/boolean_array.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index 78265ca27..4137d0eeb 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -1,3 +1,5 @@ +use std::fmt::{Debug, Formatter}; + use bitvec::{ prelude::{BitArr, Lsb0}, slice::Iter, @@ -254,9 +256,16 @@ macro_rules! boolean_array_impl { type Store = BitArr!(for $bits, in u8, Lsb0); /// A Boolean array with $bits bits. - #[derive(Clone, Copy, PartialEq, Eq, Debug)] + #[derive(Clone, Copy, PartialEq, Eq)] pub struct $name(pub(super) Store); + impl Debug for $name { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_str(stringify!($name))?; + self.0.data.fmt(f) + } + } + impl $name { #[cfg(all(test, unit_test))] const STORE_LEN: usize = bitvec::mem::elts::($bits); @@ -697,6 +706,13 @@ macro_rules! boolean_array_impl { "Failed to deserialize a valid value: {ba:?}" ); } + + #[test] + fn debug() { + let expected = format!("{}{:?}", stringify!($name), $name::ZERO.0.data); + let actual = format!("{:?}", $name::ZERO); + assert_eq!(expected, actual); + } } } From 457c6468e49062f18a6c19a6165fa8055b363a9b Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Mon, 4 Mar 2024 16:23:44 -0800 Subject: [PATCH 051/135] Remove async_trait for Reveal --- ipa-core/src/protocol/basics/mod.rs | 2 +- ipa-core/src/protocol/basics/reveal.rs | 48 ++++++++++++++------ ipa-core/src/protocol/boolean/comparison.rs | 7 +-- ipa-core/src/protocol/boolean/solved_bits.rs | 5 +- 4 files changed, 39 insertions(+), 23 deletions(-) diff --git a/ipa-core/src/protocol/basics/mod.rs b/ipa-core/src/protocol/basics/mod.rs index 33ef5979c..7e0ba176f 100644 --- a/ipa-core/src/protocol/basics/mod.rs +++ b/ipa-core/src/protocol/basics/mod.rs @@ -13,7 +13,7 @@ pub use check_zero::check_zero; pub use if_else::{if_else, select}; pub use mul::{BooleanArrayMul, MultiplyZeroPositions, SecureMul, ZeroPositions}; pub use reshare::Reshare; -pub use reveal::Reveal; +pub use reveal::{reveal, Reveal}; pub use share_known_value::ShareKnownValue; pub use sum_of_product::SumOfProducts; diff --git a/ipa-core/src/protocol/basics/reveal.rs b/ipa-core/src/protocol/basics/reveal.rs index fc7f1ab87..f95cdae9c 100644 --- a/ipa-core/src/protocol/basics/reveal.rs +++ b/ipa-core/src/protocol/basics/reveal.rs @@ -1,4 +1,5 @@ -use async_trait::async_trait; +use std::future::Future; + use embed_doc_image::embed_doc_image; use crate::{ @@ -18,23 +19,26 @@ use crate::{ }; /// Trait for reveal protocol to open a shared secret to all helpers inside the MPC ring. -#[async_trait] pub trait Reveal: Sized { type Output; /// reveal the secret to all helpers in MPC circuit. Note that after method is called, /// it must be assumed that the secret value has been revealed to at least one of the helpers. /// Even in case when method never terminates, returns an error, etc. - async fn reveal<'fut>(&self, ctx: C, record_id: RecordId) -> Result + fn reveal<'fut>( + &'fut self, + ctx: C, + record_id: RecordId, + ) -> impl Future> + Send + 'fut where C: 'fut; /// partial reveal protocol to open a shared secret to all helpers except helper `left_out` inside the MPC ring. - async fn partial_reveal<'fut>( - &self, + fn partial_reveal<'fut>( + &'fut self, ctx: C, record_id: RecordId, left_out: Role, - ) -> Result, Error> + ) -> impl Future, Error>> + Send + 'fut where C: 'fut; } @@ -50,7 +54,6 @@ pub trait Reveal: Sized { /// ![Reveal steps][reveal] /// Each helper sends their left share to the right helper. The helper then reconstructs their secret by adding the three shares /// i.e. their own shares and received share. -#[async_trait] #[embed_doc_image("reveal", "images/reveal.png")] impl, const N: usize> Reveal for Replicated @@ -58,7 +61,7 @@ impl, const N: usize> Reveal type Output = >::Array; async fn reveal<'fut>( - &self, + &'fut self, ctx: C, record_id: RecordId, ) -> Result<>::Array, Error> @@ -83,7 +86,7 @@ impl, const N: usize> Reveal /// TODO: implement reveal through partial reveal where `left_out` is optional async fn partial_reveal<'fut>( - &self, + &'fut self, ctx: C, record_id: RecordId, left_out: Role, @@ -96,9 +99,11 @@ impl, const N: usize> Reveal // send except to left_out if ctx.role().peer(Direction::Right) != left_out { - ctx.send_channel::<>::Array>(ctx.role().peer(Direction::Right)) - .send(record_id, left) - .await?; + ctx.send_channel::<>::Array>( + ctx.role().peer(Direction::Right), + ) + .send(record_id, left) + .await?; } if ctx.role() == left_out { @@ -119,12 +124,11 @@ impl, const N: usize> Reveal /// to both helpers (right and left) and upon receiving 2 shares from peers it validates that they /// indeed match. #[cfg(feature = "descriptive-gate")] -#[async_trait] impl<'a, F: ExtendableField> Reveal, 1> for MaliciousReplicated { type Output = >::Array; async fn reveal<'fut>( - &self, + &'fut self, ctx: UpgradedMaliciousContext<'a, F>, record_id: RecordId, ) -> Result<>::Array, Error> @@ -162,7 +166,7 @@ impl<'a, F: ExtendableField> Reveal, 1> for Mali } async fn partial_reveal<'fut>( - &self, + &'fut self, ctx: UpgradedMaliciousContext<'a, F>, record_id: RecordId, left_out: Role, @@ -206,6 +210,20 @@ impl<'a, F: ExtendableField> Reveal, 1> for Mali } } +// Workaround for https://github.com/rust-lang/rust/issues/100013. Calling this wrapper function +// instead of `Reveal::reveal` seems to hide the `impl Future` GAT. +pub fn reveal<'fut, C, S>( + ctx: C, + record_id: RecordId, + v: &'fut S, +) -> impl Future> + Send + 'fut +where + C: Context + 'fut, + S: Reveal, +{ + S::reveal(v, ctx, record_id) +} + #[cfg(all(test, unit_test))] mod tests { use std::iter::zip; diff --git a/ipa-core/src/protocol/boolean/comparison.rs b/ipa-core/src/protocol/boolean/comparison.rs index 7407b1ab4..94046be95 100644 --- a/ipa-core/src/protocol/boolean/comparison.rs +++ b/ipa-core/src/protocol/boolean/comparison.rs @@ -5,6 +5,7 @@ use crate::{ error::Error, ff::{Field, PrimeField}, protocol::{ + basics::reveal, boolean::random_bits_generator::RandomBitsGenerator, context::{Context, UpgradedContext}, step::BitOpStep, @@ -82,11 +83,7 @@ where let r = rbg.generate(record_id).await?; // Mask `a` with random `r` and reveal. - let b = F::from_array( - &(r.b_p + a) - .reveal(ctx.narrow(&Step::Reveal), record_id) - .await?, - ); + let b = F::from_array(&reveal(ctx.narrow(&Step::Reveal), record_id, &(r.b_p + a)).await?); let RBounds { r_lo, r_hi, invert } = compute_r_bounds(b.as_u128(), c, F::PRIME.into()); diff --git a/ipa-core/src/protocol/boolean/solved_bits.rs b/ipa-core/src/protocol/boolean/solved_bits.rs index 2f2d3227e..1cf64c945 100644 --- a/ipa-core/src/protocol/boolean/solved_bits.rs +++ b/ipa-core/src/protocol/boolean/solved_bits.rs @@ -7,7 +7,7 @@ use crate::{ error::Error, ff::{Field, PrimeField}, protocol::{ - basics::Reveal, + basics::{reveal, Reveal}, boolean::{ bitwise_less_than_prime::BitwiseLessThanPrime, generate_random_bits::one_random_bit, }, @@ -136,7 +136,8 @@ where let c_b = BitwiseLessThanPrime::less_than_prime(ctx.narrow(&Step::IsPLessThanB), record_id, b_b) .await?; - if F::from_array(&c_b.reveal(ctx.narrow(&Step::RevealC), record_id).await?) == F::ZERO { + + if F::from_array(&reveal(ctx.narrow(&Step::RevealC), record_id, &c_b).await?) == F::ZERO { return Ok(false); } Ok(true) From 08d75206cd71250cff7fdfe15563de5420f9dd64 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Mon, 4 Mar 2024 15:32:28 -0800 Subject: [PATCH 052/135] Use a generic backend for full and partial reveals --- ipa-core/src/protocol/basics/reveal.rs | 135 +++++++++---------------- 1 file changed, 49 insertions(+), 86 deletions(-) diff --git a/ipa-core/src/protocol/basics/reveal.rs b/ipa-core/src/protocol/basics/reveal.rs index f95cdae9c..dfe83e7e7 100644 --- a/ipa-core/src/protocol/basics/reveal.rs +++ b/ipa-core/src/protocol/basics/reveal.rs @@ -1,6 +1,7 @@ use std::future::Future; use embed_doc_image::embed_doc_image; +use futures::TryFutureExt; use crate::{ error::Error, @@ -9,6 +10,7 @@ use crate::{ secret_sharing::{ replicated::semi_honest::AdditiveShare as Replicated, SharedValue, Vectorizable, }, + seq_join::SeqJoin, }; #[cfg(feature = "descriptive-gate")] use crate::{ @@ -21,16 +23,23 @@ use crate::{ /// Trait for reveal protocol to open a shared secret to all helpers inside the MPC ring. pub trait Reveal: Sized { type Output; - /// reveal the secret to all helpers in MPC circuit. Note that after method is called, - /// it must be assumed that the secret value has been revealed to at least one of the helpers. - /// Even in case when method never terminates, returns an error, etc. + /// Reveal a shared secret to all helpers in the MPC ring. + /// + /// Note that after method is called, it must be assumed that the secret value has been + /// revealed to at least one of the helpers. Even in case when method never terminates, + /// returns an error, etc. fn reveal<'fut>( &'fut self, ctx: C, record_id: RecordId, ) -> impl Future> + Send + 'fut where - C: 'fut; + C: 'fut, + { + // Passing `left_out = None` guarantees any ok result is `Some`. + self.generic_reveal(ctx, record_id, None) + .map_ok(Option::unwrap) + } /// partial reveal protocol to open a shared secret to all helpers except helper `left_out` inside the MPC ring. fn partial_reveal<'fut>( @@ -39,6 +48,23 @@ pub trait Reveal: Sized { record_id: RecordId, left_out: Role, ) -> impl Future, Error>> + Send + 'fut + where + C: 'fut, + { + self.generic_reveal(ctx, record_id, Some(left_out)) + } + + /// Generic reveal implementation usable for both `reveal` and `partial_reveal`. + /// + /// When `left_out` is `None`, open a shared secret to all helpers in the MPC ring. + /// When `left_out` is `Some`, open a shared secret to all helpers except the helper + /// specified in `left_out`. + fn generic_reveal<'fut>( + &'fut self, + ctx: C, + record_id: RecordId, + left_out: Option, + ) -> impl Future, Error>> + Send + 'fut where C: 'fut; } @@ -60,36 +86,11 @@ impl, const N: usize> Reveal { type Output = >::Array; - async fn reveal<'fut>( - &'fut self, - ctx: C, - record_id: RecordId, - ) -> Result<>::Array, Error> - where - C: 'fut, - { - let left = self.left_arr(); - let right = self.right_arr(); - - ctx.send_channel::<>::Array>(ctx.role().peer(Direction::Right)) - .send(record_id, left) - .await?; - - // Sleep until `helper's left` sends their share - let share: >::Array = ctx - .recv_channel(ctx.role().peer(Direction::Left)) - .receive(record_id) - .await?; - - Ok(share + left + right) - } - - /// TODO: implement reveal through partial reveal where `left_out` is optional - async fn partial_reveal<'fut>( + async fn generic_reveal<'fut>( &'fut self, ctx: C, record_id: RecordId, - left_out: Role, + left_out: Option, ) -> Result>::Array>, Error> where C: 'fut, @@ -97,18 +98,17 @@ impl, const N: usize> Reveal let left = self.left_arr(); let right = self.right_arr(); - // send except to left_out - if ctx.role().peer(Direction::Right) != left_out { - ctx.send_channel::<>::Array>( - ctx.role().peer(Direction::Right), - ) - .send(record_id, left) - .await?; + // send except to excluded helper (if any) + if Some(ctx.role().peer(Direction::Right)) != left_out { + ctx.send_channel::<>::Array>(ctx.role().peer(Direction::Right)) + .send(record_id, left) + .await?; } - if ctx.role() == left_out { + if Some(ctx.role()) == left_out { Ok(None) } else { + // Sleep until `helper's left` sends their share let share: >::Array = ctx .recv_channel(ctx.role().peer(Direction::Left)) .receive(record_id) @@ -127,49 +127,11 @@ impl, const N: usize> Reveal impl<'a, F: ExtendableField> Reveal, 1> for MaliciousReplicated { type Output = >::Array; - async fn reveal<'fut>( + async fn generic_reveal<'fut>( &'fut self, ctx: UpgradedMaliciousContext<'a, F>, record_id: RecordId, - ) -> Result<>::Array, Error> - where - UpgradedMaliciousContext<'a, F>: 'fut, - { - use futures::future::try_join; - - use crate::secret_sharing::replicated::malicious::ThisCodeIsAuthorizedToDowngradeFromMalicious; - - let (left, right) = self.x().access_without_downgrade().as_tuple(); - let left_sender = ctx.send_channel(ctx.role().peer(Direction::Left)); - let left_receiver = ctx.recv_channel::(ctx.role().peer(Direction::Left)); - let right_sender = ctx.send_channel(ctx.role().peer(Direction::Right)); - let right_receiver = ctx.recv_channel::(ctx.role().peer(Direction::Right)); - - // Send share to helpers to the right and left - try_join( - left_sender.send(record_id, right), - right_sender.send(record_id, left), - ) - .await?; - - let (share_from_left, share_from_right) = try_join( - left_receiver.receive(record_id), - right_receiver.receive(record_id), - ) - .await?; - - if share_from_left == share_from_right { - Ok((left + right + share_from_left).into_array()) - } else { - Err(Error::MaliciousRevealFailed) - } - } - - async fn partial_reveal<'fut>( - &'fut self, - ctx: UpgradedMaliciousContext<'a, F>, - record_id: RecordId, - left_out: Role, + left_out: Option, ) -> Result>::Array>, Error> where UpgradedMaliciousContext<'a, F>: 'fut, @@ -186,13 +148,14 @@ impl<'a, F: ExtendableField> Reveal, 1> for Mali // Send share to helpers to the right and left // send except to left_out - if ctx.role().peer(Direction::Left) != left_out { - left_sender.send(record_id, right).await?; - } - if ctx.role().peer(Direction::Right) != left_out { - right_sender.send(record_id, left).await?; - } - if ctx.role() == left_out { + let send_left_fut = (Some(ctx.role().peer(Direction::Left)) != left_out) + .then(|| left_sender.send(record_id, right)); + let send_right_fut = (Some(ctx.role().peer(Direction::Right)) != left_out) + .then(|| right_sender.send(record_id, left)); + ctx.parallel_join(send_left_fut.into_iter().chain(send_right_fut)) + .await?; + + if Some(ctx.role()) == left_out { Ok(None) } else { let (share_from_left, share_from_right) = try_join( From fdb9dc213b34fa1a40ea41f17f667f906cd2a22c Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Tue, 5 Mar 2024 19:14:14 -0800 Subject: [PATCH 053/135] Use test_executor for reveal error tests --- ipa-core/src/protocol/basics/reveal.rs | 125 +++++++++++++------------ 1 file changed, 63 insertions(+), 62 deletions(-) diff --git a/ipa-core/src/protocol/basics/reveal.rs b/ipa-core/src/protocol/basics/reveal.rs index dfe83e7e7..16d678d01 100644 --- a/ipa-core/src/protocol/basics/reveal.rs +++ b/ipa-core/src/protocol/basics/reveal.rs @@ -212,6 +212,7 @@ mod tests { }, IntoShares, SharedValue, }, + test_executor::run, test_fixture::{join3v, Runner, TestWorld}, }; @@ -382,76 +383,76 @@ mod tests { Ok(()) } - #[tokio::test] - pub async fn malicious_validation_fail() -> Result<(), Error> { - let mut rng = thread_rng(); - let world = TestWorld::default(); - let sh_ctx = world.malicious_contexts(); - let v = sh_ctx.map(UpgradableContext::validator); - let m_ctx: [_; 3] = v - .iter() - .map(|v| v.context().set_total_records(1)) - .collect::>() - .try_into() - .unwrap(); - - let record_id = RecordId::from(0); - let input: Fp31 = rng.gen(); + #[test] + pub fn malicious_validation_fail() { + run(|| async { + let mut rng = thread_rng(); + let world = TestWorld::default(); + let sh_ctx = world.malicious_contexts(); + let v = sh_ctx.map(UpgradableContext::validator); + let m_ctx: [_; 3] = v + .iter() + .map(|v| v.context().set_total_records(1)) + .collect::>() + .try_into() + .unwrap(); - let m_shares = join3v( - zip(m_ctx.iter(), input.share_with(&mut rng)) - .map(|(m_ctx, share)| async { m_ctx.upgrade(share).await }), - ) - .await; - let result = try_join3( - m_shares[0].reveal(m_ctx[0].clone(), record_id), - m_shares[1].reveal(m_ctx[1].clone(), record_id), - reveal_with_additive_attack( - m_ctx[2].clone(), - record_id, - &m_shares[2], - false, - Fp31::ONE, - ), - ) - .await; + let record_id = RecordId::from(0); + let input: Fp31 = rng.gen(); - assert!(matches!(result, Err(Error::MaliciousRevealFailed))); + let m_shares = join3v( + zip(m_ctx.iter(), input.share_with(&mut rng)) + .map(|(m_ctx, share)| async { m_ctx.upgrade(share).await }), + ) + .await; + let result = try_join3( + m_shares[0].reveal(m_ctx[0].clone(), record_id), + m_shares[1].reveal(m_ctx[1].clone(), record_id), + reveal_with_additive_attack( + m_ctx[2].clone(), + record_id, + &m_shares[2], + false, + Fp31::ONE, + ), + ) + .await; - Ok(()) + assert!(matches!(result, Err(Error::MaliciousRevealFailed))); + }) } - #[tokio::test] - pub async fn malicious_partial_validation_fail() -> Result<(), Error> { - let mut rng = thread_rng(); - let world = TestWorld::default(); - let sh_ctx = world.malicious_contexts(); - let v = sh_ctx.map(UpgradableContext::validator); - let m_ctx: [_; 3] = v - .iter() - .map(|v| v.context().set_total_records(1)) - .collect::>() - .try_into() - .unwrap(); - - let record_id = RecordId::from(0); - let input: Fp31 = rng.gen(); + #[test] + pub fn malicious_partial_validation_fail() { + run(|| async { + let mut rng = thread_rng(); + let world = TestWorld::default(); + let sh_ctx = world.malicious_contexts(); + let v = sh_ctx.map(UpgradableContext::validator); + let m_ctx: [_; 3] = v + .iter() + .map(|v| v.context().set_total_records(1)) + .collect::>() + .try_into() + .unwrap(); - let m_shares = join3v( - zip(m_ctx.iter(), input.share_with(&mut rng)) - .map(|(m_ctx, share)| async { m_ctx.upgrade(share).await }), - ) - .await; - let result = try_join3( - m_shares[0].partial_reveal(m_ctx[0].clone(), record_id, Role::H3), - m_shares[1].partial_reveal(m_ctx[1].clone(), record_id, Role::H3), - reveal_with_additive_attack(m_ctx[2].clone(), record_id, &m_shares[2], true, Fp31::ONE), - ) - .await; + let record_id = RecordId::from(0); + let input: Fp31 = rng.gen(); - assert!(matches!(result, Err(Error::MaliciousRevealFailed))); + let m_shares = join3v( + zip(m_ctx.iter(), input.share_with(&mut rng)) + .map(|(m_ctx, share)| async { m_ctx.upgrade(share).await }), + ) + .await; + let result = try_join3( + m_shares[0].partial_reveal(m_ctx[0].clone(), record_id, Role::H3), + m_shares[1].partial_reveal(m_ctx[1].clone(), record_id, Role::H3), + reveal_with_additive_attack(m_ctx[2].clone(), record_id, &m_shares[2], true, Fp31::ONE), + ) + .await; - Ok(()) + assert!(matches!(result, Err(Error::MaliciousRevealFailed))); + }) } pub async fn reveal_with_additive_attack( From fa59f74bbfde084f9d5c9d2207a8f78a2d705ed9 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Fri, 8 Mar 2024 14:21:15 -0800 Subject: [PATCH 054/135] MaybeFuture --- ipa-core/src/helpers/futures.rs | 44 +++++++++++++++++++++++++++++++++ ipa-core/src/helpers/mod.rs | 2 ++ 2 files changed, 46 insertions(+) create mode 100644 ipa-core/src/helpers/futures.rs diff --git a/ipa-core/src/helpers/futures.rs b/ipa-core/src/helpers/futures.rs new file mode 100644 index 000000000..70bcf4ca3 --- /dev/null +++ b/ipa-core/src/helpers/futures.rs @@ -0,0 +1,44 @@ +use std::{ + future::Future, + pin::Pin, + task::{Context, Poll}, +}; + +use pin_project::pin_project; + +#[pin_project(project = MaybeFutureProj)] +pub enum MaybeFuture { + Future(#[pin] Fut), + Value(Option), +} + +impl Future for MaybeFuture { + type Output = Fut::Output; + + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + match self.project() { + MaybeFutureProj::Future(fut) => fut.poll(cx), + MaybeFutureProj::Value(val) => Poll::Ready(val.take().unwrap()), + } + } +} + +impl MaybeFuture { + pub fn future(fut: Fut) -> Self { + MaybeFuture::Future(fut) + } + + pub fn value(val: Fut::Output) -> Self { + MaybeFuture::Value(Some(val)) + } +} + +impl>, E> MaybeFuture { + pub fn future_or_ok Fut>(condition: bool, f: F) -> Self { + if condition { + MaybeFuture::Future(f()) + } else { + MaybeFuture::Value(Some(Ok(()))) + } + } +} diff --git a/ipa-core/src/helpers/mod.rs b/ipa-core/src/helpers/mod.rs index b2b15f305..4544c2795 100644 --- a/ipa-core/src/helpers/mod.rs +++ b/ipa-core/src/helpers/mod.rs @@ -8,6 +8,7 @@ use generic_array::GenericArray; mod buffers; mod error; +mod futures; mod gateway; pub(crate) mod prss_protocol; mod transport; @@ -18,6 +19,7 @@ use std::ops::{Index, IndexMut}; #[cfg(test)] pub use buffers::OrderingSender; pub use error::{Error, Result}; +pub use futures::MaybeFuture; #[cfg(feature = "stall-detection")] mod gateway_exports { From 096179e99ad8b65a70e9a31d2cf0a6cd32b47621 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Fri, 8 Mar 2024 14:44:13 -0800 Subject: [PATCH 055/135] PR feedback --- ipa-core/src/protocol/basics/reveal.rs | 79 ++++++++++++++------------ 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/ipa-core/src/protocol/basics/reveal.rs b/ipa-core/src/protocol/basics/reveal.rs index 16d678d01..4b9c21da5 100644 --- a/ipa-core/src/protocol/basics/reveal.rs +++ b/ipa-core/src/protocol/basics/reveal.rs @@ -10,10 +10,10 @@ use crate::{ secret_sharing::{ replicated::semi_honest::AdditiveShare as Replicated, SharedValue, Vectorizable, }, - seq_join::SeqJoin, }; #[cfg(feature = "descriptive-gate")] use crate::{ + helpers::MaybeFuture, protocol::context::UpgradedMaliciousContext, secret_sharing::replicated::malicious::{ AdditiveShare as MaliciousReplicated, ExtendableField, @@ -36,34 +36,34 @@ pub trait Reveal: Sized { where C: 'fut, { - // Passing `left_out = None` guarantees any ok result is `Some`. + // Passing `excluded = None` guarantees any ok result is `Some`. self.generic_reveal(ctx, record_id, None) .map_ok(Option::unwrap) } - /// partial reveal protocol to open a shared secret to all helpers except helper `left_out` inside the MPC ring. + /// Partial reveal protocol to open a shared secret to all helpers except helper `excluded` inside the MPC ring. fn partial_reveal<'fut>( &'fut self, ctx: C, record_id: RecordId, - left_out: Role, + excluded: Role, ) -> impl Future, Error>> + Send + 'fut where C: 'fut, { - self.generic_reveal(ctx, record_id, Some(left_out)) + self.generic_reveal(ctx, record_id, Some(excluded)) } /// Generic reveal implementation usable for both `reveal` and `partial_reveal`. /// - /// When `left_out` is `None`, open a shared secret to all helpers in the MPC ring. - /// When `left_out` is `Some`, open a shared secret to all helpers except the helper - /// specified in `left_out`. + /// When `excluded` is `None`, open a shared secret to all helpers in the MPC ring. + /// When `excluded` is `Some`, open a shared secret to all helpers except the helper + /// specified in `excluded`. fn generic_reveal<'fut>( &'fut self, ctx: C, record_id: RecordId, - left_out: Option, + excluded: Option, ) -> impl Future, Error>> + Send + 'fut where C: 'fut; @@ -90,7 +90,7 @@ impl, const N: usize> Reveal &'fut self, ctx: C, record_id: RecordId, - left_out: Option, + excluded: Option, ) -> Result>::Array>, Error> where C: 'fut, @@ -98,14 +98,14 @@ impl, const N: usize> Reveal let left = self.left_arr(); let right = self.right_arr(); - // send except to excluded helper (if any) - if Some(ctx.role().peer(Direction::Right)) != left_out { + // Send shares, unless the target helper is excluded + if Some(ctx.role().peer(Direction::Right)) != excluded { ctx.send_channel::<>::Array>(ctx.role().peer(Direction::Right)) .send(record_id, left) .await?; } - if Some(ctx.role()) == left_out { + if Some(ctx.role()) == excluded { Ok(None) } else { // Sleep until `helper's left` sends their share @@ -131,7 +131,7 @@ impl<'a, F: ExtendableField> Reveal, 1> for Mali &'fut self, ctx: UpgradedMaliciousContext<'a, F>, record_id: RecordId, - left_out: Option, + excluded: Option, ) -> Result>::Array>, Error> where UpgradedMaliciousContext<'a, F>: 'fut, @@ -146,16 +146,19 @@ impl<'a, F: ExtendableField> Reveal, 1> for Mali let right_sender = ctx.send_channel(ctx.role().peer(Direction::Right)); let right_receiver = ctx.recv_channel::(ctx.role().peer(Direction::Right)); - // Send share to helpers to the right and left - // send except to left_out - let send_left_fut = (Some(ctx.role().peer(Direction::Left)) != left_out) - .then(|| left_sender.send(record_id, right)); - let send_right_fut = (Some(ctx.role().peer(Direction::Right)) != left_out) - .then(|| right_sender.send(record_id, left)); - ctx.parallel_join(send_left_fut.into_iter().chain(send_right_fut)) - .await?; + // Send shares to the left and right helpers, unless excluded. + let send_left_fut = + MaybeFuture::future_or_ok(Some(ctx.role().peer(Direction::Left)) != excluded, || { + left_sender.send(record_id, right) + }); + + let send_right_fut = + MaybeFuture::future_or_ok(Some(ctx.role().peer(Direction::Right)) != excluded, || { + right_sender.send(record_id, left) + }); + try_join(send_left_fut, send_right_fut).await?; - if Some(ctx.role()) == left_out { + if Some(ctx.role()) == excluded { Ok(None) } else { let (share_from_left, share_from_right) = try_join( @@ -249,12 +252,12 @@ mod tests { let mut rng = thread_rng(); let world = TestWorld::default(); - for &left_out in Role::all() { + for &excluded in Role::all() { let input = rng.gen::(); let results = world .semi_honest(input, |ctx, share| async move { share - .partial_reveal(ctx.set_total_records(1), RecordId::from(0), left_out) + .partial_reveal(ctx.set_total_records(1), RecordId::from(0), excluded) .await .unwrap() .map(|revealed| TestField::from_array(&revealed)) @@ -262,7 +265,7 @@ mod tests { .await; for &helper in Role::all() { - if helper == left_out { + if helper == excluded { assert_eq!(None, results[helper]); } else { assert_eq!(Some(input), results[helper]); @@ -342,7 +345,7 @@ mod tests { let mut rng = thread_rng(); let world = TestWorld::default(); - for &left_out in Role::all() { + for &excluded in Role::all() { let sh_ctx = world.malicious_contexts(); let v = sh_ctx.map(UpgradableContext::validator); let m_ctx: [_; 3] = v @@ -364,7 +367,7 @@ mod tests { let results = join_all(zip(m_ctx.clone().into_iter(), m_shares).map( |(m_ctx, m_share)| async move { m_share - .partial_reveal(m_ctx, record_id, left_out) + .partial_reveal(m_ctx, record_id, excluded) .await .unwrap() }, @@ -372,7 +375,7 @@ mod tests { .await; for &helper in Role::all() { - if helper == left_out { + if helper == excluded { assert_eq!(None, results[helper]); } else { assert_eq!(Some(input.into_array()), results[helper]); @@ -419,11 +422,11 @@ mod tests { .await; assert!(matches!(result, Err(Error::MaliciousRevealFailed))); - }) + }); } #[test] - pub fn malicious_partial_validation_fail() { + pub fn malicious_partial_validation_fail() { run(|| async { let mut rng = thread_rng(); let world = TestWorld::default(); @@ -447,19 +450,25 @@ mod tests { let result = try_join3( m_shares[0].partial_reveal(m_ctx[0].clone(), record_id, Role::H3), m_shares[1].partial_reveal(m_ctx[1].clone(), record_id, Role::H3), - reveal_with_additive_attack(m_ctx[2].clone(), record_id, &m_shares[2], true, Fp31::ONE), + reveal_with_additive_attack( + m_ctx[2].clone(), + record_id, + &m_shares[2], + true, + Fp31::ONE, + ), ) .await; assert!(matches!(result, Err(Error::MaliciousRevealFailed))); - }) + }); } pub async fn reveal_with_additive_attack( ctx: UpgradedMaliciousContext<'_, F>, record_id: RecordId, input: &MaliciousReplicated, - left_out: bool, + excluded: bool, additive_error: F, ) -> Result, Error> { let (left, right) = input.x().access_without_downgrade().as_tuple(); @@ -475,7 +484,7 @@ mod tests { ) .await?; - if left_out { + if excluded { Ok(None) } else { let (share_from_left, _share_from_right): (F, F) = From a20ce0ff1922eaf8f0cb4c9ce147f82f6b8534cf Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Wed, 28 Feb 2024 18:56:08 -0800 Subject: [PATCH 056/135] Create a dedicated module for vectorization support --- ipa-core/src/secret_sharing/mod.rs | 211 +----------------- .../src/secret_sharing/{ => vector}/array.rs | 2 +- ipa-core/src/secret_sharing/vector/impls.rs | 49 ++++ ipa-core/src/secret_sharing/vector/mod.rs | 56 +++++ ipa-core/src/secret_sharing/vector/traits.rs | 115 ++++++++++ 5 files changed, 230 insertions(+), 203 deletions(-) rename ipa-core/src/secret_sharing/{ => vector}/array.rs (99%) create mode 100644 ipa-core/src/secret_sharing/vector/impls.rs create mode 100644 ipa-core/src/secret_sharing/vector/mod.rs create mode 100644 ipa-core/src/secret_sharing/vector/traits.rs diff --git a/ipa-core/src/secret_sharing/mod.rs b/ipa-core/src/secret_sharing/mod.rs index 7fa77a89f..64365bd51 100644 --- a/ipa-core/src/secret_sharing/mod.rs +++ b/ipa-core/src/secret_sharing/mod.rs @@ -1,65 +1,15 @@ -//! # Vectorization -//! -//! Vectorization refers to adapting an implementation that previously operated on one value at a -//! time, to instead operate on `N` values at a time. Vectorization improves performance in two ways: -//! -//! 1. Vectorized code can make use of special CPU instructions (Intel AVX, ARM NEON) that operate -//! on multiple values at a time. This reduces the CPU time required to perform computations. -//! We also use vectorization to refer to "bit packing" of boolean values, i.e., packing -//! 64 boolean values into a single u64 rather than using a byte (or even a word) for each -//! value. -//! 2. Aside from the core arithmetic operations that are involved in our MPC, a substantial -//! amount of other code is needed to send values between helpers, schedule futures for -//! execution, etc. Vectorization can result in a greater amount of arithmetic work being -//! performed for a given amount of overhead work, thus increasing the efficiency of the -//! implementation. -//! -//! ## Vectorization traits -//! -//! There are two sets of traits related to vectorization. -//! -//! If you are writing protocols, the trait of interest is `FieldSimd`, which can be specified in -//! a trait bound, something like `F: Field + FieldSimd`. -//! -//! The other traits are `Vectorizable` (for `SharedValue`s) and `FieldVectorizable`. These traits -//! are needed to work around a limitation in the rust type system. In most cases, you do not need -//! to reference the `Vectorizable` or `FieldVectorizable` traits directly when implementing -//! protocols. Usually the vector type is hidden within `AdditiveShare`, but if you are writing a -//! vectorized low-level primitive, you may need to refer to it directly, as `>::Array`. It is even more rare to need to use `FieldVectorizable`; see its -//! documentation and the documentation of `FieldSimd` for details. -//! -//! We require that each supported vectorization configuration (i.e. combination of data type and -//! width) be explicitly identified, by implementing the `Vectorizable` and/or `FieldVectorizable` -//! traits for base data type (e.g. `Fp32BitPrime`). This is for two reasons: -//! 1. Rust doesn't yet support evaluating expressions involving const parameters at compile time, -//! which makes it difficult or impossible to write generic serialization routines for -//! arbitrary widths. -//! 2. As a measure of protection against inadvertently using a configuration that will not be -//! efficient (i.e. an excessive vector width). -//! -//! ## Adding a new supported vectorization -//! -//! To add a new supported vectorization: -//! -//! 1. Add `FieldSimd` impl (in `secret_sharing/mod.rs`) -//! 2. Add `FromRandom` impl (in `array.rs` or `boolean_array.rs`) -//! 3. Add `Serializable` impl (in `array.rs` or `boolean_array.rs`) -//! 4. Add `Vectorizable` and `FieldVectorizable` impls (with the primitive type def in e.g. `galois_field.rs` - pub mod replicated; -mod array; mod decomposed; mod into_shares; mod scheme; +mod vector; use std::{ fmt::Debug, - ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign}, + ops::{Mul, MulAssign, Neg}, }; -pub use array::StdArray; pub(crate) use decomposed::BitDecomposed; use generic_array::ArrayLength; pub use into_shares::IntoShares; @@ -69,16 +19,15 @@ use rand::{ Rng, }; pub use scheme::{Bitwise, Linear, LinearRefOps, SecretSharing}; +pub use vector::{ + FieldArray, FieldSimd, FieldVectorizable, SharedValueArray, StdArray, Vectorizable, +}; +#[cfg(any(test, feature = "test-fixture", feature = "cli"))] +use crate::secret_sharing::replicated::semi_honest::AdditiveShare; use crate::{ - error::LengthError, - ff::{ - boolean::Boolean, - boolean_array::{BA20, BA256, BA3, BA32, BA5, BA64, BA8}, - AddSub, AddSubAssign, Field, Fp32BitPrime, Serializable, - }, - protocol::prss::FromRandom, - secret_sharing::replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, + ff::{AddSub, AddSubAssign, Serializable}, + secret_sharing::replicated::ReplicatedSecretSharing, }; /// Operations supported for weak shared values. @@ -170,148 +119,6 @@ macro_rules! impl_shared_value_common { }; } -// Note that we can either make `trait Vectorizable: SharedValue`, or we can make `trait -// SharedValue: Vectorizable<1>`, but doing both creates a cycle. (Similarly for -// `FieldVectorizable` / `Field`.) -// -// Although it is somewhat unnatural, we choose to do the latter, because it allows existing -// high-level protocols unaware of vectorization to call vectorized versions of core protocols (with -// width of 1) without updating all of the trait bounds. This does mean that the trait definitions -// do not prevent implementing `Vectorizable` for something that is not a `SharedValue`, but please -// don't do that. - -/// Trait for `SharedValue`s supporting operations on `N`-wide vectors. -pub trait Vectorizable: Sized { - type Array: SharedValueArray; -} - -/// Trait for `Field`s supporting operations on `N`-wide vectors. -/// -/// We would like `F` to be `FieldVectorizable` if it satisfies all of the following: -/// 1. `F: Field`. -/// 2. `>::Array: FieldArray`. Rust does not support expressing a -/// constraint on a super-trait's associated type directly. Instead, this effect is achieved -/// by constraining the `ArrayAlias` associated type and then constraining that -/// `Vectorizable::Array == FieldVectorizable::ArrayAlias` where necessary (e.g. in the -/// definition and blanket impl of the `FieldSimd` trait. We call it `ArrayAlias` instead of -/// `Array` so that references to the `Array` associated type do not require qualification -/// with a trait name. -/// 3. `F: Vectorizable`. This is implied by the previous two, because `FieldArray` -/// is a sub-trait of `SharedValueArray`. (See the `FieldSimd` documentation for another -/// important consequence of this sub-trait relationship.) -pub trait FieldVectorizable: SharedValue + Sized { - type ArrayAlias: FieldArray; -} - -// Convenience alias to express a supported vectorization when writing protocols. -// -// Typically appears like this: `F: Field + FieldSimd`. -// -// We could define a `SharedValueSimd` trait that is the analog of this for `SharedValue`s, but -// there are not currently any protocols that need it. -// -// Because we have constrained the associated types Vectorizable::Array and -// FieldVectorizable::ArrayAlias to be equal, the type they refer to must satisfy the union of all -// trait bounds applicable to either. However, in some cases the compiler has trouble proving -// properties related to this. (See rust issues [41118] and [60471].) A typical workaround for -// problems of this sort is to redundantly list a trait bound on both associated types, but for us -// that is not necessary in most cases because `FieldArray` is a sub-trait of `SharedValueArray`. -// -// Another consequence of this limitation of the compiler is that if you write the bound `F: Field + -// FieldSimd + Vectorizable`, you will get the error ``type annotations needed: -// cannot satisfy `>::Array == >::ArrayAlias```. The compiler is not smart enough to -// coalesce the constraints and see that `S`, `::Array`, and `::ArrayAlias` must all to refer to the same type. -// -// [41118](https://github.com/rust-lang/rust/issues/41118) -// [60471](https://github.com/rust-lang/rust/issues/60471) -pub trait FieldSimd: - Field + Vectorizable>::ArrayAlias> + FieldVectorizable -{ -} - -// Portions of the implementation treat non-vectorized operations as a vector with `N = 1`. This -// blanket impl (and the fact that `F: Field` is the only trait bound) is important in allowing code -// that writes `F: Field` to continue working without modification. -impl FieldSimd<1> for F {} - -// Supported vectorizations - -impl FieldSimd<32> for Fp32BitPrime {} - -macro_rules! boolean_vector { - ($dim:expr, $vec:ty) => { - impl Vectorizable<$dim> for Boolean { - type Array = $vec; - } - - impl FieldVectorizable<$dim> for Boolean { - type ArrayAlias = $vec; - } - - impl FieldSimd<$dim> for Boolean {} - - impl From> for AdditiveShare { - fn from(value: AdditiveShare<$vec>) -> Self { - AdditiveShare::new_arr(value.left(), value.right()) - } - } - - impl From> for AdditiveShare<$vec> { - fn from(value: AdditiveShare) -> Self { - AdditiveShare::new(*value.left_arr(), *value.right_arr()) - } - } - }; -} - -boolean_vector!(3, BA3); -boolean_vector!(5, BA5); -boolean_vector!(8, BA8); -boolean_vector!(20, BA20); -boolean_vector!(32, BA32); -boolean_vector!(64, BA64); -boolean_vector!(256, BA256); - -pub trait SharedValueArray: - Clone - + Eq - + Debug - + Send - + Sync - + Sized - + Sendable - + TryFrom, Error = LengthError> - + FromIterator - + IntoIterator - + Add - + for<'a> Add<&'a Self, Output = Self> - + AddAssign - + for<'a> AddAssign<&'a Self> - + Neg - + Sub - + for<'a> Sub<&'a Self, Output = Self> - + SubAssign - + for<'a> SubAssign<&'a Self> -{ - const ZERO_ARRAY: Self; - - fn from_fn V>(f: F) -> Self; -} - -// Some `SharedValue` types (and thus their arrays) implement `FromRandom`, but `RP25519` does not. -// We overload this distinction on `FieldArray` instead of creating a separate `ArrayFromRandom` trait, -// to avoid making the `Vectorizable` / `FieldVectorizable` situation that much more complicated. -pub trait FieldArray: - SharedValueArray - + FromRandom - + for<'a> Mul - + for<'a> Mul<&'a F, Output = Self> - + for<'a> Mul<&'a Self, Output = Self> -{ -} - #[cfg(any(test, feature = "test-fixture", feature = "cli"))] impl IntoShares> for V where diff --git a/ipa-core/src/secret_sharing/array.rs b/ipa-core/src/secret_sharing/vector/array.rs similarity index 99% rename from ipa-core/src/secret_sharing/array.rs rename to ipa-core/src/secret_sharing/vector/array.rs index f38e608c0..13f476b2e 100644 --- a/ipa-core/src/secret_sharing/array.rs +++ b/ipa-core/src/secret_sharing/vector/array.rs @@ -23,7 +23,7 @@ use crate::{ /// * It disables by-index access to individual elements of the array, which /// should never be necessary in properly vectorized code. #[derive(Clone, Debug, Eq, PartialEq)] -pub struct StdArray([V; N]); +pub struct StdArray(pub(super) [V; N]); impl PartialEq for StdArray where diff --git a/ipa-core/src/secret_sharing/vector/impls.rs b/ipa-core/src/secret_sharing/vector/impls.rs new file mode 100644 index 000000000..e29d8712b --- /dev/null +++ b/ipa-core/src/secret_sharing/vector/impls.rs @@ -0,0 +1,49 @@ +//! Supported vectorizations + +use crate::{ + ff::{ + boolean::Boolean, + boolean_array::{BA20, BA256, BA3, BA32, BA5, BA64, BA8}, + Fp32BitPrime, + }, + secret_sharing::{ + replicated::semi_honest::AdditiveShare, FieldSimd, FieldVectorizable, + ReplicatedSecretSharing, Vectorizable, + }, +}; + +impl FieldSimd<32> for Fp32BitPrime {} + +macro_rules! boolean_vector { + ($dim:expr, $vec:ty) => { + impl Vectorizable<$dim> for Boolean { + type Array = $vec; + } + + impl FieldVectorizable<$dim> for Boolean { + type ArrayAlias = $vec; + } + + impl FieldSimd<$dim> for Boolean {} + + impl From> for AdditiveShare { + fn from(value: AdditiveShare<$vec>) -> Self { + AdditiveShare::new_arr(value.left(), value.right()) + } + } + + impl From> for AdditiveShare<$vec> { + fn from(value: AdditiveShare) -> Self { + AdditiveShare::new(*value.left_arr(), *value.right_arr()) + } + } + }; +} + +boolean_vector!(3, BA3); +boolean_vector!(5, BA5); +boolean_vector!(8, BA8); +boolean_vector!(20, BA20); +boolean_vector!(32, BA32); +boolean_vector!(64, BA64); +boolean_vector!(256, BA256); diff --git a/ipa-core/src/secret_sharing/vector/mod.rs b/ipa-core/src/secret_sharing/vector/mod.rs new file mode 100644 index 000000000..e276d7d22 --- /dev/null +++ b/ipa-core/src/secret_sharing/vector/mod.rs @@ -0,0 +1,56 @@ +//! Vectorized secret shares +//! +//! Vectorization refers to adapting an implementation that previously operated on one value at a +//! time, to instead operate on `N` values at a time. Vectorization improves performance in two ways: +//! +//! 1. Vectorized code can make use of special CPU instructions (Intel AVX, ARM NEON) that operate +//! on multiple values at a time. This reduces the CPU time required to perform computations. +//! We also use vectorization to refer to "bit packing" of boolean values, i.e., packing +//! 64 boolean values into a single u64 rather than using a byte (or even a word) for each +//! value. +//! 2. Aside from the core arithmetic operations that are involved in our MPC, a substantial +//! amount of other code is needed to send values between helpers, schedule futures for +//! execution, etc. Vectorization can result in a greater amount of arithmetic work being +//! performed for a given amount of overhead work, thus increasing the efficiency of the +//! implementation. +//! +//! ## Vectorization traits +//! +//! There are two sets of traits related to vectorization. +//! +//! If you are writing protocols, the trait of interest is `FieldSimd`, which can be specified in +//! a trait bound, something like `F: Field + FieldSimd`. +//! +//! The other traits are `Vectorizable` (for `SharedValue`s) and `FieldVectorizable`. These traits +//! are needed to work around a limitation in the rust type system. In most cases, you do not need +//! to reference the `Vectorizable` or `FieldVectorizable` traits directly when implementing +//! protocols. Usually the vector type is hidden within `AdditiveShare`, but if you are writing a +//! vectorized low-level primitive, you may need to refer to it directly, as `>::Array`. It is even more rare to need to use `FieldVectorizable`; see its +//! documentation and the documentation of `FieldSimd` for details. +//! +//! We require that each supported vectorization configuration (i.e. combination of data type and +//! width) be explicitly identified, by implementing the `Vectorizable` and/or `FieldVectorizable` +//! traits for base data type (e.g. `Fp32BitPrime`). This is for two reasons: +//! 1. Rust doesn't yet support evaluating expressions involving const parameters at compile time, +//! which makes it difficult or impossible to write generic serialization routines for +//! arbitrary widths. +//! 2. As a measure of protection against inadvertently using a configuration that will not be +//! efficient (i.e. an excessive vector width). +//! +//! ## Adding a new supported vectorization +//! +//! To add a new supported vectorization: +//! +//! 1. Add `FromRandom` impl (in `array.rs` or `boolean_array.rs`) +//! 2. Add `Serializable` impl (in `array.rs` or `boolean_array.rs`) +//! 3. Add `FieldSimd` impl (in `secret_sharing/vector/impls.rs`) +//! 4. Add `Vectorizable` and `FieldVectorizable` impls (either with the primitive type def in +//! e.g. `galois_field.rs`, or in `vector/impls.rs`) + +mod array; +mod impls; +mod traits; + +pub use array::StdArray; +pub use traits::{FieldArray, FieldSimd, FieldVectorizable, SharedValueArray, Vectorizable}; diff --git a/ipa-core/src/secret_sharing/vector/traits.rs b/ipa-core/src/secret_sharing/vector/traits.rs new file mode 100644 index 000000000..b44316b70 --- /dev/null +++ b/ipa-core/src/secret_sharing/vector/traits.rs @@ -0,0 +1,115 @@ +use std::{ + fmt::Debug, + ops::{Add, AddAssign, Mul, Neg, Sub, SubAssign}, +}; + +use crate::{ + error::LengthError, + ff::Field, + protocol::prss::FromRandom, + secret_sharing::{Sendable, SharedValue}, +}; + +// Note that we can either make `trait Vectorizable: SharedValue`, or we can make `trait +// SharedValue: Vectorizable<1>`, but doing both creates a cycle. (Similarly for +// `FieldVectorizable` / `Field`.) +// +// Although it is somewhat unnatural, we choose to do the latter, because it allows existing +// high-level protocols unaware of vectorization to call vectorized versions of core protocols (with +// width of 1) without updating all of the trait bounds. This does mean that the trait definitions +// do not prevent implementing `Vectorizable` for something that is not a `SharedValue`, but please +// don't do that. + +/// Trait for `SharedValue`s supporting operations on `N`-wide vectors. +pub trait Vectorizable: Sized { + type Array: SharedValueArray; +} + +/// Trait for `Field`s supporting operations on `N`-wide vectors. +/// +/// We would like `F` to be `FieldVectorizable` if it satisfies all of the following: +/// 1. `F: Field`. +/// 2. `>::Array: FieldArray`. Rust does not support expressing a +/// constraint on a super-trait's associated type directly. Instead, this effect is achieved +/// by constraining the `ArrayAlias` associated type and then constraining that +/// `Vectorizable::Array == FieldVectorizable::ArrayAlias` where necessary (e.g. in the +/// definition and blanket impl of the `FieldSimd` trait. We call it `ArrayAlias` instead of +/// `Array` so that references to the `Array` associated type do not require qualification +/// with a trait name. +/// 3. `F: Vectorizable`. This is implied by the previous two, because `FieldArray` +/// is a sub-trait of `SharedValueArray`. (See the `FieldSimd` documentation for another +/// important consequence of this sub-trait relationship.) +pub trait FieldVectorizable: SharedValue + Sized { + type ArrayAlias: FieldArray; +} + +// Convenience alias to express a supported vectorization when writing protocols. +// +// Typically appears like this: `F: Field + FieldSimd`. +// +// We could define a `SharedValueSimd` trait that is the analog of this for `SharedValue`s, but +// there are not currently any protocols that need it. +// +// Because we have constrained the associated types Vectorizable::Array and +// FieldVectorizable::ArrayAlias to be equal, the type they refer to must satisfy the union of all +// trait bounds applicable to either. However, in some cases the compiler has trouble proving +// properties related to this. (See rust issues [41118] and [60471].) A typical workaround for +// problems of this sort is to redundantly list a trait bound on both associated types, but for us +// that is not necessary in most cases because `FieldArray` is a sub-trait of `SharedValueArray`. +// +// Another consequence of this limitation of the compiler is that if you write the bound `F: Field + +// FieldSimd + Vectorizable`, you will get the error ``type annotations needed: +// cannot satisfy `>::Array == >::ArrayAlias```. The compiler is not smart enough to +// coalesce the constraints and see that `S`, `::Array`, and `::ArrayAlias` must all to refer to the same type. +// +// [41118](https://github.com/rust-lang/rust/issues/41118) +// [60471](https://github.com/rust-lang/rust/issues/60471) +pub trait FieldSimd: + Field + Vectorizable>::ArrayAlias> + FieldVectorizable +{ +} + +// Portions of the implementation treat non-vectorized operations as a vector with `N = 1`. This +// blanket impl (and the fact that `F: Field` is the only trait bound) is important in allowing code +// that writes `F: Field` to continue working without modification. +impl FieldSimd<1> for F {} + +pub trait SharedValueArray: + Clone + + Eq + + Debug + + Send + + Sync + + Sized + + Sendable + + TryFrom, Error = LengthError> + + FromIterator + + IntoIterator + + Add + + for<'a> Add<&'a Self, Output = Self> + + AddAssign + + for<'a> AddAssign<&'a Self> + + Neg + + Sub + + for<'a> Sub<&'a Self, Output = Self> + + SubAssign + + for<'a> SubAssign<&'a Self> +{ + const ZERO_ARRAY: Self; + + fn from_fn V>(f: F) -> Self; +} + +// Some `SharedValue` types (and thus their arrays) implement `FromRandom`, but `RP25519` does not. +// We overload this distinction on `FieldArray` instead of creating a separate `ArrayFromRandom` trait, +// to avoid making the `Vectorizable` / `FieldVectorizable` situation that much more complicated. +pub trait FieldArray: + SharedValueArray + + FromRandom + + for<'a> Mul + + for<'a> Mul<&'a F, Output = Self> + + for<'a> Mul<&'a Self, Output = Self> +{ +} From f682f9dbc8e0e4a6e68d92b0036166e06ed7d861 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Fri, 15 Mar 2024 15:00:00 -0700 Subject: [PATCH 057/135] Pin nightly for miri checks --- .github/workflows/check.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 195ad733f..0406d6c0e 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -175,6 +175,9 @@ jobs: - uses: actions/checkout@v4 - uses: ./.github/actions/rm - uses: dtolnay/rust-toolchain@nightly + with: + # More recent nightlies don't work, probably https://github.com/rust-lang/rust/issues/122399 + toolchain: nightly-2024-03-11 - name: Add Miri run: rustup component add miri - name: Setup Miri From 4089860c2fd876503a5632807ff8d4397c344ba0 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Fri, 15 Mar 2024 14:21:55 -0700 Subject: [PATCH 058/135] Fix collect_steps script PR #963 changed the root step name, now our script is failing. Would be great to add it to CI, but I have high hopes that #961 is not too far ahead. Tested by manually running this script --- scripts/collect_steps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/collect_steps.py b/scripts/collect_steps.py index 240e85573..ea34ee3c1 100755 --- a/scripts/collect_steps.py +++ b/scripts/collect_steps.py @@ -12,7 +12,7 @@ QUERY_SIZE = 100 # attribution_window_seconds = 0 runs an optimized protocol, so 0 and anything larger ATTRIBUTION_WINDOW = [0, 86400] -ROOT_STEP_PREFIX = "protocol/alloc::string::String::run-0" +ROOT_STEP_PREFIX = "protocol/ipa_core::test_fixture::world::TestExecutionStep::iter0" BREAKDOWN_KEYS = 256 USER_CAP = [8, 16, 32, 64, 128] SECURITY_MODEL = "semi-honest" From 8c390e8a8fa7a23b2ebc9a17f8ae5e4f2ddd6d70 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sat, 16 Mar 2024 13:25:36 +1000 Subject: [PATCH 059/135] Minor changes to Lagrange module --- .../src/protocol/context/malicious_zkp.rs | 127 ++++++++++++++++++ .../ipa_prf/malicious_security/lagrange.rs | 55 ++++---- 2 files changed, 151 insertions(+), 31 deletions(-) create mode 100644 ipa-core/src/protocol/context/malicious_zkp.rs diff --git a/ipa-core/src/protocol/context/malicious_zkp.rs b/ipa-core/src/protocol/context/malicious_zkp.rs new file mode 100644 index 000000000..b9d33a569 --- /dev/null +++ b/ipa-core/src/protocol/context/malicious_zkp.rs @@ -0,0 +1,127 @@ +use ipa_macros::Step; + +use crate::{ff::PrimeField, protocol::{prss::SharedRandomness, RecordId}}; + +use super::Context; + +pub struct MaliciousZeroKnowledgeProofValidator { + x_left: u64, + x_right: u64, + y_left: u64, + y_right: u64, + p_left: u64, + p_right: u64, + z: u64, +} + +#[derive(Step)] +pub(crate) enum Step { + RandomYIntercepts, +} + +impl MaliciousZeroKnowledgeProofValidator { + fn recursive_validate(ctx: C, m: usize, lambda: usize, u: &[F], v: &[F]) + where + F: PrimeField, + C: Context + SharedRandomness, + { + let out = -F::truncate_from(m.into()) * F::INV_2; + let m_prime = 4 * m; + let mut s = m_prime / lambda; + if m_prime % lambda != 0 { + s += 1; + } + + // (a) + for k in 0..lambda { + if (s - 1) * lambda + k > m_prime { + u[(s - 1) * lambda + k] = F::ZERO; // I'm not sure about the `s-1` part... + v[(s - 1) * lambda + k] = F::ZERO; + } + } + + // (b) + let polynomials_p = Vec::with_capacity(s); + let polynomials_q = Vec::with_capacity(s); + let num_points = lambda + (s == 1).into(); + let mut p_points = vec![F::ZERO; num_points]; + let mut q_points = vec![F::ZERO; num_points]; + let c_random_weights = ctx.narrow(&Step::RandomYIntercepts); + + for t in 0..s { + if s == 1 { + let (left_rand, right_rand) = c_random_weights.generate_fields(RecordId::from(t)); + p_points[0] = right_rand; + q_points[0] = left_rand; + } + for k in 0..lambda { + let idx = k + (s == 1).into(); + p_points[idx] = u[t * lambda + k]; + q_points[idx] = v[t * lambda + k]; + } + + polynomials_p.push(fit_polynomial(p_points, false)); + polynomials_q.push(fit_polynomial(q_points, false)); + } + } + + // right now, hard-coded to validate a batch of 64 + fn gen_uv_for_batch(self) -> ([F; 256], [F; 256]) { + // a^(ℓ) := x^(ℓ)_i + let a = self.x_right; + + // c^(ℓ) := y^(ℓ)_i + let c = self.y_right; + + // e^(ℓ) := x^(ℓ)_i · y^(ℓ)_i ⊕ z^(ℓ)_i ⊕ ρ^(ℓ)_i + let e = (self.x_right & self.y_right) ^ self.z ^ self.p_right; + + // b^(ℓ) := y^(ℓ)_(i−1) + let b = self.y_left; + + // d^(ℓ) := x^(ℓ)_(i−1) + let d = self.x_left; + + // f^(ℓ) := ρ^(ℓ)_(i−1) + let f = self.p_left; + + let mut u: [F; 256] = [F::ZERO; 256]; + let mut v: [F; 256] = [F::ZERO; 256]; + + let neg_2 = F::try_from(F::PRIME.into() - 2).unwrap(); + for i in 0..64 { + let a_i = F::truncate_from((a >> i) & 1); + let c_i = F::truncate_from((c >> i) & 1); + let one_minus_2e = F::ONE + F::truncate_from((e >> i) & 1) * neg_2; + // g^(ℓ)_1 := −2a^(ℓ) · c^(ℓ) · (1 − 2e^(ℓ)) + u[4 * i] = a_i * neg_2 * c_i * one_minus_2e; + + // g^(ℓ)_2 := c^(ℓ) · (1 − 2e^(ℓ)) + u[4 * i + 1] = c_i * one_minus_2e; + + // g^(ℓ)_3 := a^(ℓ) · (1 − 2e^(ℓ)) + u[4 * i + 2] = a_i * one_minus_2e; + + // g^(ℓ)_4 := −(1−2e^(ℓ))/2, + u[4 * i + 3] = -one_minus_2e * F::INV_2; + + let b_i = F::truncate_from((b >> i) & 1); + let d_i = F::truncate_from((d >> i) & 1); + let one_minus_2f = F::ONE + F::truncate_from((f >> i) & 1) * neg_2; + + // h^(ℓ)_1 := b^(ℓ) · d^(ℓ) · (1 − 2 f^(ℓ)) + v[4 * i] = b_i * d_i * one_minus_2f; + + // h^(ℓ)_2 := d^(ℓ) · (1 − 2 f^(ℓ)) + v[4 * i + 1] = d_i * one_minus_2f; + + // h^(ℓ)_3 := b^(ℓ) · (1 − 2 f^(ℓ)) + v[4 * i + 2] = b_i * one_minus_2f; + + // h^(ℓ)_4 := 1−2 f^(ℓ) + v[4 * i + 3] = one_minus_2f; + } + + (u, v) + } +} diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index 04ddeae4b..7ef171fe2 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -100,24 +100,15 @@ where /// This function uses the `LagrangeTable` to evaluate `polynomial` on the specified output "x coordinates" /// outputs the "y coordinates" such that `(x,y)` lies on `polynomial` pub fn eval(&self, polynomial: &Polynomial) -> GenericArray { - let mut result = GenericArray::generate(|_| F::ONE); - self.mult_result_by_evaluation(polynomial, &mut result); - result - } - - /// This function uses the `LagrangeTable` to evaluate `polynomial` on the specified output "x coordinates" - /// the "y coordinates" of the evaluation are multiplied to `result` - pub fn mult_result_by_evaluation( - &self, - polynomial: &Polynomial, - result: &mut GenericArray, - ) { - for (y, base) in result.iter_mut().zip(self.table.iter()) { - *y *= base - .iter() - .zip(polynomial.y_coordinates.iter()) - .fold(F::ZERO, |acc, (&base, &y)| acc + base * y); - } + self.table + .iter() + .map(|table_row| { + table_row + .iter() + .zip(polynomial.y_coordinates.iter()) + .fold(F::ZERO, |acc, (&base, &y)| acc + base * y) + }) + .collect() } /// helper function to compute a single row of `LagrangeTable` @@ -200,18 +191,20 @@ mod test { where M: ArrayLength, { - // evaluate polynomial p at evaluation_points and random point using monomial base - let mut y_values = GenericArray::generate(|_| F::ZERO); - for (x, y) in x_output.iter().zip(y_values.iter_mut()) { - // monomial base, i.e. `x^k` - let mut base = F::ONE; - // evaluate p via `sum_k coefficient_k * x^k` - for coefficient in &self.coefficients { - *y += *coefficient * base; - base *= *x; - } - } - y_values + x_output + .iter() + .map(|&x| { + // monomial base, i.e. `x^k` + // evaluate p via `sum_k coefficient_k * x^k` + let (_, y) = self + .coefficients + .iter() + .fold((F::ONE, F::ZERO), |(base, y), &coef| { + (base * x, y + coef * base) + }); + y + }) + .collect() } } @@ -259,7 +252,7 @@ mod test { let polynomial_monomial_form = MonomialFormPolynomial { coefficients: GenericArray::::from_array(input_points), }; - // the canonical x coordinates are 0..15, the outputs use coordinates 8..15: + // the canonical x coordinates are 0..7, the outputs use coordinates 8..15: let x_coordinates_output = GenericArray::<_, U7>::generate(|i| { TestField::try_from(u128::try_from(i).unwrap() + 8).unwrap() }); From c315f679bc57c4488713d2636824c1a5546d07f6 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sat, 16 Mar 2024 13:40:36 +1000 Subject: [PATCH 060/135] removing a file I added by accident --- .../src/protocol/context/malicious_zkp.rs | 127 ------------------ 1 file changed, 127 deletions(-) delete mode 100644 ipa-core/src/protocol/context/malicious_zkp.rs diff --git a/ipa-core/src/protocol/context/malicious_zkp.rs b/ipa-core/src/protocol/context/malicious_zkp.rs deleted file mode 100644 index b9d33a569..000000000 --- a/ipa-core/src/protocol/context/malicious_zkp.rs +++ /dev/null @@ -1,127 +0,0 @@ -use ipa_macros::Step; - -use crate::{ff::PrimeField, protocol::{prss::SharedRandomness, RecordId}}; - -use super::Context; - -pub struct MaliciousZeroKnowledgeProofValidator { - x_left: u64, - x_right: u64, - y_left: u64, - y_right: u64, - p_left: u64, - p_right: u64, - z: u64, -} - -#[derive(Step)] -pub(crate) enum Step { - RandomYIntercepts, -} - -impl MaliciousZeroKnowledgeProofValidator { - fn recursive_validate(ctx: C, m: usize, lambda: usize, u: &[F], v: &[F]) - where - F: PrimeField, - C: Context + SharedRandomness, - { - let out = -F::truncate_from(m.into()) * F::INV_2; - let m_prime = 4 * m; - let mut s = m_prime / lambda; - if m_prime % lambda != 0 { - s += 1; - } - - // (a) - for k in 0..lambda { - if (s - 1) * lambda + k > m_prime { - u[(s - 1) * lambda + k] = F::ZERO; // I'm not sure about the `s-1` part... - v[(s - 1) * lambda + k] = F::ZERO; - } - } - - // (b) - let polynomials_p = Vec::with_capacity(s); - let polynomials_q = Vec::with_capacity(s); - let num_points = lambda + (s == 1).into(); - let mut p_points = vec![F::ZERO; num_points]; - let mut q_points = vec![F::ZERO; num_points]; - let c_random_weights = ctx.narrow(&Step::RandomYIntercepts); - - for t in 0..s { - if s == 1 { - let (left_rand, right_rand) = c_random_weights.generate_fields(RecordId::from(t)); - p_points[0] = right_rand; - q_points[0] = left_rand; - } - for k in 0..lambda { - let idx = k + (s == 1).into(); - p_points[idx] = u[t * lambda + k]; - q_points[idx] = v[t * lambda + k]; - } - - polynomials_p.push(fit_polynomial(p_points, false)); - polynomials_q.push(fit_polynomial(q_points, false)); - } - } - - // right now, hard-coded to validate a batch of 64 - fn gen_uv_for_batch(self) -> ([F; 256], [F; 256]) { - // a^(ℓ) := x^(ℓ)_i - let a = self.x_right; - - // c^(ℓ) := y^(ℓ)_i - let c = self.y_right; - - // e^(ℓ) := x^(ℓ)_i · y^(ℓ)_i ⊕ z^(ℓ)_i ⊕ ρ^(ℓ)_i - let e = (self.x_right & self.y_right) ^ self.z ^ self.p_right; - - // b^(ℓ) := y^(ℓ)_(i−1) - let b = self.y_left; - - // d^(ℓ) := x^(ℓ)_(i−1) - let d = self.x_left; - - // f^(ℓ) := ρ^(ℓ)_(i−1) - let f = self.p_left; - - let mut u: [F; 256] = [F::ZERO; 256]; - let mut v: [F; 256] = [F::ZERO; 256]; - - let neg_2 = F::try_from(F::PRIME.into() - 2).unwrap(); - for i in 0..64 { - let a_i = F::truncate_from((a >> i) & 1); - let c_i = F::truncate_from((c >> i) & 1); - let one_minus_2e = F::ONE + F::truncate_from((e >> i) & 1) * neg_2; - // g^(ℓ)_1 := −2a^(ℓ) · c^(ℓ) · (1 − 2e^(ℓ)) - u[4 * i] = a_i * neg_2 * c_i * one_minus_2e; - - // g^(ℓ)_2 := c^(ℓ) · (1 − 2e^(ℓ)) - u[4 * i + 1] = c_i * one_minus_2e; - - // g^(ℓ)_3 := a^(ℓ) · (1 − 2e^(ℓ)) - u[4 * i + 2] = a_i * one_minus_2e; - - // g^(ℓ)_4 := −(1−2e^(ℓ))/2, - u[4 * i + 3] = -one_minus_2e * F::INV_2; - - let b_i = F::truncate_from((b >> i) & 1); - let d_i = F::truncate_from((d >> i) & 1); - let one_minus_2f = F::ONE + F::truncate_from((f >> i) & 1) * neg_2; - - // h^(ℓ)_1 := b^(ℓ) · d^(ℓ) · (1 − 2 f^(ℓ)) - v[4 * i] = b_i * d_i * one_minus_2f; - - // h^(ℓ)_2 := d^(ℓ) · (1 − 2 f^(ℓ)) - v[4 * i + 1] = d_i * one_minus_2f; - - // h^(ℓ)_3 := b^(ℓ) · (1 − 2 f^(ℓ)) - v[4 * i + 2] = b_i * one_minus_2f; - - // h^(ℓ)_4 := 1−2 f^(ℓ) - v[4 * i + 3] = one_minus_2f; - } - - (u, v) - } -} From c8be62366b789729125b141e1ded0080b9e9c638 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sat, 16 Mar 2024 14:18:29 +1000 Subject: [PATCH 061/135] removing one more iter_mut in the denominators --- .../ipa_prf/malicious_security/lagrange.rs | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index 7ef171fe2..cbe10a465 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -35,23 +35,28 @@ where // assertion that field is large enough // when it is large enough, `F::try_from().unwrap()` below does not panic assert!( - F::BITS > usize::BITS - N::USIZE.leading_zeros(), + u128::from(N::U64) < F::PRIME.into(), "Field size {} is not large enough to hold {} points", - F::BITS, - N::USIZE + F::PRIME.into(), + N::U64 ); // assertion that table is not too large for the stack assert!(::Size::USIZE * N::USIZE < 2024); - let mut denominator = GenericArray::generate(|_| F::ONE); - for (d, i) in denominator.iter_mut().zip(0u64..) { - for j in (0..N::U64).filter(|&j| i != j) { - *d *= F::try_from(u128::from(i)).unwrap() - F::try_from(u128::from(j)).unwrap(); - } - *d = d.invert(); + Self { + denominator: (0..u128::from(N::U64)) + .into_iter() + .map(|i| { + (0..u128::from(N::U64)) + .into_iter() + .filter(|&j| i != j) + .map(|j| F::try_from(i).unwrap() - F::try_from(j).unwrap()) + .fold(F::ONE, |acc, a| acc * a) + .invert() + }) + .collect(), } - Self { denominator } } } From 98c0543fc79329cb29853eca1eaa0d5ca16d363e Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sat, 16 Mar 2024 14:34:21 +1000 Subject: [PATCH 062/135] Improving error message --- .../protocol/ipa_prf/malicious_security/lagrange.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index cbe10a465..2d26e2490 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -136,8 +136,7 @@ where impl From> for LagrangeTable where - F: Field + TryFrom, - >::Error: Debug, + F: PrimeField, N: ArrayLength, M: ArrayLength, { @@ -145,11 +144,11 @@ where // assertion that field is large enough // when it is large enough, `F::try_from().unwrap()` below does not panic assert!( - F::BITS > usize::BITS - (N::USIZE + M::USIZE).leading_zeros(), + u128::from(N::U64 + M::U64) < F::PRIME.into(), "Field size {} is not large enough to hold {} + {} points", - F::BITS, - N::USIZE, - M::USIZE + F::PRIME.into(), + N::U64, + M::U64 ); // assertion that table is not too large for the stack From 65066c40d655b8dcc2159f5ad05a168730e3d821 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sat, 16 Mar 2024 16:12:52 +1000 Subject: [PATCH 063/135] Removing the last iter_mut --- ipa-core/Cargo.toml | 2 +- .../ipa_prf/malicious_security/lagrange.rs | 54 +++++++++++-------- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/ipa-core/Cargo.toml b/ipa-core/Cargo.toml index 033a56931..6b064d09f 100644 --- a/ipa-core/Cargo.toml +++ b/ipa-core/Cargo.toml @@ -149,7 +149,7 @@ tower = { version = "0.4.13", optional = true } tower-http = { version = "0.4.0", optional = true, features = ["trace"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } -typenum = "1.16" +typenum = { version = "1.17", features = ["i128"] } # hpke is pinned to it x25519-dalek = "2.0.0-rc.3" diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index 2d26e2490..b2fb2e10b 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -1,6 +1,7 @@ use std::fmt::Debug; +use std::iter::repeat; -use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; +use generic_array::{ArrayLength, GenericArray}; use typenum::{Unsigned, U1}; use crate::ff::{Field, PrimeField, Serializable}; @@ -35,20 +36,20 @@ where // assertion that field is large enough // when it is large enough, `F::try_from().unwrap()` below does not panic assert!( - u128::from(N::U64) < F::PRIME.into(), + N::U128 < F::PRIME.into(), "Field size {} is not large enough to hold {} points", F::PRIME.into(), - N::U64 + N::U128 ); // assertion that table is not too large for the stack assert!(::Size::USIZE * N::USIZE < 2024); Self { - denominator: (0..u128::from(N::U64)) + denominator: (0..N::U128) .into_iter() .map(|i| { - (0..u128::from(N::U64)) + (0..N::U128) .into_iter() .filter(|&j| i != j) .map(|j| F::try_from(i).unwrap() - F::try_from(j).unwrap()) @@ -84,12 +85,11 @@ where { /// generates a `CanonicalLagrangeTable` from `CanoncialLagrangeDenominators` for a single output point /// The "x coordinate" of the output point is `x_output`. - pub fn new(denominator: CanonicalLagrangeDenominator, x_output: &F) -> Self { + pub fn new(denominator: &CanonicalLagrangeDenominator, x_output: &F) -> Self { // assertion that table is not too large for the stack assert!(::Size::USIZE * N::USIZE < 2024); - let mut table = denominator.denominator; - Self::compute_table_row(x_output, &mut table); + let table = Self::compute_table_row(x_output, denominator); LagrangeTable:: { table: GenericArray::from_array([table; 1]), } @@ -120,17 +120,25 @@ where /// /// ## Panics /// When the field size is too small for `N` evaluation points - fn compute_table_row(x_output: &F, table_row: &mut GenericArray) + fn compute_table_row( + x_output: &F, + denominator: &CanonicalLagrangeDenominator, + ) -> GenericArray where F: Field + TryFrom, >::Error: Debug, N: ArrayLength, { - for (entry, i) in table_row.iter_mut().zip(0u64..) { - for j in (0..N::U64).filter(|&j| j != i) { - *entry *= *x_output - F::try_from(u128::from(j)).unwrap(); - } - } + (0..N::U128) + .zip(repeat(0..N::U128)) + .map(|(i, range)| { + range + .filter(|&j| j != i) + .fold(F::ONE, |acc, j| acc * (*x_output - F::try_from(j).unwrap())) + }) + .zip(&denominator.denominator) + .map(|(numerator, denominator)| *denominator * numerator) + .collect() } } @@ -144,21 +152,21 @@ where // assertion that field is large enough // when it is large enough, `F::try_from().unwrap()` below does not panic assert!( - u128::from(N::U64 + M::U64) < F::PRIME.into(), + N::U128 + M::U128 < F::PRIME.into(), "Field size {} is not large enough to hold {} + {} points", F::PRIME.into(), - N::U64, - M::U64 + N::U128, + M::U128 ); // assertion that table is not too large for the stack assert!(::Size::USIZE * N::USIZE * M::USIZE < 2024); - let mut table = GenericArray::generate(|_| value.denominator.clone()); - table.iter_mut().zip(0u64..).for_each(|(row, i)| { - Self::compute_table_row(&F::try_from(u128::from(i + N::U64)).unwrap(), row); - }); - LagrangeTable { table } + LagrangeTable { + table: (N::U128..(N::U128 + M::U128)) + .map(|i| Self::compute_table_row(&F::try_from(i).unwrap(), &value)) + .collect(), + } } } @@ -240,7 +248,7 @@ mod test { let polynomial = Polynomial::from(polynomial_monomial_form.clone()); let denominator = CanonicalLagrangeDenominator::::new(); // generate table using new - let lagrange_table = LagrangeTable::::new(denominator, &output_point); + let lagrange_table = LagrangeTable::::new(&denominator, &output_point); let output = lagrange_table.eval(&polynomial); assert_eq!(output, output_expected); } From 1f9eb85a40cfc73146bbb9721d25a68184efa1c7 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sat, 16 Mar 2024 16:27:50 +1000 Subject: [PATCH 064/135] formatting --- ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index b2fb2e10b..f4a3276be 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -1,5 +1,4 @@ -use std::fmt::Debug; -use std::iter::repeat; +use std::{fmt::Debug, iter::repeat}; use generic_array::{ArrayLength, GenericArray}; use typenum::{Unsigned, U1}; From 8df8f2afb9f9eff9901609825f009dae4b9e1fbe Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sat, 16 Mar 2024 16:55:33 +1000 Subject: [PATCH 065/135] a bit shorter --- .../src/protocol/ipa_prf/malicious_security/lagrange.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index f4a3276be..c00182bfd 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -1,4 +1,4 @@ -use std::{fmt::Debug, iter::repeat}; +use std::fmt::Debug; use generic_array::{ArrayLength, GenericArray}; use typenum::{Unsigned, U1}; @@ -46,10 +46,8 @@ where Self { denominator: (0..N::U128) - .into_iter() .map(|i| { (0..N::U128) - .into_iter() .filter(|&j| i != j) .map(|j| F::try_from(i).unwrap() - F::try_from(j).unwrap()) .fold(F::ONE, |acc, a| acc * a) @@ -129,9 +127,8 @@ where N: ArrayLength, { (0..N::U128) - .zip(repeat(0..N::U128)) - .map(|(i, range)| { - range + .map(|i| { + (0..N::U128) .filter(|&j| j != i) .fold(F::ONE, |acc, j| acc * (*x_output - F::try_from(j).unwrap())) }) From bba86d0a3c5b7e46001fbd708553fb6eec2f497d Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sun, 17 Mar 2024 01:01:03 +1000 Subject: [PATCH 066/135] Adding the first part of the zero knowledge proof computation, computing the polynomial G --- .../ipa_prf/malicious_security/lagrange.rs | 9 +- .../ipa_prf/malicious_security/mod.rs | 1 + .../ipa_prf/malicious_security/prover.rs | 93 +++++++++++++++++++ 3 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index c00182bfd..b0654b8d1 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -70,6 +70,7 @@ where /// The "x coordinates" of the output points `x_N` to `x_(N+M-1)` are `N*F::ONE` to `(N+M-1)*F::ONE` /// when generated using `from(denominator)` /// unless generated using `new(denominator, x_output)` for a specific output "x coordinate" `x_output`. +#[derive(Debug)] pub struct LagrangeTable { table: GenericArray, M>, } @@ -101,13 +102,13 @@ where { /// This function uses the `LagrangeTable` to evaluate `polynomial` on the specified output "x coordinates" /// outputs the "y coordinates" such that `(x,y)` lies on `polynomial` - pub fn eval(&self, polynomial: &Polynomial) -> GenericArray { + pub fn eval(&self, y_coordinates: &GenericArray) -> GenericArray { self.table .iter() .map(|table_row| { table_row .iter() - .zip(polynomial.y_coordinates.iter()) + .zip(y_coordinates.iter()) .fold(F::ZERO, |acc, (&base, &y)| acc + base * y) }) .collect() @@ -245,7 +246,7 @@ mod test { let denominator = CanonicalLagrangeDenominator::::new(); // generate table using new let lagrange_table = LagrangeTable::::new(&denominator, &output_point); - let output = lagrange_table.eval(&polynomial); + let output = lagrange_table.eval(&polynomial.y_coordinates); assert_eq!(output, output_expected); } @@ -269,7 +270,7 @@ mod test { let denominator = CanonicalLagrangeDenominator::::new(); // generate table using from let lagrange_table = LagrangeTable::::from(denominator); - let output = lagrange_table.eval(&polynomial); + let output = lagrange_table.eval(&polynomial.y_coordinates); assert_eq!(output, output_expected); } diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs index ea0ac6eef..aed193ad3 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs @@ -1 +1,2 @@ pub mod lagrange; +pub mod prover; \ No newline at end of file diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs new file mode 100644 index 000000000..f08407327 --- /dev/null +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -0,0 +1,93 @@ +use std::{ + iter::zip, + ops::{Add, Sub}, +}; + +use generic_array::{arr, sequence::GenericSequence, ArrayLength, GenericArray}; +use typenum::{Diff, Sum, Unsigned, U1}; + +use crate::{ + ff::PrimeField, + protocol::ipa_prf::malicious_security::lagrange::{ + CanonicalLagrangeDenominator, LagrangeTable, Polynomial, + }, +}; + +pub struct ProofGenerator { + u: Vec, + v: Vec, +} + +impl ProofGenerator +where + F: PrimeField, +{ + pub fn compute_proof(self) -> GenericArray, U1>> + where + N: ArrayLength + Add + Sub, + ::Output: Sub, + <::Output as Sub>::Output: ArrayLength, + >::Output: ArrayLength, + { + assert!(self.u.len() % N::USIZE == 0); // We should pad with zeroes eventually + + let strip_len = self.u.len() / N::USIZE; + + let denominator = CanonicalLagrangeDenominator::::new(); + let lagrange_table = LagrangeTable::>::Output>::from(denominator); + let extrapolated_points = (0..strip_len).map(|i| { + let p: GenericArray = (0..N::USIZE).map(|j| self.u[i * N::USIZE + j]).collect(); + let q: GenericArray = (0..N::USIZE).map(|j| self.v[i * N::USIZE + j]).collect(); + let p_extrapolated = lagrange_table.eval(&p); + let q_extrapolated = lagrange_table.eval(&q); + zip( + p.into_iter().chain(p_extrapolated), + q.into_iter().chain(q_extrapolated), + ) + .map(|(a, b)| a * b) + .collect::>() + }); + extrapolated_points.reduce(|acc, pts| { + zip(acc, pts).map(|(a, b)| a + b).collect() + }).unwrap() + } +} + +#[cfg(all(test, unit_test))] +mod test { + use std::fmt::Debug; + + use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; + use proptest::{prelude::*, proptest}; + use typenum::{U1, U32, U4, U7, U8}; + + use super::ProofGenerator; + use crate::{ + ff::{Field, Fp31, U128Conversions}, + protocol::ipa_prf::malicious_security::lagrange::{ + CanonicalLagrangeDenominator, LagrangeTable, Polynomial, + }, + }; + + #[test] + fn sample_proof() { + const U: [u128; 32] = [ + 0, 0, 1, 15, 0, 0, 0, 15, 2, 30, 30, 16, 29, 1, 1, 15, 0, 0, 0, 15, 0, 0, 0, 15, 2, 30, + 30, 16, 0, 0, 1, 15, + ]; + const V: [u128; 32] = [ + 30, 30, 30, 30, 0, 1, 0, 1, 0, 0, 0, 30, 0, 30, 0, 30, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 30, 0, 0, 30, 30, + ]; + const EXPECTED: [u128; 7] = [0, 30, 29, 30, 3, 22, 6]; + let pg: ProofGenerator = ProofGenerator { + u: U.into_iter().map(|x| Fp31::try_from(x).unwrap()).collect(), + v: V.into_iter().map(|x| Fp31::try_from(x).unwrap()).collect(), + }; + let proof = pg.compute_proof::(); + assert_eq!( + proof.into_iter().map(|x| x.as_u128()).collect::>(), + EXPECTED + ); + } +} From dcbc421f2c7fb893384c8c5fcb5c3edd22f92e2d Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sun, 17 Mar 2024 01:19:08 +1000 Subject: [PATCH 067/135] formatting --- ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs | 2 +- .../src/protocol/ipa_prf/malicious_security/prover.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs index aed193ad3..0e7f6bf3a 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs @@ -1,2 +1,2 @@ pub mod lagrange; -pub mod prover; \ No newline at end of file +pub mod prover; diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index f08407327..4bc933958 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -45,11 +45,11 @@ where q.into_iter().chain(q_extrapolated), ) .map(|(a, b)| a * b) - .collect::>() + .collect::>() }); - extrapolated_points.reduce(|acc, pts| { - zip(acc, pts).map(|(a, b)| a + b).collect() - }).unwrap() + extrapolated_points + .reduce(|acc, pts| zip(acc, pts).map(|(a, b)| a + b).collect()) + .unwrap() } } From e4fbe635586e35cbe3a7f3e9b222e4cab1dc70df Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sun, 17 Mar 2024 01:32:04 +1000 Subject: [PATCH 068/135] removing Polynomial --- .../ipa_prf/malicious_security/lagrange.rs | 46 ++++++------------- .../ipa_prf/malicious_security/prover.rs | 19 ++------ 2 files changed, 19 insertions(+), 46 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index b0654b8d1..8c90644fb 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -5,14 +5,6 @@ use typenum::{Unsigned, U1}; use crate::ff::{Field, PrimeField, Serializable}; -/// A degree `N-1` polynomial is stored as `N` points `(x,y)` -/// where the "x coordinates" of the input points are `x_0` to `x_N` are `F::ZERO` to `(N-1)*F::ONE` -/// Therefore, we only need to store the `y` coordinates. -#[derive(Debug, PartialEq, Clone)] -pub struct Polynomial { - y_coordinates: GenericArray, -} - /// The Canonical Lagrange denominator is defined as the denominator of the Lagrange base polynomials /// `https://en.wikipedia.org/wiki/Lagrange_polynomial` /// where the "x coordinates" of the input points are `x_0` to `x_N` are `F::ZERO` to `(N-1)*F::ONE` @@ -70,7 +62,6 @@ where /// The "x coordinates" of the output points `x_N` to `x_(N+M-1)` are `N*F::ONE` to `(N+M-1)*F::ONE` /// when generated using `from(denominator)` /// unless generated using `new(denominator, x_output)` for a specific output "x coordinate" `x_output`. -#[derive(Debug)] pub struct LagrangeTable { table: GenericArray, M>, } @@ -176,24 +167,30 @@ mod test { use typenum::{U1, U32, U7, U8}; use crate::{ - ff::Field, + ff::PrimeField, protocol::ipa_prf::malicious_security::lagrange::{ - CanonicalLagrangeDenominator, LagrangeTable, Polynomial, + CanonicalLagrangeDenominator, LagrangeTable, }, }; type TestField = crate::ff::Fp32BitPrime; #[derive(Debug, PartialEq, Clone)] - struct MonomialFormPolynomial { + struct MonomialFormPolynomial { coefficients: GenericArray, } impl MonomialFormPolynomial where - F: Field, + F: PrimeField, N: ArrayLength, { + fn gen_y_values_of_canonical_points(self) -> GenericArray { + let canonical_points: GenericArray = + GenericArray::generate(|i| F::try_from(u128::try_from(i).unwrap()).unwrap()); + self.eval(&canonical_points) + } + /// test helper function that evaluates a polynomial in monomial form, i.e. `sum_i c_i x^i` on points `x_output` /// where `c_0` to `c_N` are stored in `polynomial` fn eval(&self, x_output: &GenericArray) -> GenericArray @@ -217,21 +214,6 @@ mod test { } } - impl From> for Polynomial - where - F: Field + TryFrom, - >::Error: Debug, - N: ArrayLength, - { - fn from(value: MonomialFormPolynomial) -> Self { - let canonical_points: GenericArray = - GenericArray::generate(|i| F::try_from(u128::try_from(i).unwrap()).unwrap()); - Polynomial { - y_coordinates: value.eval(&canonical_points), - } - } - } - fn lagrange_single_output_point_using_new( output_point: TestField, input_points: [TestField; 32], @@ -242,11 +224,11 @@ mod test { let output_expected = polynomial_monomial_form.eval( &GenericArray::::from_array([output_point; 1]), ); - let polynomial = Polynomial::from(polynomial_monomial_form.clone()); let denominator = CanonicalLagrangeDenominator::::new(); // generate table using new let lagrange_table = LagrangeTable::::new(&denominator, &output_point); - let output = lagrange_table.eval(&polynomial.y_coordinates); + let output = + lagrange_table.eval(&polynomial_monomial_form.gen_y_values_of_canonical_points()); assert_eq!(output, output_expected); } @@ -266,11 +248,11 @@ mod test { TestField::try_from(u128::try_from(i).unwrap() + 8).unwrap() }); let output_expected = polynomial_monomial_form.eval(&x_coordinates_output); - let polynomial = Polynomial::from(polynomial_monomial_form.clone()); let denominator = CanonicalLagrangeDenominator::::new(); // generate table using from let lagrange_table = LagrangeTable::::from(denominator); - let output = lagrange_table.eval(&polynomial.y_coordinates); + let output = + lagrange_table.eval(&polynomial_monomial_form.gen_y_values_of_canonical_points()); assert_eq!(output, output_expected); } diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index 4bc933958..699c79f96 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -3,13 +3,13 @@ use std::{ ops::{Add, Sub}, }; -use generic_array::{arr, sequence::GenericSequence, ArrayLength, GenericArray}; -use typenum::{Diff, Sum, Unsigned, U1}; +use generic_array::{ArrayLength, GenericArray}; +use typenum::{Diff, Sum, U1}; use crate::{ ff::PrimeField, protocol::ipa_prf::malicious_security::lagrange::{ - CanonicalLagrangeDenominator, LagrangeTable, Polynomial, + CanonicalLagrangeDenominator, LagrangeTable, }, }; @@ -55,19 +55,10 @@ where #[cfg(all(test, unit_test))] mod test { - use std::fmt::Debug; - - use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; - use proptest::{prelude::*, proptest}; - use typenum::{U1, U32, U4, U7, U8}; + use typenum::U4; use super::ProofGenerator; - use crate::{ - ff::{Field, Fp31, U128Conversions}, - protocol::ipa_prf::malicious_security::lagrange::{ - CanonicalLagrangeDenominator, LagrangeTable, Polynomial, - }, - }; + use crate::ff::{Fp31, U128Conversions}; #[test] fn sample_proof() { From bb6bf73d758aa531fa9db77a8128aa34368f6cc7 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sun, 17 Mar 2024 01:44:39 +1000 Subject: [PATCH 069/135] using the same variable and constant names as the paper --- .../ipa_prf/malicious_security/prover.rs | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index 699c79f96..405a8ce83 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -18,26 +18,31 @@ pub struct ProofGenerator { v: Vec, } +/// +/// Distributed Zero Knowledge Proofs algorithm drawn from +/// `https://eprint.iacr.org/2023/909.pdf` +/// impl ProofGenerator where F: PrimeField, { - pub fn compute_proof(self) -> GenericArray, U1>> + #![allow(non_camel_case_types)] + pub fn compute_proof<λ: ArrayLength>(self) -> GenericArray, U1>> where - N: ArrayLength + Add + Sub, - ::Output: Sub, - <::Output as Sub>::Output: ArrayLength, - >::Output: ArrayLength, + λ: ArrayLength + Add + Sub, + <λ as Add>::Output: Sub, + <<λ as Add>::Output as Sub>::Output: ArrayLength, + <λ as Sub>::Output: ArrayLength, { - assert!(self.u.len() % N::USIZE == 0); // We should pad with zeroes eventually + assert!(self.u.len() % λ::USIZE == 0); // We should pad with zeroes eventually - let strip_len = self.u.len() / N::USIZE; + let s = self.u.len() / λ::USIZE; - let denominator = CanonicalLagrangeDenominator::::new(); - let lagrange_table = LagrangeTable::>::Output>::from(denominator); - let extrapolated_points = (0..strip_len).map(|i| { - let p: GenericArray = (0..N::USIZE).map(|j| self.u[i * N::USIZE + j]).collect(); - let q: GenericArray = (0..N::USIZE).map(|j| self.v[i * N::USIZE + j]).collect(); + let denominator = CanonicalLagrangeDenominator::::new(); + let lagrange_table = LagrangeTable::>::Output>::from(denominator); + let extrapolated_points = (0..s).map(|i| { + let p: GenericArray = (0..λ::USIZE).map(|j| self.u[i * λ::USIZE + j]).collect(); + let q: GenericArray = (0..λ::USIZE).map(|j| self.v[i * λ::USIZE + j]).collect(); let p_extrapolated = lagrange_table.eval(&p); let q_extrapolated = lagrange_table.eval(&q); zip( From 661259ccc7d82db75c6404ee7037c26f4718c24f Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sun, 17 Mar 2024 01:50:27 +1000 Subject: [PATCH 070/135] removing an explicit type --- ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index 405a8ce83..dd0263243 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -41,8 +41,8 @@ where let denominator = CanonicalLagrangeDenominator::::new(); let lagrange_table = LagrangeTable::>::Output>::from(denominator); let extrapolated_points = (0..s).map(|i| { - let p: GenericArray = (0..λ::USIZE).map(|j| self.u[i * λ::USIZE + j]).collect(); - let q: GenericArray = (0..λ::USIZE).map(|j| self.v[i * λ::USIZE + j]).collect(); + let p = (0..λ::USIZE).map(|j| self.u[i * λ::USIZE + j]).collect(); + let q = (0..λ::USIZE).map(|j| self.v[i * λ::USIZE + j]).collect(); let p_extrapolated = lagrange_table.eval(&p); let q_extrapolated = lagrange_table.eval(&q); zip( From 92aaa8d1813536ea6b48116cecb166e8f128c9b0 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sun, 17 Mar 2024 13:43:54 +1000 Subject: [PATCH 071/135] Next part of the ZKPs --- .../ipa_prf/malicious_security/lagrange.rs | 67 +++++++++---- .../ipa_prf/malicious_security/prover.rs | 93 ++++++++++++++----- 2 files changed, 119 insertions(+), 41 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index 8c90644fb..b1a4396fe 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -1,4 +1,8 @@ -use std::fmt::Debug; +use std::{ + borrow::Borrow, + fmt::Debug, + iter::{repeat, zip}, +}; use generic_array::{ArrayLength, GenericArray}; use typenum::{Unsigned, U1}; @@ -91,16 +95,40 @@ where N: ArrayLength, M: ArrayLength, { + pub fn print(&self) { + for table_row in &self.table { + println!("{:?}", table_row); + } + } + /// This function uses the `LagrangeTable` to evaluate `polynomial` on the specified output "x coordinates" /// outputs the "y coordinates" such that `(x,y)` lies on `polynomial` - pub fn eval(&self, y_coordinates: &GenericArray) -> GenericArray { + pub fn eval(&self, y_coordinates: I) -> GenericArray + where + I: IntoIterator + Copy, + I::IntoIter: ExactSizeIterator, + J: Borrow, + { + // let y_coordinates = y_coordinates.into_iter(); + // debug_assert_eq!(y_coordinates.len(), N::USIZE); + // y_coordinates + // .enumerate() + // .map(|(i, y_coord)| { + // self.table + // .iter() + // .map(|table_row| table_row[i] * (*y_coord.borrow())) + // .collect::>() + // }) + // .reduce(|vec_a, vec_b| zip(vec_a, vec_b).map(|(a, b)| a + b).collect()) + // .unwrap() + self.table .iter() .map(|table_row| { table_row .iter() - .zip(y_coordinates.iter()) - .fold(F::ZERO, |acc, (&base, &y)| acc + base * y) + .zip(y_coordinates.into_iter()) + .fold(F::ZERO, |acc, (&base, y)| acc + base * (*y.borrow())) }) .collect() } @@ -160,7 +188,7 @@ where #[cfg(all(test, unit_test))] mod test { - use std::fmt::Debug; + use std::{borrow::Borrow, fmt::Debug}; use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; use proptest::{prelude::*, proptest}; @@ -186,27 +214,31 @@ mod test { N: ArrayLength, { fn gen_y_values_of_canonical_points(self) -> GenericArray { - let canonical_points: GenericArray = - GenericArray::generate(|i| F::try_from(u128::try_from(i).unwrap()).unwrap()); - self.eval(&canonical_points) + // Sadly, we cannot just use the range (0..N::U128) because it does not implement ExactSizeIterator + let canonical_points = + (0..N::USIZE).map(|i| F::try_from(u128::try_from(i).unwrap()).unwrap()); + self.eval(canonical_points) } /// test helper function that evaluates a polynomial in monomial form, i.e. `sum_i c_i x^i` on points `x_output` /// where `c_0` to `c_N` are stored in `polynomial` - fn eval(&self, x_output: &GenericArray) -> GenericArray + fn eval(&self, x_output: I) -> GenericArray where + I: IntoIterator, + I::IntoIter: ExactSizeIterator, + J: Borrow, M: ArrayLength, { x_output - .iter() - .map(|&x| { + .into_iter() + .map(|x| { // monomial base, i.e. `x^k` // evaluate p via `sum_k coefficient_k * x^k` let (_, y) = self .coefficients .iter() .fold((F::ONE, F::ZERO), |(base, y), &coef| { - (base * x, y + coef * base) + (base * (*x.borrow()), y + coef * base) }); y }) @@ -221,9 +253,7 @@ mod test { let polynomial_monomial_form = MonomialFormPolynomial { coefficients: GenericArray::::from_array(input_points), }; - let output_expected = polynomial_monomial_form.eval( - &GenericArray::::from_array([output_point; 1]), - ); + let output_expected = polynomial_monomial_form.eval(&[output_point]); let denominator = CanonicalLagrangeDenominator::::new(); // generate table using new let lagrange_table = LagrangeTable::::new(&denominator, &output_point); @@ -244,10 +274,9 @@ mod test { coefficients: GenericArray::::from_array(input_points), }; // the canonical x coordinates are 0..7, the outputs use coordinates 8..15: - let x_coordinates_output = GenericArray::<_, U7>::generate(|i| { - TestField::try_from(u128::try_from(i).unwrap() + 8).unwrap() - }); - let output_expected = polynomial_monomial_form.eval(&x_coordinates_output); + let x_coordinates_output = + (0..7).map(|i| TestField::try_from(u128::try_from(i).unwrap() + 8).unwrap()); + let output_expected = polynomial_monomial_form.eval(x_coordinates_output); let denominator = CanonicalLagrangeDenominator::::new(); // generate table using from let lagrange_table = LagrangeTable::::from(denominator); diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index dd0263243..cef5665d6 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -13,6 +13,11 @@ use crate::{ }, }; +pub struct ZeroKnowledgeProof { + g: GenericArray, + r: F, +} + pub struct ProofGenerator { u: Vec, v: Vec, @@ -27,7 +32,13 @@ where F: PrimeField, { #![allow(non_camel_case_types)] - pub fn compute_proof<λ: ArrayLength>(self) -> GenericArray, U1>> + pub fn compute_proof<λ: ArrayLength>( + self, + r: F, + ) -> ( + ZeroKnowledgeProof, U1>>, + ProofGenerator, + ) where λ: ArrayLength + Add + Sub, <λ as Add>::Output: Sub, @@ -38,23 +49,42 @@ where let s = self.u.len() / λ::USIZE; + if s <= 1 { + panic!("When the output is this small, you should call compute_final_proof"); + } + + let mut next_proof_generator = ProofGenerator { + u: Vec::::with_capacity(s), + v: Vec::::with_capacity(s), + }; + let denominator = CanonicalLagrangeDenominator::::new(); + let lagrange_table_r = LagrangeTable::::new(&denominator, &r); + lagrange_table_r.print(); let lagrange_table = LagrangeTable::>::Output>::from(denominator); let extrapolated_points = (0..s).map(|i| { - let p = (0..λ::USIZE).map(|j| self.u[i * λ::USIZE + j]).collect(); - let q = (0..λ::USIZE).map(|j| self.v[i * λ::USIZE + j]).collect(); - let p_extrapolated = lagrange_table.eval(&p); - let q_extrapolated = lagrange_table.eval(&q); - zip( - p.into_iter().chain(p_extrapolated), - q.into_iter().chain(q_extrapolated), - ) - .map(|(a, b)| a * b) - .collect::>() + let start = i * λ::USIZE; + let end = start + λ::USIZE; + let p = &self.u[start..end]; + let q = &self.v[start..end]; + let p_extrapolated = lagrange_table.eval(p); + let q_extrapolated = lagrange_table.eval(q); + let p_r = lagrange_table_r.eval(p)[0]; + let q_r = lagrange_table_r.eval(q)[0]; + next_proof_generator.u.push(p_r); + next_proof_generator.v.push(q_r); + zip(p.into_iter(), q.into_iter()) + .map(|(a, b)| *a * *b) + .chain(zip(p_extrapolated, q_extrapolated).map(|(a, b)| a * b)) + .collect::>() }); - extrapolated_points - .reduce(|acc, pts| zip(acc, pts).map(|(a, b)| a + b).collect()) - .unwrap() + let proof = ZeroKnowledgeProof { + g: extrapolated_points + .reduce(|acc, pts| zip(acc, pts).map(|(a, b)| a + b).collect()) + .unwrap(), + r, + }; + (proof, next_proof_generator) } } @@ -68,22 +98,41 @@ mod test { #[test] fn sample_proof() { const U: [u128; 32] = [ - 0, 0, 1, 15, 0, 0, 0, 15, 2, 30, 30, 16, 29, 1, 1, 15, 0, 0, 0, 15, 0, 0, 0, 15, 2, 30, - 30, 16, 0, 0, 1, 15, + 0, 30, 0, 16, 0, 1, 0, 15, 0, 0, 0, 16, 0, 30, 0, 16, 29, 1, 1, 15, 0, 0, 1, 15, 2, 30, + 30, 16, 0, 0, 30, 16, ]; const V: [u128; 32] = [ - 30, 30, 30, 30, 0, 1, 0, 1, 0, 0, 0, 30, 0, 30, 0, 30, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 30, 0, 0, 30, 30, + 0, 0, 0, 30, 0, 0, 0, 1, 30, 30, 30, 30, 0, 0, 30, 30, 0, 30, 0, 30, 0, 0, 0, 1, 0, 0, + 1, 1, 0, 0, 1, 1, ]; - const EXPECTED: [u128; 7] = [0, 30, 29, 30, 3, 22, 6]; + const EXPECTED: [u128; 7] = [0, 30, 29, 30, 5, 28, 13]; + const R1: u128 = 22; + const EXPECTED_NEXT_U: [u128; 8] = [0, 0, 26, 0, 7, 18, 24, 13]; + const EXPECTED_NEXT_V: [u128; 8] = [10, 21, 30, 28, 15, 21, 3, 3]; let pg: ProofGenerator = ProofGenerator { u: U.into_iter().map(|x| Fp31::try_from(x).unwrap()).collect(), v: V.into_iter().map(|x| Fp31::try_from(x).unwrap()).collect(), }; - let proof = pg.compute_proof::(); + let (proof, next_proof_generator) = pg.compute_proof::(Fp31::try_from(R1).unwrap()); + assert_eq!( + proof.g.into_iter().map(|x| x.as_u128()).collect::>(), + EXPECTED, + ); + assert_eq!( + next_proof_generator + .u + .into_iter() + .map(|x| x.as_u128()) + .collect::>(), + EXPECTED_NEXT_U, + ); assert_eq!( - proof.into_iter().map(|x| x.as_u128()).collect::>(), - EXPECTED + next_proof_generator + .v + .into_iter() + .map(|x| x.as_u128()) + .collect::>(), + EXPECTED_NEXT_V, ); } } From 5765966649dda03ebc73c22856b05dd13bc12086 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sun, 17 Mar 2024 13:50:42 +1000 Subject: [PATCH 072/135] removing commented out code and print statements --- .../ipa_prf/malicious_security/lagrange.rs | 19 +------------------ .../ipa_prf/malicious_security/prover.rs | 1 - 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index b1a4396fe..353541a11 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -95,12 +95,6 @@ where N: ArrayLength, M: ArrayLength, { - pub fn print(&self) { - for table_row in &self.table { - println!("{:?}", table_row); - } - } - /// This function uses the `LagrangeTable` to evaluate `polynomial` on the specified output "x coordinates" /// outputs the "y coordinates" such that `(x,y)` lies on `polynomial` pub fn eval(&self, y_coordinates: I) -> GenericArray @@ -109,18 +103,7 @@ where I::IntoIter: ExactSizeIterator, J: Borrow, { - // let y_coordinates = y_coordinates.into_iter(); - // debug_assert_eq!(y_coordinates.len(), N::USIZE); - // y_coordinates - // .enumerate() - // .map(|(i, y_coord)| { - // self.table - // .iter() - // .map(|table_row| table_row[i] * (*y_coord.borrow())) - // .collect::>() - // }) - // .reduce(|vec_a, vec_b| zip(vec_a, vec_b).map(|(a, b)| a + b).collect()) - // .unwrap() + debug_assert_eq!(y_coordinates.into_iter().len(), N::USIZE); self.table .iter() diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index cef5665d6..cee049621 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -60,7 +60,6 @@ where let denominator = CanonicalLagrangeDenominator::::new(); let lagrange_table_r = LagrangeTable::::new(&denominator, &r); - lagrange_table_r.print(); let lagrange_table = LagrangeTable::>::Output>::from(denominator); let extrapolated_points = (0..s).map(|i| { let start = i * λ::USIZE; From 510cd9dd9df7408611be4058cd38627228e16e5c Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sun, 17 Mar 2024 16:09:44 +1000 Subject: [PATCH 073/135] a few suggestions from martin --- .../ipa_prf/malicious_security/lagrange.rs | 11 ++++--- .../ipa_prf/malicious_security/prover.rs | 33 ++++++++++++------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index 353541a11..a779caf2d 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -1,7 +1,6 @@ use std::{ borrow::Borrow, fmt::Debug, - iter::{repeat, zip}, }; use generic_array::{ArrayLength, GenericArray}; @@ -95,8 +94,10 @@ where N: ArrayLength, M: ArrayLength, { - /// This function uses the `LagrangeTable` to evaluate `polynomial` on the specified output "x coordinates" - /// outputs the "y coordinates" such that `(x,y)` lies on `polynomial` + /// This function uses the `LagrangeTable` to evaluate `polynomial` on the _output_ "x coordinates" + /// that were used to generate this table. + /// It is assumed that the `y_coordinates` provided to this function correspond the values of the _input_ "x coordinates" + /// that were used to generate this table. pub fn eval(&self, y_coordinates: I) -> GenericArray where I: IntoIterator + Copy, @@ -110,7 +111,7 @@ where .map(|table_row| { table_row .iter() - .zip(y_coordinates.into_iter()) + .zip(y_coordinates) .fold(F::ZERO, |acc, (&base, y)| acc + base * (*y.borrow())) }) .collect() @@ -173,7 +174,7 @@ where mod test { use std::{borrow::Borrow, fmt::Debug}; - use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; + use generic_array::{ArrayLength, GenericArray}; use proptest::{prelude::*, proptest}; use typenum::{U1, U32, U7, U8}; diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index cee049621..56ad818e6 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -1,5 +1,5 @@ use std::{ - iter::zip, + iter::{zip, once}, ops::{Add, Sub}, }; @@ -27,13 +27,21 @@ pub struct ProofGenerator { /// Distributed Zero Knowledge Proofs algorithm drawn from /// `https://eprint.iacr.org/2023/909.pdf` /// +#[allow(non_camel_case_types)] impl ProofGenerator where F: PrimeField, { - #![allow(non_camel_case_types)] + pub fn new(u: Vec, v: Vec) -> Self { + debug_assert_eq!(u.len(), v.len(), "u and v must be of equal length"); + Self { + u, + v, + } + } + pub fn compute_proof<λ: ArrayLength>( - self, + &self, r: F, ) -> ( ZeroKnowledgeProof, U1>>, @@ -45,13 +53,11 @@ where <<λ as Add>::Output as Sub>::Output: ArrayLength, <λ as Sub>::Output: ArrayLength, { - assert!(self.u.len() % λ::USIZE == 0); // We should pad with zeroes eventually + debug_assert_eq!(self.u.len() % λ::USIZE, 0); // We should pad with zeroes eventually let s = self.u.len() / λ::USIZE; - if s <= 1 { - panic!("When the output is this small, you should call compute_final_proof"); - } + assert!(s > 1, "When the output is this small, you should call `compute_final_proof`"); let mut next_proof_generator = ProofGenerator { u: Vec::::with_capacity(s), @@ -72,7 +78,10 @@ where let q_r = lagrange_table_r.eval(q)[0]; next_proof_generator.u.push(p_r); next_proof_generator.v.push(q_r); - zip(p.into_iter(), q.into_iter()) + // p.into_iter() has elements that are &F + // p_extrapolated.into_iter() has elements that are F + // So these iterators cannot be chained. + zip(p, q) .map(|(a, b)| *a * *b) .chain(zip(p_extrapolated, q_extrapolated).map(|(a, b)| a * b)) .collect::>() @@ -108,10 +117,10 @@ mod test { const R1: u128 = 22; const EXPECTED_NEXT_U: [u128; 8] = [0, 0, 26, 0, 7, 18, 24, 13]; const EXPECTED_NEXT_V: [u128; 8] = [10, 21, 30, 28, 15, 21, 3, 3]; - let pg: ProofGenerator = ProofGenerator { - u: U.into_iter().map(|x| Fp31::try_from(x).unwrap()).collect(), - v: V.into_iter().map(|x| Fp31::try_from(x).unwrap()).collect(), - }; + let pg: ProofGenerator = ProofGenerator::new( + U.into_iter().map(|x| Fp31::try_from(x).unwrap()).collect(), + V.into_iter().map(|x| Fp31::try_from(x).unwrap()).collect(), + ); let (proof, next_proof_generator) = pg.compute_proof::(Fp31::try_from(R1).unwrap()); assert_eq!( proof.g.into_iter().map(|x| x.as_u128()).collect::>(), From 4fe3d214fc5c0736815cb9bcc7019658e2e50d84 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sun, 17 Mar 2024 16:15:07 +1000 Subject: [PATCH 074/135] removing unused field r --- .../ipa_prf/malicious_security/lagrange.rs | 7 ++----- .../protocol/ipa_prf/malicious_security/prover.rs | 14 ++++++-------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs index a779caf2d..59e0f9432 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/lagrange.rs @@ -1,7 +1,4 @@ -use std::{ - borrow::Borrow, - fmt::Debug, -}; +use std::{borrow::Borrow, fmt::Debug}; use generic_array::{ArrayLength, GenericArray}; use typenum::{Unsigned, U1}; @@ -95,7 +92,7 @@ where M: ArrayLength, { /// This function uses the `LagrangeTable` to evaluate `polynomial` on the _output_ "x coordinates" - /// that were used to generate this table. + /// that were used to generate this table. /// It is assumed that the `y_coordinates` provided to this function correspond the values of the _input_ "x coordinates" /// that were used to generate this table. pub fn eval(&self, y_coordinates: I) -> GenericArray diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index 56ad818e6..19e3edc66 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -1,5 +1,5 @@ use std::{ - iter::{zip, once}, + iter::zip, ops::{Add, Sub}, }; @@ -15,7 +15,6 @@ use crate::{ pub struct ZeroKnowledgeProof { g: GenericArray, - r: F, } pub struct ProofGenerator { @@ -34,10 +33,7 @@ where { pub fn new(u: Vec, v: Vec) -> Self { debug_assert_eq!(u.len(), v.len(), "u and v must be of equal length"); - Self { - u, - v, - } + Self { u, v } } pub fn compute_proof<λ: ArrayLength>( @@ -57,7 +53,10 @@ where let s = self.u.len() / λ::USIZE; - assert!(s > 1, "When the output is this small, you should call `compute_final_proof`"); + assert!( + s > 1, + "When the output is this small, you should call `compute_final_proof`" + ); let mut next_proof_generator = ProofGenerator { u: Vec::::with_capacity(s), @@ -90,7 +89,6 @@ where g: extrapolated_points .reduce(|acc, pts| zip(acc, pts).map(|(a, b)| a + b).collect()) .unwrap(), - r, }; (proof, next_proof_generator) } From 7bc86411572edca36d8b98f908f21096f3e42534 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sun, 17 Mar 2024 16:36:24 +1000 Subject: [PATCH 075/135] Clippy --- ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index 19e3edc66..bae3a826f 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -22,6 +22,8 @@ pub struct ProofGenerator { v: Vec, } +type TwoNMinusOne = Diff, U1>; + /// /// Distributed Zero Knowledge Proofs algorithm drawn from /// `https://eprint.iacr.org/2023/909.pdf` @@ -40,7 +42,7 @@ where &self, r: F, ) -> ( - ZeroKnowledgeProof, U1>>, + ZeroKnowledgeProof>, ProofGenerator, ) where From 1ba4fda65777a274f9f0dce22337a69bca57043b Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Sun, 17 Mar 2024 16:51:19 +1000 Subject: [PATCH 076/135] Formatting --- ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index bae3a826f..9536b5349 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -41,10 +41,7 @@ where pub fn compute_proof<λ: ArrayLength>( &self, r: F, - ) -> ( - ZeroKnowledgeProof>, - ProofGenerator, - ) + ) -> (ZeroKnowledgeProof>, ProofGenerator) where λ: ArrayLength + Add + Sub, <λ as Add>::Output: Sub, From 065862903ed9ccbeee395478f5d02d2e49b55c48 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Mon, 18 Mar 2024 15:02:51 +1000 Subject: [PATCH 077/135] Added the different logic for the last ZKP --- .../ipa_prf/malicious_security/prover.rs | 105 ++++++++++++++---- 1 file changed, 81 insertions(+), 24 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index 9536b5349..02649c3bd 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -23,6 +23,7 @@ pub struct ProofGenerator { } type TwoNMinusOne = Diff, U1>; +type TwoNPlusOne = Sum, U1>; /// /// Distributed Zero Knowledge Proofs algorithm drawn from @@ -91,53 +92,109 @@ where }; (proof, next_proof_generator) } + + pub fn compute_final_proof<λ: ArrayLength>( + &self, + p_0: F, + q_0: F, + ) -> ZeroKnowledgeProof> + where + λ: ArrayLength + Add + Add, + <λ as Add>::Output: Add, + <<λ as Add>::Output as Add>::Output: ArrayLength, + <λ as Add>::Output: ArrayLength, + { + assert_eq!(self.u.len(), λ::USIZE); // We should pad with zeroes eventually + + let denominator = CanonicalLagrangeDenominator::>::new(); + //let lagrange_table_r = LagrangeTable::::new(&denominator, &r); + let lagrange_table = LagrangeTable::, λ>::from(denominator); + + let mut p = vec![p_0]; + p.extend_from_slice(&self.u); + let mut q = vec![q_0]; + q.extend_from_slice(&self.v); + let p_extrapolated = lagrange_table.eval(&p); + let q_extrapolated = lagrange_table.eval(&q); + + // let p_r = lagrange_table_r.eval(&p)[0]; + // let q_r = lagrange_table_r.eval(&q)[0]; + + ZeroKnowledgeProof { + g: zip(p, q) + .map(|(a, b)| a * b) + .chain(zip(p_extrapolated, q_extrapolated).map(|(a, b)| a * b)) + .collect(), + } + } } #[cfg(all(test, unit_test))] mod test { - use typenum::U4; + use typenum::{U2, U4}; use super::ProofGenerator; use crate::ff::{Fp31, U128Conversions}; #[test] fn sample_proof() { - const U: [u128; 32] = [ + const U_1: [u128; 32] = [ 0, 30, 0, 16, 0, 1, 0, 15, 0, 0, 0, 16, 0, 30, 0, 16, 29, 1, 1, 15, 0, 0, 1, 15, 2, 30, 30, 16, 0, 0, 30, 16, ]; - const V: [u128; 32] = [ + const V_1: [u128; 32] = [ 0, 0, 0, 30, 0, 0, 0, 1, 30, 30, 30, 30, 0, 0, 30, 30, 0, 30, 0, 30, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, ]; - const EXPECTED: [u128; 7] = [0, 30, 29, 30, 5, 28, 13]; - const R1: u128 = 22; - const EXPECTED_NEXT_U: [u128; 8] = [0, 0, 26, 0, 7, 18, 24, 13]; - const EXPECTED_NEXT_V: [u128; 8] = [10, 21, 30, 28, 15, 21, 3, 3]; + const EXPECTED_1: [u128; 7] = [0, 30, 29, 30, 5, 28, 13]; + const R_1: u128 = 22; + const U_2: [u128; 8] = [0, 0, 26, 0, 7, 18, 24, 13]; + const V_2: [u128; 8] = [10, 21, 30, 28, 15, 21, 3, 3]; + + const EXPECTED_2: [u128; 7] = [12, 6, 15, 8, 29, 30, 6]; + const R_2: u128 = 17; + const U_3: [u128; 2] = [3, 3]; + const V_3: [u128; 2] = [5, 24]; + + const EXPECTED_3: [u128; 5] = [12, 15, 10, 14, 17]; + const P_RANDOM_WEIGHT: u128 = 12; + const Q_RANDOM_WEIGHT: u128 = 1; + let pg: ProofGenerator = ProofGenerator::new( - U.into_iter().map(|x| Fp31::try_from(x).unwrap()).collect(), - V.into_iter().map(|x| Fp31::try_from(x).unwrap()).collect(), + U_1.into_iter() + .map(|x| Fp31::try_from(x).unwrap()) + .collect(), + V_1.into_iter() + .map(|x| Fp31::try_from(x).unwrap()) + .collect(), ); - let (proof, next_proof_generator) = pg.compute_proof::(Fp31::try_from(R1).unwrap()); + + // first iteration + let (proof, pg_2) = pg.compute_proof::(Fp31::try_from(R_1).unwrap()); assert_eq!( - proof.g.into_iter().map(|x| x.as_u128()).collect::>(), - EXPECTED, + proof.g.iter().map(Fp31::as_u128).collect::>(), + EXPECTED_1, ); + assert_eq!(pg_2.u.iter().map(Fp31::as_u128).collect::>(), U_2,); + assert_eq!(pg_2.v.iter().map(Fp31::as_u128).collect::>(), V_2,); + + // next iteration + let (proof_2, pg_3) = pg_2.compute_proof::(Fp31::try_from(R_2).unwrap()); assert_eq!( - next_proof_generator - .u - .into_iter() - .map(|x| x.as_u128()) - .collect::>(), - EXPECTED_NEXT_U, + proof_2.g.iter().map(Fp31::as_u128).collect::>(), + EXPECTED_2, + ); + assert_eq!(pg_3.u.iter().map(Fp31::as_u128).collect::>(), U_3,); + assert_eq!(pg_3.v.iter().map(Fp31::as_u128).collect::>(), V_3,); + + // final iteration + let proof_3 = pg_3.compute_final_proof::( + Fp31::try_from(P_RANDOM_WEIGHT).unwrap(), + Fp31::try_from(Q_RANDOM_WEIGHT).unwrap(), ); assert_eq!( - next_proof_generator - .v - .into_iter() - .map(|x| x.as_u128()) - .collect::>(), - EXPECTED_NEXT_V, + proof_3.g.iter().map(Fp31::as_u128).collect::>(), + EXPECTED_3, ); } } From 94e5da70f79e927995700e686780b5b435b48dde Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Mon, 18 Mar 2024 15:14:02 +1000 Subject: [PATCH 078/135] a few bits of cleanup --- .../protocol/ipa_prf/malicious_security/prover.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index 02649c3bd..2147908b7 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -106,8 +106,8 @@ where { assert_eq!(self.u.len(), λ::USIZE); // We should pad with zeroes eventually + // We need a table of size `λ + 1` since we add a random point at x=0 let denominator = CanonicalLagrangeDenominator::>::new(); - //let lagrange_table_r = LagrangeTable::::new(&denominator, &r); let lagrange_table = LagrangeTable::, λ>::from(denominator); let mut p = vec![p_0]; @@ -117,14 +117,13 @@ where let p_extrapolated = lagrange_table.eval(&p); let q_extrapolated = lagrange_table.eval(&q); - // let p_r = lagrange_table_r.eval(&p)[0]; - // let q_r = lagrange_table_r.eval(&q)[0]; - ZeroKnowledgeProof { - g: zip(p, q) - .map(|(a, b)| a * b) - .chain(zip(p_extrapolated, q_extrapolated).map(|(a, b)| a * b)) - .collect(), + g: zip( + p.into_iter().chain(p_extrapolated), + q.into_iter().chain(q_extrapolated), + ) + .map(|(a, b)| a * b) + .collect(), } } } From c5310159f4f635f11602dfed8d7a10677e379278 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Sun, 17 Mar 2024 23:07:07 -0700 Subject: [PATCH 079/135] First building blocks for Sharding API: ShardIndex and TransportIdentity (#970) * Introduce ShardIndex * Introduce TransportIdentity Refactor `RoleResolvingTransport` to make the use of it nicer * Make InMemoryNetwork generic * Remove unused code * Rename preceeding to iter * ShardIndex -> ShardId * Address feedback --- ipa-core/src/error.rs | 8 +- .../src/helpers/buffers/unordered_receiver.rs | 4 +- ipa-core/src/helpers/error.rs | 72 +---------- ipa-core/src/helpers/gateway/mod.rs | 40 ++++-- ipa-core/src/helpers/gateway/receive.rs | 25 ++-- ipa-core/src/helpers/gateway/send.rs | 24 ++-- .../src/helpers/gateway/stall_detection.rs | 24 ++-- ipa-core/src/helpers/gateway/transport.rs | 102 +++++++++------ ipa-core/src/helpers/mod.rs | 26 ++-- ipa-core/src/helpers/prss_protocol.rs | 4 +- .../src/helpers/transport/in_memory/mod.rs | 54 ++++---- .../helpers/transport/in_memory/transport.rs | 90 ++++++++------ ipa-core/src/helpers/transport/mod.rs | 28 +++-- ipa-core/src/helpers/transport/receive.rs | 42 ++++--- .../helpers/transport/stream/collection.rs | 18 +-- ipa-core/src/lib.rs | 1 + ipa-core/src/net/transport.rs | 6 +- ipa-core/src/sharding.rs | 116 ++++++++++++++++++ ipa-core/src/test_fixture/app.rs | 6 +- ipa-core/src/test_fixture/world.rs | 6 +- 20 files changed, 421 insertions(+), 275 deletions(-) create mode 100644 ipa-core/src/sharding.rs diff --git a/ipa-core/src/error.rs b/ipa-core/src/error.rs index 5fb22dfca..0bd38cda2 100644 --- a/ipa-core/src/error.rs +++ b/ipa-core/src/error.rs @@ -6,7 +6,7 @@ use std::{ use thiserror::Error; -use crate::{report::InvalidReportError, task::JoinError}; +use crate::{helpers::Role, report::InvalidReportError, sharding::ShardIndex, task::JoinError}; /// An error raised by the IPA protocol. /// @@ -52,8 +52,10 @@ pub enum Error { #[error("failed to parse json: {0}")] #[cfg(feature = "enable-serde")] Serde(#[from] serde_json::Error), - #[error("Infrastructure error: {0}")] - InfraError(#[from] crate::helpers::Error), + #[error("MPC Infrastructure error: {0}")] + MpcInfraError(#[from] crate::helpers::Error), + #[error("Shard Infrastructure error: {0}")] + ShardInfraError(#[from] crate::helpers::Error), #[error("Value truncation error: {0}")] FieldValueTruncation(String), #[error("Invalid query parameter: {0}")] diff --git a/ipa-core/src/helpers/buffers/unordered_receiver.rs b/ipa-core/src/helpers/buffers/unordered_receiver.rs index 4a236a59d..f9ba225bb 100644 --- a/ipa-core/src/helpers/buffers/unordered_receiver.rs +++ b/ipa-core/src/helpers/buffers/unordered_receiver.rs @@ -11,7 +11,7 @@ use generic_array::GenericArray; use typenum::Unsigned; use crate::{ - helpers::{Error, Message}, + helpers::{Error, Message, Role}, protocol::RecordId, sync::{Arc, Mutex}, }; @@ -160,7 +160,7 @@ pub enum ReceiveError { #[error("Error deserializing {0:?} record: {1}")] DeserializationError(RecordId, #[source] M::DeserializationError), #[error(transparent)] - InfraError(#[from] Error), + InfraError(#[from] Error), } impl OperatingState diff --git a/ipa-core/src/helpers/error.rs b/ipa-core/src/helpers/error.rs index d73c38359..9f4fd2156 100644 --- a/ipa-core/src/helpers/error.rs +++ b/ipa-core/src/helpers/error.rs @@ -1,35 +1,17 @@ use thiserror::Error; -use tokio::sync::mpsc::error::SendError; use crate::{ error::BoxError, - helpers::{ChannelId, HelperIdentity, Message, Role, TotalRecords}, - protocol::{step::Gate, RecordId}, + helpers::{ChannelId, TotalRecords, TransportIdentity}, + protocol::RecordId, }; /// An error raised by the IPA supporting infrastructure. #[derive(Error, Debug)] -pub enum Error { - #[error("An error occurred while sending data to {channel:?}: {inner}")] - SendError { - channel: ChannelId, - - #[source] - inner: BoxError, - }, - #[error("An error occurred while sending data over a reordering channel: {inner}")] - OrderedChannelError { - #[source] - inner: BoxError, - }, - #[error("An error occurred while sending data to unknown helper: {inner}")] - PollSendError { - #[source] - inner: BoxError, - }, +pub enum Error { #[error("An error occurred while receiving data from {source:?}/{step}: {inner}")] ReceiveError { - source: Role, + source: I, step: String, #[source] inner: BoxError, @@ -39,54 +21,10 @@ pub enum Error { // TODO(mt): add more fields, like step and role. record_id: RecordId, }, - #[error("An error occurred while serializing or deserializing data for {record_id:?} and step {step}: {inner}")] - SerializationError { - record_id: RecordId, - step: String, - #[source] - inner: BoxError, - }, - #[error("Encountered unknown identity {0:?}")] - UnknownIdentity(HelperIdentity), #[error("record ID {record_id:?} is out of range for {channel_id:?} (expected {total_records:?} records)")] TooManyRecords { record_id: RecordId, - channel_id: ChannelId, + channel_id: ChannelId, total_records: TotalRecords, }, } - -impl Error { - pub fn send_error>>( - channel: ChannelId, - inner: E, - ) -> Error { - Self::SendError { - channel, - inner: inner.into(), - } - } - - #[must_use] - pub fn serialization_error>( - record_id: RecordId, - gate: &Gate, - inner: E, - ) -> Error { - Self::SerializationError { - record_id, - step: String::from(gate.as_ref()), - inner: inner.into(), - } - } -} - -impl From> for Error { - fn from(_: SendError<(usize, M)>) -> Self { - Self::OrderedChannelError { - inner: "ordered string".into(), - } - } -} - -pub type Result = std::result::Result; diff --git a/ipa-core/src/helpers/gateway/mod.rs b/ipa-core/src/helpers/gateway/mod.rs index 018431d62..a9449cd99 100644 --- a/ipa-core/src/helpers/gateway/mod.rs +++ b/ipa-core/src/helpers/gateway/mod.rs @@ -15,10 +15,12 @@ pub(super) use stall_detection::InstrumentedGateway; use crate::{ helpers::{ + buffers::UnorderedReceiver, gateway::{ receive::GatewayReceivers, send::GatewaySenders, transport::RoleResolvingTransport, }, - ChannelId, Message, Role, RoleAssignment, TotalRecords, Transport, + HelperChannelId, HelperIdentity, Message, Role, RoleAssignment, RouteId, TotalRecords, + Transport, }, protocol::QueryId, }; @@ -28,17 +30,18 @@ use crate::{ /// To avoid proliferation of type parameters, most code references this concrete type alias, rather /// than a type parameter `T: Transport`. #[cfg(feature = "in-memory-infra")] -pub type TransportImpl = super::transport::InMemoryTransport; +pub type TransportImpl = super::transport::InMemoryTransport; #[cfg(feature = "real-world-infra")] pub type TransportImpl = crate::sync::Arc; -pub type TransportError = ::Error; +pub type TransportError = >::Error; /// Gateway into IPA Network infrastructure. It allows helpers send and receive messages. pub struct Gateway { config: GatewayConfig, transport: RoleResolvingTransport, + query_id: QueryId, #[cfg(feature = "stall-detection")] inner: crate::sync::Arc, #[cfg(not(feature = "stall-detection"))] @@ -74,12 +77,11 @@ impl Gateway { ) -> Self { #[allow(clippy::useless_conversion)] // not useless in stall-detection build Self { + query_id, config, transport: RoleResolvingTransport { - query_id, roles, inner: transport, - config, }, inner: State::default().into(), } @@ -87,7 +89,7 @@ impl Gateway { #[must_use] pub fn role(&self) -> Role { - self.transport.role() + self.transport.identity() } #[must_use] @@ -101,7 +103,7 @@ impl Gateway { #[must_use] pub fn get_sender( &self, - channel_id: &ChannelId, + channel_id: &HelperChannelId, total_records: TotalRecords, ) -> send::SendingEnd { let (tx, maybe_stream) = self.inner.senders.get_or_create::( @@ -113,10 +115,15 @@ impl Gateway { tokio::spawn({ let channel_id = channel_id.clone(); let transport = self.transport.clone(); + let query_id = self.query_id; async move { // TODO(651): In the HTTP case we probably need more robust error handling here. transport - .send(&channel_id, stream) + .send( + channel_id.peer, + (RouteId::Records, query_id, channel_id.gate), + stream, + ) .await .expect("{channel_id:?} receiving end should be accepted by transport"); } @@ -127,12 +134,21 @@ impl Gateway { } #[must_use] - pub fn get_receiver(&self, channel_id: &ChannelId) -> receive::ReceivingEnd { + pub fn get_receiver( + &self, + channel_id: &HelperChannelId, + ) -> receive::ReceivingEnd { receive::ReceivingEnd::new( channel_id.clone(), - self.inner - .receivers - .get_or_create(channel_id, || self.transport.receive(channel_id)), + self.inner.receivers.get_or_create(channel_id, || { + UnorderedReceiver::new( + Box::pin( + self.transport + .receive(channel_id.peer, (self.query_id, channel_id.gate.clone())), + ), + self.config.active_work(), + ) + }), ) } } diff --git a/ipa-core/src/helpers/gateway/receive.rs b/ipa-core/src/helpers/gateway/receive.rs index 0b2686ff1..6326cf5c3 100644 --- a/ipa-core/src/helpers/gateway/receive.rs +++ b/ipa-core/src/helpers/gateway/receive.rs @@ -4,13 +4,16 @@ use dashmap::{mapref::entry::Entry, DashMap}; use futures::Stream; use crate::{ - helpers::{buffers::UnorderedReceiver, ChannelId, Error, Message, Transport, TransportImpl}, + helpers::{ + buffers::UnorderedReceiver, gateway::transport::RoleResolvingTransport, Error, + HelperChannelId, Message, Role, Transport, + }, protocol::RecordId, }; -/// Receiving end end of the gateway channel. +/// Receiving end of the gateway channel. pub struct ReceivingEnd { - channel_id: ChannelId, + channel_id: HelperChannelId, unordered_rx: UR, _phantom: PhantomData, } @@ -18,16 +21,16 @@ pub struct ReceivingEnd { /// Receiving channels, indexed by (role, step). #[derive(Default)] pub(super) struct GatewayReceivers { - pub(super) inner: DashMap, + pub(super) inner: DashMap, } pub(super) type UR = UnorderedReceiver< - ::RecordsStream, - <::RecordsStream as Stream>::Item, + >::RecordsStream, + <>::RecordsStream as Stream>::Item, >; impl ReceivingEnd { - pub(super) fn new(channel_id: ChannelId, rx: UR) -> Self { + pub(super) fn new(channel_id: HelperChannelId, rx: UR) -> Self { Self { channel_id, unordered_rx: rx, @@ -44,13 +47,13 @@ impl ReceivingEnd { /// ## Panics /// This will panic if message size does not fit into 8 bytes and it somehow got serialized /// and sent to this helper. - #[tracing::instrument(level = "trace", "receive", skip_all, fields(i = %record_id, from = ?self.channel_id.role, gate = ?self.channel_id.gate.as_ref()))] - pub async fn receive(&self, record_id: RecordId) -> Result { + #[tracing::instrument(level = "trace", "receive", skip_all, fields(i = %record_id, from = ?self.channel_id.peer, gate = ?self.channel_id.gate.as_ref()))] + pub async fn receive(&self, record_id: RecordId) -> Result> { self.unordered_rx .recv::(record_id) .await .map_err(|e| Error::ReceiveError { - source: self.channel_id.role, + source: self.channel_id.peer, step: self.channel_id.gate.to_string(), inner: Box::new(e), }) @@ -58,7 +61,7 @@ impl ReceivingEnd { } impl GatewayReceivers { - pub fn get_or_create UR>(&self, channel_id: &ChannelId, ctr: F) -> UR { + pub fn get_or_create UR>(&self, channel_id: &HelperChannelId, ctr: F) -> UR { // TODO: raw entry API if it becomes available to avoid cloning the key match self.inner.entry(channel_id.clone()) { Entry::Occupied(entry) => entry.get().clone(), diff --git a/ipa-core/src/helpers/gateway/send.rs b/ipa-core/src/helpers/gateway/send.rs index 00d8de096..473deb486 100644 --- a/ipa-core/src/helpers/gateway/send.rs +++ b/ipa-core/src/helpers/gateway/send.rs @@ -11,7 +11,7 @@ use futures::Stream; use typenum::Unsigned; use crate::{ - helpers::{buffers::OrderingSender, ChannelId, Error, Message, Role, TotalRecords}, + helpers::{buffers::OrderingSender, Error, HelperChannelId, Message, Role, TotalRecords}, protocol::RecordId, sync::Arc, telemetry::{ @@ -23,7 +23,7 @@ use crate::{ /// Sending end of the gateway channel. pub struct SendingEnd { sender_role: Role, - channel_id: ChannelId, + channel_id: HelperChannelId, inner: Arc, _phantom: PhantomData, } @@ -31,11 +31,11 @@ pub struct SendingEnd { /// Sending channels, indexed by (role, step). #[derive(Default)] pub(super) struct GatewaySenders { - pub(super) inner: DashMap>, + pub(super) inner: DashMap>, } pub(super) struct GatewaySender { - channel_id: ChannelId, + channel_id: HelperChannelId, ordering_tx: OrderingSender, total_records: TotalRecords, } @@ -45,7 +45,7 @@ pub(super) struct GatewaySendStream { } impl GatewaySender { - fn new(channel_id: ChannelId, tx: OrderingSender, total_records: TotalRecords) -> Self { + fn new(channel_id: HelperChannelId, tx: OrderingSender, total_records: TotalRecords) -> Self { Self { channel_id, ordering_tx: tx, @@ -57,7 +57,7 @@ impl GatewaySender { &self, record_id: RecordId, msg: B, - ) -> Result<(), Error> { + ) -> Result<(), Error> { debug_assert!( self.total_records.is_specified(), "total_records cannot be unspecified when sending" @@ -95,7 +95,11 @@ impl GatewaySender { } impl SendingEnd { - pub(super) fn new(sender: Arc, role: Role, channel_id: &ChannelId) -> Self { + pub(super) fn new( + sender: Arc, + role: Role, + channel_id: &HelperChannelId, + ) -> Self { Self { sender_role: role, channel_id: channel_id.clone(), @@ -113,8 +117,8 @@ impl SendingEnd { /// call. /// /// [`set_total_records`]: crate::protocol::context::Context::set_total_records - #[tracing::instrument(level = "trace", "send", skip_all, fields(i = %record_id, total = %self.inner.total_records, to = ?self.channel_id.role, gate = ?self.channel_id.gate.as_ref()))] - pub async fn send>(&self, record_id: RecordId, msg: B) -> Result<(), Error> { + #[tracing::instrument(level = "trace", "send", skip_all, fields(i = %record_id, total = %self.inner.total_records, to = ?self.channel_id.peer, gate = ?self.channel_id.gate.as_ref()))] + pub async fn send>(&self, record_id: RecordId, msg: B) -> Result<(), Error> { let r = self.inner.send(record_id, msg).await; metrics::increment_counter!(RECORDS_SENT, STEP => self.channel_id.gate.as_ref().to_string(), @@ -135,7 +139,7 @@ impl GatewaySenders { /// messages to get through. pub(crate) fn get_or_create( &self, - channel_id: &ChannelId, + channel_id: &HelperChannelId, capacity: NonZeroUsize, total_records: TotalRecords, // TODO track children for indeterminate senders ) -> (Arc, Option) { diff --git a/ipa-core/src/helpers/gateway/stall_detection.rs b/ipa-core/src/helpers/gateway/stall_detection.rs index 9a1b28732..654fbb11c 100644 --- a/ipa-core/src/helpers/gateway/stall_detection.rs +++ b/ipa-core/src/helpers/gateway/stall_detection.rs @@ -74,8 +74,8 @@ mod gateway { use crate::{ helpers::{ gateway::{Gateway, State}, - ChannelId, GatewayConfig, Message, ReceivingEnd, Role, RoleAssignment, SendingEnd, - TotalRecords, TransportImpl, + GatewayConfig, HelperChannelId, Message, ReceivingEnd, Role, RoleAssignment, + SendingEnd, TotalRecords, TransportImpl, }, protocol::QueryId, sync::Arc, @@ -149,7 +149,7 @@ mod gateway { #[must_use] pub fn get_sender( &self, - channel_id: &ChannelId, + channel_id: &HelperChannelId, total_records: TotalRecords, ) -> SendingEnd { Observed::wrap( @@ -159,7 +159,7 @@ mod gateway { } #[must_use] - pub fn get_receiver(&self, channel_id: &ChannelId) -> ReceivingEnd { + pub fn get_receiver(&self, channel_id: &HelperChannelId) -> ReceivingEnd { Observed::wrap( Weak::clone(self.get_sn()), self.inner().gateway.get_receiver(channel_id), @@ -221,7 +221,7 @@ mod receive { helpers::{ error::Error, gateway::{receive::GatewayReceivers, ReceivingEnd}, - ChannelId, Message, + HelperChannelId, Message, Role, }, protocol::RecordId, }; @@ -230,12 +230,12 @@ mod receive { delegate::delegate! { to { self.advance(); self.inner() } { #[inline] - pub async fn receive(&self, record_id: RecordId) -> Result; + pub async fn receive(&self, record_id: RecordId) -> Result>; } } } - pub struct WaitingTasks(BTreeMap>); + pub struct WaitingTasks(BTreeMap>); impl Debug for WaitingTasks { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { @@ -243,7 +243,7 @@ mod receive { write!( f, "\n\"{:?}\", from={:?}. Waiting to receive records {:?}.", - channel.gate, channel.role, records + channel.gate, channel.peer, records )?; } @@ -280,7 +280,7 @@ mod send { helpers::{ error::Error, gateway::send::{GatewaySender, GatewaySenders}, - ChannelId, Message, TotalRecords, + HelperChannelId, Message, Role, TotalRecords, }, protocol::RecordId, }; @@ -289,12 +289,12 @@ mod send { delegate::delegate! { to { self.advance(); self.inner() } { #[inline] - pub async fn send>(&self, record_id: RecordId, msg: B) -> Result<(), Error>; + pub async fn send>(&self, record_id: RecordId, msg: B) -> Result<(), Error>; } } } - pub struct WaitingTasks(BTreeMap)>); + pub struct WaitingTasks(BTreeMap)>); impl Debug for WaitingTasks { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { @@ -302,7 +302,7 @@ mod send { write!( f, "\n\"{:?}\", to={:?}. Waiting to send records {:?} out of {total:?}.", - channel.gate, channel.role, records + channel.gate, channel.peer, records )?; } diff --git a/ipa-core/src/helpers/gateway/transport.rs b/ipa-core/src/helpers/gateway/transport.rs index 8c90a29ee..efbc90970 100644 --- a/ipa-core/src/helpers/gateway/transport.rs +++ b/ipa-core/src/helpers/gateway/transport.rs @@ -1,64 +1,94 @@ +use std::{ + pin::Pin, + task::{Context, Poll}, +}; + +use async_trait::async_trait; +use futures::Stream; + use crate::{ helpers::{ - buffers::UnorderedReceiver, - gateway::{receive::UR, send::GatewaySendStream}, - ChannelId, GatewayConfig, Role, RoleAssignment, RouteId, Transport, TransportImpl, + HelperIdentity, NoResourceIdentifier, QueryIdBinding, Role, RoleAssignment, RouteId, + RouteParams, StepBinding, Transport, TransportImpl, }, - protocol::QueryId, + protocol::{step::Gate, QueryId}, }; +#[derive(Debug, thiserror::Error)] +#[error("Failed to send to {0:?}: {1:?}")] +pub struct SendToRoleError(Role, >::Error); + +/// This struct exists to hide the generic type used to index streams internally. +#[pin_project::pin_project] +pub struct RoleRecordsStream(#[pin] >::RecordsStream); + /// Transport adapter that resolves [`Role`] -> [`HelperIdentity`] mapping. As gateways created /// per query, it is not ambiguous. /// /// [`HelperIdentity`]: crate::helpers::HelperIdentity #[derive(Clone)] -pub(super) struct RoleResolvingTransport { - pub query_id: QueryId, - pub roles: RoleAssignment, - pub config: GatewayConfig, - pub inner: TransportImpl, +pub struct RoleResolvingTransport { + pub(super) roles: RoleAssignment, + pub(super) inner: TransportImpl, +} + +impl Stream for RoleRecordsStream { + type Item = Vec; + + fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + self.project().0.poll_next(cx) + } } -impl RoleResolvingTransport { - pub(crate) async fn send( +#[async_trait] +impl Transport for RoleResolvingTransport { + type RecordsStream = RoleRecordsStream; + type Error = SendToRoleError; + + fn identity(&self) -> Role { + let helper_identity = self.inner.identity(); + self.roles.role(helper_identity) + } + + async fn send< + D: Stream> + Send + 'static, + Q: QueryIdBinding, + S: StepBinding, + R: RouteParams, + >( &self, - channel_id: &ChannelId, - data: GatewaySendStream, - ) -> Result<(), ::Error> { - let dest_identity = self.roles.identity(channel_id.role); + dest: Role, + route: R, + data: D, + ) -> Result<(), Self::Error> + where + Option: From, + Option: From, + { + let dest_helper = self.roles.identity(dest); assert_ne!( - dest_identity, + dest_helper, self.inner.identity(), "can't send message to itself" ); - self.inner - .send( - dest_identity, - (RouteId::Records, self.query_id, channel_id.gate.clone()), - data, - ) + .send(dest_helper, route, data) .await + .map_err(|e| SendToRoleError(dest, e)) } - pub(crate) fn receive(&self, channel_id: &ChannelId) -> UR { - let peer = self.roles.identity(channel_id.role); + fn receive>( + &self, + from: Role, + route: R, + ) -> Self::RecordsStream { + let origin_helper = self.roles.identity(from); assert_ne!( - peer, + origin_helper, self.inner.identity(), "can't receive message from itself" ); - UnorderedReceiver::new( - Box::pin( - self.inner - .receive(peer, (self.query_id, channel_id.gate.clone())), - ), - self.config.active_work(), - ) - } - - pub(crate) fn role(&self) -> Role { - self.roles.role(self.inner.identity()) + RoleRecordsStream(self.inner.receive(origin_helper, route)) } } diff --git a/ipa-core/src/helpers/mod.rs b/ipa-core/src/helpers/mod.rs index 4544c2795..f9f9acc42 100644 --- a/ipa-core/src/helpers/mod.rs +++ b/ipa-core/src/helpers/mod.rs @@ -18,7 +18,7 @@ use std::ops::{Index, IndexMut}; /// to validate that transport can actually send streams of this type #[cfg(test)] pub use buffers::OrderingSender; -pub use error::{Error, Result}; +pub use error::Error; pub use futures::MaybeFuture; #[cfg(feature = "stall-detection")] @@ -51,9 +51,10 @@ pub use prss_protocol::negotiate as negotiate_prss; #[cfg(feature = "web-app")] pub use transport::WrappedAxumBodyStream; pub use transport::{ - callbacks::*, query, BodyStream, BytesStream, LengthDelimitedStream, LogErrors, - NoResourceIdentifier, QueryIdBinding, ReceiveRecords, RecordsStream, RouteId, RouteParams, - StepBinding, StreamCollection, StreamKey, Transport, WrappedBoxBodyStream, + callbacks::*, query, BodyStream, BytesStream, Identity as TransportIdentity, + LengthDelimitedStream, LogErrors, NoResourceIdentifier, QueryIdBinding, ReceiveRecords, + RecordsStream, RouteId, RouteParams, StepBinding, StreamCollection, StreamKey, Transport, + WrappedBoxBodyStream, }; #[cfg(feature = "in-memory-infra")] pub use transport::{InMemoryNetwork, InMemoryTransport}; @@ -407,23 +408,26 @@ impl TryFrom<[Role; 3]> for RoleAssignment { /// Combination of helper role and step that uniquely identifies a single channel of communication /// between two helpers. #[derive(Clone, Eq, PartialEq, Hash, Ord, PartialOrd)] -pub struct ChannelId { - pub role: Role, +pub struct ChannelId { + /// Entity we are talking to through this channel. It can be a source or a destination. + pub peer: I, // TODO: step could be either reference or owned value. references are convenient to use inside // gateway , owned values can be used inside lookup tables. pub gate: Gate, } -impl ChannelId { +pub type HelperChannelId = ChannelId; + +impl ChannelId { #[must_use] - pub fn new(role: Role, gate: Gate) -> Self { - Self { role, gate } + pub fn new(peer: I, gate: Gate) -> Self { + Self { peer, gate } } } -impl Debug for ChannelId { +impl Debug for ChannelId { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "channel[{:?},{:?}]", self.role, self.gate.as_ref()) + write!(f, "channel[{:?},{:?}]", self.peer, self.gate.as_ref()) } } diff --git a/ipa-core/src/helpers/prss_protocol.rs b/ipa-core/src/helpers/prss_protocol.rs index 4dddd21fb..348a36596 100644 --- a/ipa-core/src/helpers/prss_protocol.rs +++ b/ipa-core/src/helpers/prss_protocol.rs @@ -3,7 +3,7 @@ use rand_core::{CryptoRng, RngCore}; use x25519_dalek::PublicKey; use crate::{ - helpers::{ChannelId, Direction, Error, Gateway, TotalRecords}, + helpers::{ChannelId, Direction, Error, Gateway, Role, TotalRecords}, protocol::{ prss, step::{Gate, Step, StepNarrow}, @@ -28,7 +28,7 @@ pub async fn negotiate( gateway: &Gateway, gate: &Gate, rng: &mut R, -) -> Result { +) -> Result> { // setup protocol to exchange prss public keys. This protocol sends one message per peer. // Each message contains this helper's public key. At the end of this protocol, all helpers // have completed key exchange and each of them have established a shared secret with each peer. diff --git a/ipa-core/src/helpers/transport/in_memory/mod.rs b/ipa-core/src/helpers/transport/in_memory/mod.rs index 564caee0c..36a9eaed4 100644 --- a/ipa-core/src/helpers/transport/in_memory/mod.rs +++ b/ipa-core/src/helpers/transport/in_memory/mod.rs @@ -3,19 +3,19 @@ mod transport; pub use transport::Setup; use crate::{ - helpers::{HelperIdentity, TransportCallbacks}, + helpers::{HelperIdentity, TransportCallbacks, TransportIdentity}, sync::{Arc, Weak}, }; -pub type InMemoryTransport = Weak; +pub type InMemoryTransport = Weak>; /// Container for all active transports #[derive(Clone)] -pub struct InMemoryNetwork { - pub transports: [Arc; 3], +pub struct InMemoryNetwork { + pub transports: [Arc>; 3], } -impl Default for InMemoryNetwork { +impl Default for InMemoryNetwork { fn default() -> Self { Self::new([ TransportCallbacks::default(), @@ -26,26 +26,10 @@ impl Default for InMemoryNetwork { } #[allow(dead_code)] -impl InMemoryNetwork { - #[must_use] - pub fn new(callbacks: [TransportCallbacks; 3]) -> Self { - let [mut first, mut second, mut third]: [_; 3] = - HelperIdentity::make_three().map(Setup::new); - - first.connect(&mut second); - second.connect(&mut third); - third.connect(&mut first); - - let [cb1, cb2, cb3] = callbacks; - - Self { - transports: [first.start(cb1), second.start(cb2), third.start(cb3)], - } - } - +impl InMemoryNetwork { #[must_use] #[allow(clippy::missing_panics_doc)] - pub fn helper_identities(&self) -> [HelperIdentity; 3] { + pub fn identities(&self) -> [I; 3] { self.transports .iter() .map(|t| t.identity()) @@ -59,7 +43,7 @@ impl InMemoryNetwork { /// ## Panics /// If [`HelperIdentity`] is somehow points to a non-existent helper, which shouldn't happen. #[must_use] - pub fn transport(&self, id: HelperIdentity) -> InMemoryTransport { + pub fn transport(&self, id: I) -> InMemoryTransport { self.transports .iter() .find(|t| t.identity() == id) @@ -68,8 +52,8 @@ impl InMemoryNetwork { #[allow(clippy::missing_panics_doc)] #[must_use] - pub fn transports(&self) -> [InMemoryTransport; 3] { - let transports: [InMemoryTransport; 3] = self + pub fn transports(&self) -> [InMemoryTransport; 3] { + let transports: [InMemoryTransport<_>; 3] = self .transports .iter() .map(Arc::downgrade) @@ -87,3 +71,21 @@ impl InMemoryNetwork { } } } + +impl InMemoryNetwork { + #[must_use] + pub fn new(callbacks: [TransportCallbacks>; 3]) -> Self { + let [mut first, mut second, mut third]: [_; 3] = + HelperIdentity::make_three().map(Setup::new); + + first.connect(&mut second); + second.connect(&mut third); + third.connect(&mut first); + + let [cb1, cb2, cb3] = callbacks; + + Self { + transports: [first.start(cb1), second.start(cb2), third.start(cb3)], + } + } +} diff --git a/ipa-core/src/helpers/transport/in_memory/transport.rs b/ipa-core/src/helpers/transport/in_memory/transport.rs index f23d586bc..ab8173766 100644 --- a/ipa-core/src/helpers/transport/in_memory/transport.rs +++ b/ipa-core/src/helpers/transport/in_memory/transport.rs @@ -25,19 +25,23 @@ use crate::{ helpers::{ query::{PrepareQuery, QueryConfig}, HelperIdentity, NoResourceIdentifier, QueryIdBinding, ReceiveRecords, RouteId, RouteParams, - StepBinding, StreamCollection, Transport, TransportCallbacks, + StepBinding, StreamCollection, Transport, TransportCallbacks, TransportIdentity, }, protocol::{step::Gate, QueryId}, sync::{Arc, Weak}, }; -type Packet = (Addr, InMemoryStream, oneshot::Sender>); -type ConnectionTx = Sender; -type ConnectionRx = Receiver; +type Packet = ( + Addr, + InMemoryStream, + oneshot::Sender>>, +); +type ConnectionTx = Sender>; +type ConnectionRx = Receiver>; type StreamItem = Vec; #[derive(Debug, thiserror::Error)] -pub enum Error { +pub enum Error { #[error(transparent)] Io { #[from] @@ -45,7 +49,7 @@ pub enum Error { }, #[error("Request rejected by remote {dest:?}: {inner:?}")] Rejected { - dest: HelperIdentity, + dest: I, #[source] inner: BoxError, }, @@ -54,15 +58,15 @@ pub enum Error { /// In-memory implementation of [`Transport`] backed by Tokio mpsc channels. /// Use [`Setup`] to initialize it and call [`Setup::start`] to make it actively listen for /// incoming messages. -pub struct InMemoryTransport { - identity: HelperIdentity, - connections: HashMap, - record_streams: StreamCollection, +pub struct InMemoryTransport { + identity: I, + connections: HashMap>, + record_streams: StreamCollection, } -impl InMemoryTransport { +impl InMemoryTransport { #[must_use] - fn new(identity: HelperIdentity, connections: HashMap) -> Self { + fn new(identity: I, connections: HashMap>) -> Self { Self { identity, connections, @@ -71,7 +75,7 @@ impl InMemoryTransport { } #[must_use] - pub fn identity(&self) -> HelperIdentity { + pub fn identity(&self) -> I { self.identity } @@ -79,7 +83,11 @@ impl InMemoryTransport { /// out and processes it, the same way as query processor does. That will allow all tasks to be /// created in one place (driver). It does not affect the [`Transport`] interface, /// so I'll leave it as is for now. - fn listen(self: &Arc, callbacks: TransportCallbacks>, mut rx: ConnectionRx) { + fn listen( + self: &Arc, + callbacks: TransportCallbacks>, + mut rx: ConnectionRx, + ) { tokio::spawn( { let streams = self.record_streams.clone(); @@ -132,7 +140,7 @@ impl InMemoryTransport { ); } - fn get_channel(&self, dest: HelperIdentity) -> ConnectionTx { + fn get_channel(&self, dest: I) -> ConnectionTx { self.connections .get(&dest) .unwrap_or_else(|| { @@ -151,11 +159,11 @@ impl InMemoryTransport { } #[async_trait] -impl Transport for Weak { - type RecordsStream = ReceiveRecords; - type Error = Error; +impl Transport for Weak> { + type RecordsStream = ReceiveRecords; + type Error = Error; - fn identity(&self) -> HelperIdentity { + fn identity(&self) -> I { self.upgrade().unwrap().identity } @@ -166,10 +174,10 @@ impl Transport for Weak { R: RouteParams, >( &self, - dest: HelperIdentity, + dest: I, route: R, data: D, - ) -> Result<(), Error> + ) -> Result<(), Error> where Option: From, Option: From, @@ -197,7 +205,7 @@ impl Transport for Weak { fn receive>( &self, - from: HelperIdentity, + from: I, route: R, ) -> Self::RecordsStream { ReceiveRecords::new( @@ -261,18 +269,18 @@ impl Debug for InMemoryStream { } } -struct Addr { +struct Addr { route: RouteId, - origin: Option, + origin: Option, query_id: Option, gate: Option, params: String, } -impl Addr { +impl Addr { #[allow(clippy::needless_pass_by_value)] // to avoid using double-reference at callsites fn from_route>( - origin: HelperIdentity, + origin: I, route: R, ) -> Self where @@ -293,7 +301,7 @@ impl Addr { } #[cfg(all(test, unit_test))] - fn records(from: HelperIdentity, query_id: QueryId, gate: Gate) -> Self { + fn records(from: I, query_id: QueryId, gate: Gate) -> Self { Self { route: RouteId::Records, origin: Some(from), @@ -304,7 +312,7 @@ impl Addr { } } -impl Debug for Addr { +impl Debug for Addr { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( f, @@ -316,9 +324,9 @@ impl Debug for Addr { pub struct Setup { identity: HelperIdentity, - tx: ConnectionTx, - rx: ConnectionRx, - connections: HashMap, + tx: ConnectionTx, + rx: ConnectionRx, + connections: HashMap>, } impl Setup { @@ -350,8 +358,11 @@ impl Setup { fn into_active_conn( self, - callbacks: TransportCallbacks>, - ) -> (ConnectionTx, Arc) { + callbacks: TransportCallbacks>>, + ) -> ( + ConnectionTx, + Arc>, + ) { let transport = Arc::new(InMemoryTransport::new(self.identity, self.connections)); transport.listen(callbacks, self.rx); @@ -361,8 +372,8 @@ impl Setup { #[must_use] pub fn start( self, - callbacks: TransportCallbacks>, - ) -> Arc { + callbacks: TransportCallbacks>>, + ) -> Arc> { self.into_active_conn(callbacks).1 } } @@ -391,6 +402,7 @@ mod tests { InMemoryNetwork, Setup, }, HelperIdentity, OrderingSender, RouteId, Transport, TransportCallbacks, + TransportIdentity, }, protocol::{step::Gate, QueryId}, sync::Arc, @@ -398,7 +410,11 @@ mod tests { const STEP: &str = "in-memory-transport"; - async fn send_and_ack(sender: &ConnectionTx, addr: Addr, data: InMemoryStream) { + async fn send_and_ack( + sender: &ConnectionTx, + addr: Addr, + data: InMemoryStream, + ) { let (tx, rx) = oneshot::channel(); sender.send((addr, data, tx)).await.unwrap(); rx.await @@ -491,7 +507,7 @@ mod tests { async fn send_and_verify( from: HelperIdentity, to: HelperIdentity, - transports: &HashMap>, + transports: &HashMap>>, ) { let (stream_tx, stream_rx) = channel(1); let stream = InMemoryStream::from(stream_rx); diff --git a/ipa-core/src/helpers/transport/mod.rs b/ipa-core/src/helpers/transport/mod.rs index acbbb8e8e..2bdcb5ace 100644 --- a/ipa-core/src/helpers/transport/mod.rs +++ b/ipa-core/src/helpers/transport/mod.rs @@ -1,4 +1,4 @@ -use std::borrow::Borrow; +use std::{borrow::Borrow, fmt::Debug, hash::Hash}; use async_trait::async_trait; use futures::Stream; @@ -25,6 +25,19 @@ pub use stream::{ WrappedBoxBodyStream, }; +use crate::{helpers::Role, sharding::ShardIndex}; + +/// An identity of a peer that can be communicated with using [`Transport`]. There are currently two +/// types of peers - helpers and shards. +pub trait Identity: Copy + Clone + Debug + PartialEq + Eq + Hash + Send + Sync + 'static {} + +impl Identity for ShardIndex {} +impl Identity for HelperIdentity {} + +/// Role is an identifier of helper peer, only valid within a given query. For every query, there +/// exists a static mapping from role to helper identity. +impl Identity for Role {} + pub trait ResourceIdentifier: Sized {} pub trait QueryIdBinding: Sized where @@ -125,21 +138,16 @@ impl RouteParams for (RouteId, QueryId, Gate) { /// Transport that supports per-query,per-step channels #[async_trait] -pub trait Transport: Clone + Send + Sync + 'static { +pub trait Transport: Clone + Send + Sync + 'static { type RecordsStream: Stream> + Send + Unpin; type Error: std::fmt::Debug; - fn identity(&self) -> HelperIdentity; + fn identity(&self) -> I; /// Sends a new request to the given destination helper party. /// Depending on the specific request, it may or may not require acknowledgment by the remote /// party - async fn send( - &self, - dest: HelperIdentity, - route: R, - data: D, - ) -> Result<(), Self::Error> + async fn send(&self, dest: I, route: R, data: D) -> Result<(), Self::Error> where Option: From, Option: From, @@ -152,7 +160,7 @@ pub trait Transport: Clone + Send + Sync + 'static { /// and step fn receive>( &self, - from: HelperIdentity, + from: I, route: R, ) -> Self::RecordsStream; diff --git a/ipa-core/src/helpers/transport/receive.rs b/ipa-core/src/helpers/transport/receive.rs index e797e7dc9..fec775d0b 100644 --- a/ipa-core/src/helpers/transport/receive.rs +++ b/ipa-core/src/helpers/transport/receive.rs @@ -1,15 +1,19 @@ use std::{ - pin::Pin, + pin::{pin, Pin}, task::{Context, Poll}, }; use futures::Stream; use futures_util::StreamExt; +use pin_project::pin_project; use tracing::error; use crate::{ error::BoxError, - helpers::transport::stream::{StreamCollection, StreamKey}, + helpers::{ + transport::stream::{StreamCollection, StreamKey}, + TransportIdentity, + }, }; /// Adapt a stream of `Result>, Error>` to a stream of `Vec`. @@ -66,47 +70,49 @@ where /// If stream is not received yet, each poll generates a waker that is used internally to wake up /// the task when stream is received. /// Once stream is received, it is moved to this struct and it acts as a proxy to it. -pub struct ReceiveRecords { - inner: ReceiveRecordsInner, +#[pin_project] +pub struct ReceiveRecords { + #[pin] + inner: ReceiveRecordsInner, } -impl ReceiveRecords { - pub(crate) fn new(key: StreamKey, coll: StreamCollection) -> Self { +impl ReceiveRecords { + pub(crate) fn new(key: StreamKey, coll: StreamCollection) -> Self { Self { inner: ReceiveRecordsInner::Pending(key, coll), } } } -impl Stream for ReceiveRecords { +impl Stream for ReceiveRecords { type Item = S::Item; fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - Pin::get_mut(self).inner.poll_next_unpin(cx) + self.project().inner.poll_next(cx) } } /// Inner state for [`ReceiveRecords`] struct -enum ReceiveRecordsInner { - Pending(StreamKey, StreamCollection), - Ready(S), +#[pin_project(project = ReceiveRecordsInnerProj)] +enum ReceiveRecordsInner { + Pending(StreamKey, StreamCollection), + Ready(#[pin] S), } -impl Stream for ReceiveRecordsInner { +impl Stream for ReceiveRecordsInner { type Item = S::Item; - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let this = Pin::get_mut(self); + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { loop { - match this { - Self::Pending(key, streams) => { + match self.as_mut().project() { + ReceiveRecordsInnerProj::Pending(key, streams) => { if let Some(stream) = streams.add_waker(key, cx.waker()) { - *this = Self::Ready(stream); + self.set(Self::Ready(stream)); } else { return Poll::Pending; } } - Self::Ready(stream) => return stream.poll_next_unpin(cx), + ReceiveRecordsInnerProj::Ready(stream) => return stream.poll_next(cx), } } } diff --git a/ipa-core/src/helpers/transport/stream/collection.rs b/ipa-core/src/helpers/transport/stream/collection.rs index a60abca55..b5b1a8bcf 100644 --- a/ipa-core/src/helpers/transport/stream/collection.rs +++ b/ipa-core/src/helpers/transport/stream/collection.rs @@ -7,14 +7,14 @@ use std::{ use futures::Stream; use crate::{ - helpers::HelperIdentity, + helpers::TransportIdentity, protocol::{step::Gate, QueryId}, sync::{Arc, Mutex}, }; /// Each stream is indexed by query id, the identity of helper where stream is originated from /// and step. -pub type StreamKey = (QueryId, HelperIdentity, Gate); +pub type StreamKey = (QueryId, I, Gate); /// Thread-safe append-only collection of homogeneous record streams. /// Streams are indexed by [`StreamKey`] and the lifecycle of each stream is described by the @@ -22,11 +22,11 @@ pub type StreamKey = (QueryId, HelperIdentity, Gate); /// /// Each stream can be inserted and taken away exactly once, any deviation from this behaviour will /// result in panic. -pub struct StreamCollection { - inner: Arc>>>, +pub struct StreamCollection { + inner: Arc, StreamState>>>, } -impl Default for StreamCollection { +impl Default for StreamCollection { fn default() -> Self { Self { inner: Arc::new(Mutex::new(HashMap::default())), @@ -34,7 +34,7 @@ impl Default for StreamCollection { } } -impl Clone for StreamCollection { +impl Clone for StreamCollection { fn clone(&self) -> Self { Self { inner: Arc::clone(&self.inner), @@ -42,12 +42,12 @@ impl Clone for StreamCollection { } } -impl StreamCollection { +impl StreamCollection { /// Adds a new stream associated with the given key. /// /// ## Panics /// If there was another stream associated with the same key some time in the past. - pub fn add_stream(&self, key: StreamKey, stream: S) { + pub fn add_stream(&self, key: StreamKey, stream: S) { let mut streams = self.inner.lock().unwrap(); match streams.entry(key) { Entry::Occupied(mut entry) => match entry.get_mut() { @@ -77,7 +77,7 @@ impl StreamCollection { /// /// ## Panics /// If [`Waker`] that exists already inside this collection will not wake the given one. - pub fn add_waker(&self, key: &StreamKey, waker: &Waker) -> Option { + pub fn add_waker(&self, key: &StreamKey, waker: &Waker) -> Option { let mut streams = self.inner.lock().unwrap(); match streams.entry(key.clone()) { diff --git a/ipa-core/src/lib.rs b/ipa-core/src/lib.rs index 50e2d98d6..abb5a3aa1 100644 --- a/ipa-core/src/lib.rs +++ b/ipa-core/src/lib.rs @@ -33,6 +33,7 @@ mod exact; mod seq_join; #[cfg(feature = "enable-serde")] mod serde; +mod sharding; pub use app::{HelperApp, Setup as AppSetup}; diff --git a/ipa-core/src/net/transport.rs b/ipa-core/src/net/transport.rs index fcdc63c33..19c048e6c 100644 --- a/ipa-core/src/net/transport.rs +++ b/ipa-core/src/net/transport.rs @@ -33,7 +33,7 @@ pub struct HttpTransport { clients: [MpcHelperClient; 3], // TODO(615): supporting multiple queries likely require a hashmap here. It will be ok if we // only allow one query at a time. - record_streams: StreamCollection, + record_streams: StreamCollection, } impl HttpTransport { @@ -123,8 +123,8 @@ impl HttpTransport { } #[async_trait] -impl Transport for Arc { - type RecordsStream = ReceiveRecords; +impl Transport for Arc { + type RecordsStream = ReceiveRecords; type Error = Error; fn identity(&self) -> HelperIdentity { diff --git a/ipa-core/src/sharding.rs b/ipa-core/src/sharding.rs new file mode 100644 index 000000000..564d9cd6f --- /dev/null +++ b/ipa-core/src/sharding.rs @@ -0,0 +1,116 @@ +use std::fmt::{Display, Formatter}; + +/// A unique zero-based index of the helper shard. +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct ShardIndex(u32); + +impl Display for ShardIndex { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + Display::fmt(&self.0, f) + } +} + +/// Shard-specific configuration required by sharding API. Each shard must know its own index and +/// the total number of shards in the system. +pub trait ShardConfiguration { + /// Returns the index of the current shard. + fn shard_id(&self) -> ShardIndex; + + /// Total number of shards present on this helper. It is expected that all helpers have the + /// same number of shards. + fn shard_count(&self) -> ShardIndex; + + /// Returns an iterator that yields shard indices for all shards present in the system, except + /// this one. Shards are yielded in ascending order. + /// + /// ## Panics + /// if current shard index is greater or equal to the total number of shards. + fn peer_shards(&self) -> impl Iterator { + let this = self.shard_id(); + let max = self.shard_count(); + assert!( + this < max, + "Current shard index '{this}' >= '{max}' (total number of shards)" + ); + + max.iter().filter(move |&v| v != this) + } +} + +impl ShardIndex { + pub const FIRST: Self = Self(0); + + /// Returns an iterator over all shard indices that precede this one, excluding this one. + pub fn iter(self) -> impl Iterator { + (0..self.0).map(Self) + } +} + +impl From for ShardIndex { + fn from(value: u32) -> Self { + Self(value) + } +} + +#[cfg(target_pointer_width = "64")] +impl From for usize { + fn from(value: ShardIndex) -> Self { + usize::try_from(value.0).unwrap() + } +} + +#[cfg(all(test, unit_test))] +mod tests { + use std::iter::empty; + + use crate::sharding::ShardIndex; + + fn shards>(input: I) -> impl Iterator { + input.into_iter().map(ShardIndex) + } + + #[test] + fn iter() { + assert!(ShardIndex::FIRST.iter().eq(empty())); + assert!(shards([0, 1, 2]).eq(ShardIndex::from(3).iter())); + } + + /// It is often useful to keep a collection of elements indexed by shard. + #[test] + fn indexing() { + let arr = [0, 1, 2]; + assert_eq!(0, arr[usize::from(ShardIndex::FIRST)]); + } + + mod conf { + use crate::sharding::{tests::shards, ShardConfiguration, ShardIndex}; + + struct StaticConfig(u32, u32); + impl ShardConfiguration for StaticConfig { + fn shard_id(&self) -> ShardIndex { + self.0.into() + } + + fn shard_count(&self) -> ShardIndex { + self.1.into() + } + } + + #[test] + fn excludes_this_shard() { + assert!(shards([0, 1, 2, 4]).eq(StaticConfig(3, 5).peer_shards())); + } + + #[test] + #[should_panic(expected = "Current shard index '5' >= '5' (total number of shards)")] + fn shard_index_eq_shard_count() { + let _ = StaticConfig(5, 5).peer_shards(); + } + + #[test] + #[should_panic(expected = "Current shard index '7' >= '5' (total number of shards)")] + fn shard_index_gt_shard_count() { + let _ = StaticConfig(7, 5).peer_shards(); + } + } +} diff --git a/ipa-core/src/test_fixture/app.rs b/ipa-core/src/test_fixture/app.rs index d38e95da5..d32ce0b23 100644 --- a/ipa-core/src/test_fixture/app.rs +++ b/ipa-core/src/test_fixture/app.rs @@ -8,7 +8,7 @@ use crate::{ ff::Serializable, helpers::{ query::{QueryConfig, QueryInput}, - InMemoryNetwork, InMemoryTransport, + HelperIdentity, InMemoryNetwork, }, protocol::QueryId, query::QueryStatus, @@ -50,7 +50,7 @@ where /// [`TestWorld`]: crate::test_fixture::TestWorld pub struct TestApp { drivers: [HelperApp; 3], - network: InMemoryNetwork, + network: InMemoryNetwork, } fn unzip_tuple_array(input: [(T, U); 3]) -> ([T; 3], [U; 3]) { @@ -68,7 +68,7 @@ impl Default for TestApp { .transports() .iter() .zip(setup) - .map(|(t, s)| s.connect(::clone(t))) + .map(|(t, s)| s.connect(Clone::clone(t))) .collect::>() .try_into() .map_err(|_| "infallible") diff --git a/ipa-core/src/test_fixture/world.rs b/ipa-core/src/test_fixture/world.rs index 1b5a691d2..0f9cb4159 100644 --- a/ipa-core/src/test_fixture/world.rs +++ b/ipa-core/src/test_fixture/world.rs @@ -8,7 +8,7 @@ use rand_core::{RngCore, SeedableRng}; use tracing::{Instrument, Level, Span}; use crate::{ - helpers::{Gateway, GatewayConfig, InMemoryNetwork, Role, RoleAssignment}, + helpers::{Gateway, GatewayConfig, HelperIdentity, InMemoryNetwork, Role, RoleAssignment}, protocol::{ context::{ Context, MaliciousContext, SemiHonestContext, UpgradableContext, UpgradeContext, @@ -49,7 +49,7 @@ pub struct TestWorld { participants: [PrssEndpoint; 3], executions: AtomicUsize, metrics_handle: MetricsHandle, - _network: InMemoryNetwork, + _network: InMemoryNetwork, } #[derive(Clone)] @@ -112,7 +112,7 @@ impl TestWorld { let network = InMemoryNetwork::default(); let role_assignment = config .role_assignment - .unwrap_or_else(|| RoleAssignment::new(network.helper_identities())); + .unwrap_or_else(|| RoleAssignment::new(network.identities())); let mut gateways = [None, None, None]; for i in 0..3 { From 944e695267781266e28ab43ef3295a1137ef5310 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Mon, 18 Mar 2024 18:17:08 +1000 Subject: [PATCH 080/135] martins feedback --- .../ipa_prf/malicious_security/prover.rs | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index 2147908b7..7ed47f0b8 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -17,6 +17,7 @@ pub struct ZeroKnowledgeProof { g: GenericArray, } +#[derive(Debug)] pub struct ProofGenerator { u: Vec, v: Vec, @@ -128,6 +129,30 @@ where } } +impl PartialEq<(&[u128], &[u128])> for ProofGenerator +where + F: PrimeField + std::cmp::PartialEq, +{ + fn eq(&self, other: &(&[u128], &[u128])) -> bool { + let (cmp_a, cmp_b) = other; + for (i, elem) in cmp_a.iter().enumerate() { + if !self.u[i].eq(elem) { + return false; + } + } + for (i, elem) in cmp_b.iter().enumerate() { + if !self.v[i].eq(elem) { + return false; + } + } + true + } + + fn ne(&self, other: &(&[u128], &[u128])) -> bool { + !self.eq(other) + } +} + #[cfg(all(test, unit_test))] mod test { use typenum::{U2, U4}; @@ -174,8 +199,7 @@ mod test { proof.g.iter().map(Fp31::as_u128).collect::>(), EXPECTED_1, ); - assert_eq!(pg_2.u.iter().map(Fp31::as_u128).collect::>(), U_2,); - assert_eq!(pg_2.v.iter().map(Fp31::as_u128).collect::>(), V_2,); + assert_eq!(pg_2, (&U_2[..], &V_2[..])); // next iteration let (proof_2, pg_3) = pg_2.compute_proof::(Fp31::try_from(R_2).unwrap()); @@ -183,8 +207,7 @@ mod test { proof_2.g.iter().map(Fp31::as_u128).collect::>(), EXPECTED_2, ); - assert_eq!(pg_3.u.iter().map(Fp31::as_u128).collect::>(), U_3,); - assert_eq!(pg_3.v.iter().map(Fp31::as_u128).collect::>(), V_3,); + assert_eq!(pg_3, (&U_3[..], &V_3[..])); // final iteration let proof_3 = pg_3.compute_final_proof::( From f32f4c3a63ad3029d805f8d8c1860757c1c44678 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Mon, 18 Mar 2024 18:18:53 +1000 Subject: [PATCH 081/135] removing ne implementation --- ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index 7ed47f0b8..377838c3e 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -147,10 +147,6 @@ where } true } - - fn ne(&self, other: &(&[u128], &[u128])) -> bool { - !self.eq(other) - } } #[cfg(all(test, unit_test))] From 37ec510ed9e0f7a32184fa62e52e6c2ee96bd513 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Mon, 18 Mar 2024 18:39:56 +1000 Subject: [PATCH 082/135] Verifying ZKPs part one --- .../ipa_prf/malicious_security/mod.rs | 1 + .../ipa_prf/malicious_security/prover.rs | 42 +++-- .../ipa_prf/malicious_security/verifier.rs | 144 ++++++++++++++++++ 3 files changed, 172 insertions(+), 15 deletions(-) create mode 100644 ipa-core/src/protocol/ipa_prf/malicious_security/verifier.rs diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs index 0e7f6bf3a..607827b1a 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs @@ -1,2 +1,3 @@ pub mod lagrange; pub mod prover; +pub mod verifier; diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index 377838c3e..90000181e 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -3,7 +3,7 @@ use std::{ ops::{Add, Sub}, }; -use generic_array::{ArrayLength, GenericArray}; +use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; use typenum::{Diff, Sum, U1}; use crate::{ @@ -14,7 +14,22 @@ use crate::{ }; pub struct ZeroKnowledgeProof { - g: GenericArray, + pub g: GenericArray, +} + +impl ZeroKnowledgeProof +where + F: PrimeField, + N: ArrayLength, +{ + pub fn new(g: I) -> Self + where + I: IntoIterator, + { + ZeroKnowledgeProof { + g: g.into_iter().collect(), + } + } } #[derive(Debug)] @@ -23,8 +38,8 @@ pub struct ProofGenerator { v: Vec, } -type TwoNMinusOne = Diff, U1>; -type TwoNPlusOne = Sum, U1>; +pub type TwoNMinusOne = Diff, U1>; +pub type TwoNPlusOne = Sum, U1>; /// /// Distributed Zero Knowledge Proofs algorithm drawn from @@ -84,13 +99,11 @@ where zip(p, q) .map(|(a, b)| *a * *b) .chain(zip(p_extrapolated, q_extrapolated).map(|(a, b)| a * b)) - .collect::>() }); - let proof = ZeroKnowledgeProof { - g: extrapolated_points - .reduce(|acc, pts| zip(acc, pts).map(|(a, b)| a + b).collect()) - .unwrap(), - }; + let proof = ZeroKnowledgeProof::new(extrapolated_points.fold( + GenericArray::>::generate(|_| F::ZERO), + |acc, pts| zip(acc, pts).map(|(a, b)| a + b).collect(), + )); (proof, next_proof_generator) } @@ -118,14 +131,13 @@ where let p_extrapolated = lagrange_table.eval(&p); let q_extrapolated = lagrange_table.eval(&q); - ZeroKnowledgeProof { - g: zip( + ZeroKnowledgeProof::new( + zip( p.into_iter().chain(p_extrapolated), q.into_iter().chain(q_extrapolated), ) - .map(|(a, b)| a * b) - .collect(), - } + .map(|(a, b)| a * b), + ) } } diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/verifier.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/verifier.rs new file mode 100644 index 000000000..6d084c3f2 --- /dev/null +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/verifier.rs @@ -0,0 +1,144 @@ +use std::{ + iter::zip, + ops::{Add, Sub}, +}; + +use generic_array::{ArrayLength, GenericArray}; +use typenum::{Diff, Sum, U1}; + +use super::prover::{TwoNMinusOne, ZeroKnowledgeProof}; +use crate::{ + ff::PrimeField, + protocol::ipa_prf::malicious_security::lagrange::{ + CanonicalLagrangeDenominator, LagrangeTable, + }, +}; + +pub struct ProofVerifier { + u_or_v: Vec, + out_share: F, +} + +/// +/// Distributed Zero Knowledge Proofs algorithm drawn from +/// `https://eprint.iacr.org/2023/909.pdf` +/// +#[allow(non_camel_case_types)] +impl ProofVerifier +where + F: PrimeField, +{ + pub fn new(u_or_v: Vec, out_share: F) -> Self { + Self { u_or_v, out_share } + } + + pub fn verify_proof<λ: ArrayLength>( + &self, + zkp: ZeroKnowledgeProof>, + r: F, + ) -> (F, ProofVerifier) + where + λ: ArrayLength + Add + Sub, + <λ as Add>::Output: Sub, + <<λ as Add>::Output as Sub>::Output: ArrayLength, + <λ as Sub>::Output: ArrayLength, + { + debug_assert_eq!(self.u_or_v.len() % λ::USIZE, 0); // We should pad with zeroes eventually + + let s = self.u_or_v.len() / λ::USIZE; + + assert!( + s > 1, + "When the output is this small, you should call `verify_final_proof`" + ); + + let denominator_g = CanonicalLagrangeDenominator::>::new(); + let lagrange_table_g = LagrangeTable::, U1>::new(&denominator_g, &r); + let g_r_share = lagrange_table_g.eval(&zkp.g)[0]; + let sum_share = (0..λ::USIZE).fold(F::ZERO, |acc, i| acc + zkp.g[i]); + + // Reveal `b_share` to one another to reconstruct `b` and check if `b = 0`. If the check doesn't pass, abort. + let b_share = sum_share - self.out_share; + + let denominator_p = CanonicalLagrangeDenominator::::new(); + let lagrange_table_p_r = LagrangeTable::::new(&denominator_p, &r); + let p_or_q_r = (0..s) + .map(|i| { + let start = i * λ::USIZE; + let end = start + λ::USIZE; + let p_or_q = &self.u_or_v[start..end]; + lagrange_table_p_r.eval(p_or_q)[0] + }) + .collect(); + ( + b_share, + ProofVerifier { + u_or_v: p_or_q_r, + out_share: g_r_share, + }, + ) + } +} + +#[cfg(all(test, unit_test))] +mod test { + use typenum::{U4, U7}; + + use super::ProofVerifier; + use crate::{ + ff::{Fp31, U128Conversions}, + protocol::ipa_prf::malicious_security::prover::ZeroKnowledgeProof, + }; + + #[test] + fn sample_proof() { + const U_1: [u128; 32] = [ + 0, 30, 0, 16, 0, 1, 0, 15, 0, 0, 0, 16, 0, 30, 0, 16, 29, 1, 1, 15, 0, 0, 1, 15, 2, 30, + 30, 16, 0, 0, 30, 16, + ]; + const OUT_1: u128 = 27; + const ZKP_1: [u128; 7] = [0, 0, 13, 17, 11, 25, 7]; + const R_1: u128 = 22; + + const EXPECTED_G_R_1: u128 = 0; + const EXPECTED_B_1: u128 = 3; + + const U_2: [u128; 8] = [0, 0, 26, 0, 7, 18, 24, 13]; + const ZKP_2: [u128; 7] = [11, 25, 17, 9, 22, 23, 3]; + const R_2: u128 = 17; + + const EXPECTED_G_R_2: u128 = 13; + const EXPECTED_B_2: u128 = 0; + + const U_3: [u128; 2] = [3, 3]; + + let pv_1: ProofVerifier = ProofVerifier::new( + U_1.into_iter() + .map(|x| Fp31::try_from(x).unwrap()) + .collect(), + Fp31::try_from(OUT_1).unwrap(), + ); + + // first iteration + let zkp_1 = ZeroKnowledgeProof::::new(ZKP_1.map(|x| Fp31::try_from(x).unwrap())); + + let (b_share_1, pv_2) = pv_1.verify_proof::(zkp_1, Fp31::try_from(R_1).unwrap()); + assert_eq!(b_share_1.as_u128(), EXPECTED_B_1); + assert_eq!( + pv_2.u_or_v.iter().map(Fp31::as_u128).collect::>(), + U_2, + ); + assert_eq!(pv_2.out_share.as_u128(), EXPECTED_G_R_1); + + // second iteration + let zkp_2 = ZeroKnowledgeProof::::new(ZKP_2.map(|x| Fp31::try_from(x).unwrap())); + + let (b_share_2, pv_3) = pv_2.verify_proof::(zkp_2, Fp31::try_from(R_2).unwrap()); + assert_eq!(b_share_2.as_u128(), EXPECTED_B_2); + assert_eq!( + pv_3.u_or_v.iter().map(Fp31::as_u128).collect::>(), + U_3, + ); + assert_eq!(pv_3.out_share.as_u128(), EXPECTED_G_R_2); + } +} From e98ac50e1476ecd8850c49682115daaba6604619 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Tue, 19 Mar 2024 01:07:18 +1000 Subject: [PATCH 083/135] Adding the final proof verification --- .../ipa_prf/malicious_security/verifier.rs | 138 ++++++++++++++++-- 1 file changed, 126 insertions(+), 12 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/verifier.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/verifier.rs index 6d084c3f2..08aa7b5a0 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/verifier.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/verifier.rs @@ -1,12 +1,9 @@ -use std::{ - iter::zip, - ops::{Add, Sub}, -}; +use std::ops::{Add, Sub}; -use generic_array::{ArrayLength, GenericArray}; -use typenum::{Diff, Sum, U1}; +use generic_array::ArrayLength; +use typenum::{Sum, U1}; -use super::prover::{TwoNMinusOne, ZeroKnowledgeProof}; +use super::prover::{TwoNMinusOne, TwoNPlusOne, ZeroKnowledgeProof}; use crate::{ ff::PrimeField, protocol::ipa_prf::malicious_security::lagrange::{ @@ -60,14 +57,14 @@ where // Reveal `b_share` to one another to reconstruct `b` and check if `b = 0`. If the check doesn't pass, abort. let b_share = sum_share - self.out_share; - let denominator_p = CanonicalLagrangeDenominator::::new(); - let lagrange_table_p_r = LagrangeTable::::new(&denominator_p, &r); + let denominator_p_or_q = CanonicalLagrangeDenominator::::new(); + let lagrange_table_p_or_q_r = LagrangeTable::::new(&denominator_p_or_q, &r); let p_or_q_r = (0..s) .map(|i| { let start = i * λ::USIZE; let end = start + λ::USIZE; let p_or_q = &self.u_or_v[start..end]; - lagrange_table_p_r.eval(p_or_q)[0] + lagrange_table_p_or_q_r.eval(p_or_q)[0] }) .collect(); ( @@ -78,11 +75,40 @@ where }, ) } + + pub fn verify_final_proof<λ>( + &self, + zkp: ZeroKnowledgeProof>, + r: F, + p_or_q_0: F, + ) -> (F, F) + where + λ: ArrayLength + Add + Add, + <λ as Add>::Output: Add, + <<λ as Add>::Output as Add>::Output: ArrayLength, + <λ as Add>::Output: ArrayLength, + { + assert_eq!(self.u_or_v.len(), λ::USIZE); // We should pad with zeroes eventually + + // We need a table of size `λ + 1` since we add a random point at x=0 + let denominator = CanonicalLagrangeDenominator::>::new(); + let lagrange_table = LagrangeTable::, U1>::new(&denominator, &r); + + let mut p_or_q = vec![p_or_q_0]; + p_or_q.extend_from_slice(&self.u_or_v); + let p_or_q_extrapolated = lagrange_table.eval(&p_or_q)[0]; + + let denominator_g = CanonicalLagrangeDenominator::>::new(); + let lagrange_table_g = LagrangeTable::, U1>::new(&denominator_g, &r); + let out_share = lagrange_table_g.eval(&zkp.g)[0]; + + (p_or_q_extrapolated, out_share) + } } #[cfg(all(test, unit_test))] mod test { - use typenum::{U4, U7}; + use typenum::{U2, U4, U5, U7}; use super::ProofVerifier; use crate::{ @@ -91,7 +117,7 @@ mod test { }; #[test] - fn sample_proof() { + fn sample_proof_u() { const U_1: [u128; 32] = [ 0, 30, 0, 16, 0, 1, 0, 15, 0, 0, 0, 16, 0, 30, 0, 16, 29, 1, 1, 15, 0, 0, 1, 15, 2, 30, 30, 16, 0, 0, 30, 16, @@ -110,7 +136,13 @@ mod test { const EXPECTED_G_R_2: u128 = 13; const EXPECTED_B_2: u128 = 0; + const ZKP_3: [u128; 5] = [21, 1, 6, 25, 1]; const U_3: [u128; 2] = [3, 3]; + const R_3: u128 = 30; + const P_RANDOM_WEIGHT: u128 = 12; + + const EXPECTED_P_FINAL: u128 = 30; + const EXPECTED_G_R_FINAL: u128 = 0; let pv_1: ProofVerifier = ProofVerifier::new( U_1.into_iter() @@ -140,5 +172,87 @@ mod test { U_3, ); assert_eq!(pv_3.out_share.as_u128(), EXPECTED_G_R_2); + + // final iteration + let zkp_3 = ZeroKnowledgeProof::::new(ZKP_3.map(|x| Fp31::try_from(x).unwrap())); + + let (p_final, out_share) = pv_3.verify_final_proof::( + zkp_3, + Fp31::try_from(R_3).unwrap(), + Fp31::try_from(P_RANDOM_WEIGHT).unwrap(), + ); + + assert_eq!(p_final.as_u128(), EXPECTED_P_FINAL); + assert_eq!(out_share.as_u128(), EXPECTED_G_R_FINAL); + } + + #[test] + fn sample_proof_v() { + const V_1: [u128; 32] = [ + 0, 0, 0, 30, 0, 0, 0, 1, 30, 30, 30, 30, 0, 0, 30, 30, 0, 30, 0, 30, 0, 0, 0, 1, 0, 0, + 1, 1, 0, 0, 1, 1, + ]; + const OUT_1: u128 = 0; + const ZKP_1: [u128; 7] = [0, 30, 16, 13, 25, 3, 6]; + const R_1: u128 = 22; + + const EXPECTED_G_R_1: u128 = 10; + const EXPECTED_B_1: u128 = 28; + + const V_2: [u128; 8] = [10, 21, 30, 28, 15, 21, 3, 3]; + const ZKP_2: [u128; 7] = [1, 12, 29, 30, 7, 7, 3]; + const R_2: u128 = 17; + + const EXPECTED_G_R_2: u128 = 12; + const EXPECTED_B_2: u128 = 0; + + const ZKP_3: [u128; 5] = [22, 14, 4, 20, 16]; + const V_3: [u128; 2] = [5, 24]; + const R_3: u128 = 30; + const Q_RANDOM_WEIGHT: u128 = 1; + + const EXPECTED_Q_FINAL: u128 = 12; + const EXPECTED_G_R_FINAL: u128 = 19; + + let pv_1: ProofVerifier = ProofVerifier::new( + V_1.into_iter() + .map(|x| Fp31::try_from(x).unwrap()) + .collect(), + Fp31::try_from(OUT_1).unwrap(), + ); + + // first iteration + let zkp_1 = ZeroKnowledgeProof::::new(ZKP_1.map(|x| Fp31::try_from(x).unwrap())); + + let (b_share_1, pv_2) = pv_1.verify_proof::(zkp_1, Fp31::try_from(R_1).unwrap()); + assert_eq!(b_share_1.as_u128(), EXPECTED_B_1); + assert_eq!( + pv_2.u_or_v.iter().map(Fp31::as_u128).collect::>(), + V_2, + ); + assert_eq!(pv_2.out_share.as_u128(), EXPECTED_G_R_1); + + // second iteration + let zkp_2 = ZeroKnowledgeProof::::new(ZKP_2.map(|x| Fp31::try_from(x).unwrap())); + + let (b_share_2, pv_3) = pv_2.verify_proof::(zkp_2, Fp31::try_from(R_2).unwrap()); + assert_eq!(b_share_2.as_u128(), EXPECTED_B_2); + assert_eq!( + pv_3.u_or_v.iter().map(Fp31::as_u128).collect::>(), + V_3, + ); + assert_eq!(pv_3.out_share.as_u128(), EXPECTED_G_R_2); + + // final iteration + let zkp_3 = ZeroKnowledgeProof::::new(ZKP_3.map(|x| Fp31::try_from(x).unwrap())); + + let (q_final, out_share) = pv_3.verify_final_proof::( + zkp_3, + Fp31::try_from(R_3).unwrap(), + Fp31::try_from(Q_RANDOM_WEIGHT).unwrap(), + ); + + assert_eq!(q_final.as_u128(), EXPECTED_Q_FINAL); + assert_eq!(out_share.as_u128(), EXPECTED_G_R_FINAL); } } From 514f7a108f97fd6c11dc17f5a295924413dd1d28 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Tue, 19 Mar 2024 01:36:24 +1000 Subject: [PATCH 084/135] clippy --- .../ipa_prf/malicious_security/verifier.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/verifier.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/verifier.rs index 08aa7b5a0..812f30db0 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/verifier.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/verifier.rs @@ -31,7 +31,7 @@ where pub fn verify_proof<λ: ArrayLength>( &self, - zkp: ZeroKnowledgeProof>, + zkp: &ZeroKnowledgeProof>, r: F, ) -> (F, ProofVerifier) where @@ -78,7 +78,7 @@ where pub fn verify_final_proof<λ>( &self, - zkp: ZeroKnowledgeProof>, + zkp: &ZeroKnowledgeProof>, r: F, p_or_q_0: F, ) -> (F, F) @@ -154,7 +154,7 @@ mod test { // first iteration let zkp_1 = ZeroKnowledgeProof::::new(ZKP_1.map(|x| Fp31::try_from(x).unwrap())); - let (b_share_1, pv_2) = pv_1.verify_proof::(zkp_1, Fp31::try_from(R_1).unwrap()); + let (b_share_1, pv_2) = pv_1.verify_proof::(&zkp_1, Fp31::try_from(R_1).unwrap()); assert_eq!(b_share_1.as_u128(), EXPECTED_B_1); assert_eq!( pv_2.u_or_v.iter().map(Fp31::as_u128).collect::>(), @@ -165,7 +165,7 @@ mod test { // second iteration let zkp_2 = ZeroKnowledgeProof::::new(ZKP_2.map(|x| Fp31::try_from(x).unwrap())); - let (b_share_2, pv_3) = pv_2.verify_proof::(zkp_2, Fp31::try_from(R_2).unwrap()); + let (b_share_2, pv_3) = pv_2.verify_proof::(&zkp_2, Fp31::try_from(R_2).unwrap()); assert_eq!(b_share_2.as_u128(), EXPECTED_B_2); assert_eq!( pv_3.u_or_v.iter().map(Fp31::as_u128).collect::>(), @@ -177,7 +177,7 @@ mod test { let zkp_3 = ZeroKnowledgeProof::::new(ZKP_3.map(|x| Fp31::try_from(x).unwrap())); let (p_final, out_share) = pv_3.verify_final_proof::( - zkp_3, + &zkp_3, Fp31::try_from(R_3).unwrap(), Fp31::try_from(P_RANDOM_WEIGHT).unwrap(), ); @@ -224,7 +224,7 @@ mod test { // first iteration let zkp_1 = ZeroKnowledgeProof::::new(ZKP_1.map(|x| Fp31::try_from(x).unwrap())); - let (b_share_1, pv_2) = pv_1.verify_proof::(zkp_1, Fp31::try_from(R_1).unwrap()); + let (b_share_1, pv_2) = pv_1.verify_proof::(&zkp_1, Fp31::try_from(R_1).unwrap()); assert_eq!(b_share_1.as_u128(), EXPECTED_B_1); assert_eq!( pv_2.u_or_v.iter().map(Fp31::as_u128).collect::>(), @@ -235,7 +235,7 @@ mod test { // second iteration let zkp_2 = ZeroKnowledgeProof::::new(ZKP_2.map(|x| Fp31::try_from(x).unwrap())); - let (b_share_2, pv_3) = pv_2.verify_proof::(zkp_2, Fp31::try_from(R_2).unwrap()); + let (b_share_2, pv_3) = pv_2.verify_proof::(&zkp_2, Fp31::try_from(R_2).unwrap()); assert_eq!(b_share_2.as_u128(), EXPECTED_B_2); assert_eq!( pv_3.u_or_v.iter().map(Fp31::as_u128).collect::>(), @@ -247,7 +247,7 @@ mod test { let zkp_3 = ZeroKnowledgeProof::::new(ZKP_3.map(|x| Fp31::try_from(x).unwrap())); let (q_final, out_share) = pv_3.verify_final_proof::( - zkp_3, + &zkp_3, Fp31::try_from(R_3).unwrap(), Fp31::try_from(Q_RANDOM_WEIGHT).unwrap(), ); From 6301f533929c19eda86f6ba4ea05b65c218712e4 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Mon, 11 Mar 2024 17:46:10 -0700 Subject: [PATCH 085/135] Bit matrix transposes for converting to/from vectorized shares --- Cargo.toml | 4 + ipa-core/Cargo.toml | 5 + ipa-core/benches/transpose.rs | 113 +++ ipa-core/src/ff/boolean_array.rs | 21 + ipa-core/src/secret_sharing/decomposed.rs | 20 +- ipa-core/src/secret_sharing/mod.rs | 6 +- .../replicated/semi_honest/additive_share.rs | 22 + ipa-core/src/secret_sharing/vector/array.rs | 85 +- ipa-core/src/secret_sharing/vector/impls.rs | 23 +- ipa-core/src/secret_sharing/vector/mod.rs | 4 + .../src/secret_sharing/vector/transpose.rs | 800 ++++++++++++++++++ 11 files changed, 1067 insertions(+), 36 deletions(-) create mode 100644 ipa-core/benches/transpose.rs create mode 100644 ipa-core/src/secret_sharing/vector/transpose.rs diff --git a/Cargo.toml b/Cargo.toml index 0a09034d9..a0a6301e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,10 @@ members = ["ipa-core", "ipa-macros"] incremental = true lto = "thin" +[profile.release-max] +inherits = "release" +codegen-units = 1 + [profile.bench-dhat] inherits = "bench" incremental = true diff --git a/ipa-core/Cargo.toml b/ipa-core/Cargo.toml index 6b064d09f..2eca7d8e7 100644 --- a/ipa-core/Cargo.toml +++ b/ipa-core/Cargo.toml @@ -216,6 +216,11 @@ path = "benches/oneshot/ipa.rs" harness = false required-features = ["enable-benches", "descriptive-gate"] +[[bench]] +name = "transpose" +harness = false +required-features = ["enable-benches"] + [[test]] name = "helper_networks" required-features = [ diff --git a/ipa-core/benches/transpose.rs b/ipa-core/benches/transpose.rs new file mode 100644 index 000000000..9350e9ccc --- /dev/null +++ b/ipa-core/benches/transpose.rs @@ -0,0 +1,113 @@ +//! Benchmarks for bit matrix transpose operations. +//! +//! Some of these routines run very fast, which doesn't work well with the default Criterion settings. +//! The warm up time and measurement time are reduced, because the defaults will produce a very large +//! number of samples (which in turn will take Criterion a long time to analyze). +//! +//! Some of the benchmark routines are looped so that the running time is long enough for Criterion +//! to measure reliably. When too short, Criterion complains that some measurements take zero time. +//! Presumably, the behavior of the underlying system clock is a contributing factor here. +//! +//! There is also a panic in the `plotters` crate used by Criterion to produce HTML reports that can +//! occur with very fast-running routines. This can be worked around by passing the `-n` option to +//! Criterion to disable HTML reports. + +use std::{array, iter::repeat_with, time::Duration}; + +use criterion::{criterion_group, criterion_main, BatchSize, BenchmarkId, Criterion, Throughput}; +use ipa_core::{ + ff::boolean_array::BA64, + secret_sharing::{ + vector::{transpose_16x16, transpose_8x8}, + SharedValue, TransposeFrom, + }, +}; +use rand::{ + distributions::{Distribution, Standard}, + thread_rng, Rng, +}; + +fn random_array() -> [T; N] +where + Standard: Distribution, +{ + let mut rng = thread_rng(); + array::from_fn(|_| rng.gen()) +} + +struct Params { + rows: usize, + cols: usize, + iters: usize, +} + +fn do_benchmark( + c: &mut Criterion, + Params { rows, cols, iters }: Params, + routine: fn(&[T; N]) -> O, +) where + Standard: Distribution, +{ + let mut group = c.benchmark_group(format!("{rows}x{cols}")); + group.warm_up_time(Duration::from_millis(200)); + group.measurement_time(Duration::from_millis(200)); + group.throughput(Throughput::Elements((rows * cols * iters) as u64)); + + group.bench_with_input( + BenchmarkId::new("transpose", format!("{iters}x")), + &(), + move |b, _| { + b.iter_batched_ref( + || repeat_with(random_array).take(iters).collect::>(), + |input| input.iter().map(routine).count(), + BatchSize::SmallInput, + ) + }, + ); + group.finish(); +} + +fn bench_8x8(c: &mut Criterion) { + do_benchmark( + c, + Params { + rows: 8, + cols: 8, + iters: 100, + }, + transpose_8x8, + ); +} + +fn bench_16x16(c: &mut Criterion) { + do_benchmark( + c, + Params { + rows: 16, + cols: 16, + iters: 50, + }, + transpose_16x16, + ); +} + +fn bench_64x64(c: &mut Criterion) { + do_benchmark( + c, + Params { + rows: 64, + cols: 64, + iters: 1, + }, + |src| { + let mut dst = array::from_fn(|_| BA64::ZERO); + dst.transpose_from(src); + dst + }, + ); +} + +criterion_group!(benches_8x8, bench_8x8); +criterion_group!(benches_16x16, bench_16x16); +criterion_group!(benches_64x64, bench_64x64); +criterion_main!(benches_8x8, benches_16x16, benches_64x64); diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index 4137d0eeb..8b421098b 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -269,6 +269,18 @@ macro_rules! boolean_array_impl { impl $name { #[cfg(all(test, unit_test))] const STORE_LEN: usize = bitvec::mem::elts::($bits); + + #[inline] + #[must_use] + pub fn as_raw_slice(&self) -> &[u8] { + self.0.as_raw_slice() + } + + #[inline] + #[must_use] + pub fn as_raw_mut_slice(&mut self) -> &mut [u8] { + self.0.as_raw_mut_slice() + } } impl ArrayAccess for $name { @@ -736,12 +748,21 @@ boolean_array_impl_small!(boolean_array_5, BA5, 5, fallible); boolean_array_impl_small!(boolean_array_6, BA6, 6, fallible); boolean_array_impl_small!(boolean_array_7, BA7, 7, fallible); boolean_array_impl_small!(boolean_array_8, BA8, 8, infallible); +boolean_array_impl_small!(boolean_array_16, BA16, 16, infallible); boolean_array_impl_small!(boolean_array_20, BA20, 20, fallible); boolean_array_impl_small!(boolean_array_32, BA32, 32, infallible); boolean_array_impl_small!(boolean_array_64, BA64, 64, infallible); boolean_array_impl_small!(boolean_array_112, BA112, 112, infallible); boolean_array_impl!(boolean_array_256, BA256, 256, infallible); +impl Vectorizable<256> for BA64 { + type Array = StdArray; +} + +impl Vectorizable<256> for BA256 { + type Array = StdArray; +} + // used to convert into Fp25519 impl From<(u128, u128)> for BA256 { fn from(value: (u128, u128)) -> Self { diff --git a/ipa-core/src/secret_sharing/decomposed.rs b/ipa-core/src/secret_sharing/decomposed.rs index 83555d3ab..f15455a87 100644 --- a/ipa-core/src/secret_sharing/decomposed.rs +++ b/ipa-core/src/secret_sharing/decomposed.rs @@ -1,4 +1,8 @@ -use std::{fmt::Debug, ops::Deref, slice}; +use std::{ + fmt::Debug, + ops::{Deref, DerefMut}, + slice, +}; use crate::{ error::Error, @@ -12,7 +16,7 @@ pub struct BitDecomposed { } impl BitDecomposed { - const MAX: usize = 64; + const MAX: usize = 256; /// Create a new value from an iterator. /// # Panics @@ -99,6 +103,12 @@ impl BitDecomposed { } } +impl BitDecomposed { + pub fn resize(&mut self, new_len: usize, value: S) { + self.bits.resize(new_len, value); + } +} + impl TryFrom> for BitDecomposed { type Error = Error; fn try_from(bits: Vec) -> Result { @@ -148,6 +158,12 @@ impl Deref for BitDecomposed { } } +impl DerefMut for BitDecomposed { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.bits + } +} + impl IntoIterator for BitDecomposed { type Item = S; type IntoIter = as IntoIterator>::IntoIter; diff --git a/ipa-core/src/secret_sharing/mod.rs b/ipa-core/src/secret_sharing/mod.rs index 64365bd51..eb1838f0e 100644 --- a/ipa-core/src/secret_sharing/mod.rs +++ b/ipa-core/src/secret_sharing/mod.rs @@ -3,7 +3,10 @@ pub mod replicated; mod decomposed; mod into_shares; mod scheme; +#[cfg(not(feature = "enable-benches"))] mod vector; +#[cfg(feature = "enable-benches")] +pub mod vector; use std::{ fmt::Debug, @@ -20,7 +23,8 @@ use rand::{ }; pub use scheme::{Bitwise, Linear, LinearRefOps, SecretSharing}; pub use vector::{ - FieldArray, FieldSimd, FieldVectorizable, SharedValueArray, StdArray, Vectorizable, + FieldArray, FieldSimd, FieldVectorizable, SharedValueArray, StdArray, TransposeFrom, + Vectorizable, }; #[cfg(any(test, feature = "test-fixture", feature = "cli"))] diff --git a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs index 817c870cd..c37bee4b1 100644 --- a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs +++ b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs @@ -102,6 +102,28 @@ impl, const N: usize> AdditiveShare { pub fn right_arr(&self) -> &>::Array { &self.1 } + + pub(in crate::secret_sharing) fn left_arr_mut(&mut self) -> &mut >::Array { + &mut self.0 + } + + pub(in crate::secret_sharing) fn right_arr_mut( + &mut self, + ) -> &mut >::Array { + &mut self.1 + } + + pub fn into_arr_tuple(self) -> (>::Array, >::Array) { + let Self(left, right) = self; + (left, right) + } + + pub fn from_fns V, RF: FnMut(usize) -> V>(lf: LF, rf: RF) -> Self { + Self( + >::Array::from_fn(lf), + >::Array::from_fn(rf), + ) + } } impl AdditiveShare diff --git a/ipa-core/src/secret_sharing/vector/array.rs b/ipa-core/src/secret_sharing/vector/array.rs index 13f476b2e..ce3c22f14 100644 --- a/ipa-core/src/secret_sharing/vector/array.rs +++ b/ipa-core/src/secret_sharing/vector/array.rs @@ -6,12 +6,12 @@ use std::{ }; use generic_array::{ArrayLength, GenericArray}; -use typenum::U32; +use typenum::{U16, U256, U32, U64}; use crate::{ error::LengthError, ff::{Field, Fp32BitPrime, Serializable}, - protocol::prss::{FromRandom, FromRandomU128}, + protocol::prss::FromRandom, secret_sharing::{FieldArray, Sendable, SharedValue, SharedValueArray}, }; @@ -277,14 +277,24 @@ impl FromRandom for StdArray { } } -impl FromRandom for StdArray { - type SourceLength = U32; +macro_rules! impl_from_random { + ($value_ty:ty, $width:expr, $source_len:ty, $item_len:expr) => { + impl FromRandom for StdArray<$value_ty, $width> { + type SourceLength = $source_len; - fn from_random(src: GenericArray) -> Self { - Self(array::from_fn(|i| Fp32BitPrime::from_random_u128(src[i]))) - } + fn from_random(src: GenericArray) -> Self { + Self(array::from_fn(|i| { + <$value_ty>::from_random( + GenericArray::from_slice(&src[$item_len * i..$item_len * (i + 1)]).clone(), + ) + })) + } + } + }; } +impl_from_random!(Fp32BitPrime, 32, U32, 1); + impl Serializable for StdArray { type Size = ::Size; type DeserializationError = ::DeserializationError; @@ -298,34 +308,45 @@ impl Serializable for StdArray { } } -impl Serializable for StdArray -where - V: SharedValue, - ::Size: Mul, - <::Size as Mul>::Output: ArrayLength, -{ - type Size = <::Size as Mul>::Output; - type DeserializationError = ::DeserializationError; - - fn serialize(&self, buf: &mut GenericArray) { - let sz: usize = (::BITS / 8).try_into().unwrap(); - for i in 0..32 { - self.0[i].serialize( - GenericArray::try_from_mut_slice(&mut buf[sz * i..sz * (i + 1)]).unwrap(), - ); - } - } - - fn deserialize(buf: &GenericArray) -> Result { - let sz: usize = (::BITS / 8).try_into().unwrap(); - let mut res = [V::ZERO; 32]; - for i in 0..32 { - res[i] = V::deserialize(GenericArray::from_slice(&buf[sz * i..sz * (i + 1)]))?; +macro_rules! impl_serializable { + ($width:expr, $width_ty:ty) => { + impl Serializable for StdArray + where + V: SharedValue, + ::Size: Mul<$width_ty>, + <::Size as Mul<$width_ty>>::Output: ArrayLength, + { + type Size = <::Size as Mul<$width_ty>>::Output; + type DeserializationError = ::DeserializationError; + + fn serialize(&self, buf: &mut GenericArray) { + let sz: usize = (::BITS / 8).try_into().unwrap(); + for i in 0..$width { + self.0[i].serialize( + GenericArray::try_from_mut_slice(&mut buf[sz * i..sz * (i + 1)]).unwrap(), + ); + } + } + + fn deserialize( + buf: &GenericArray, + ) -> Result { + let sz: usize = (::BITS / 8).try_into().unwrap(); + let mut res = [V::ZERO; $width]; + for i in 0..$width { + res[i] = V::deserialize(GenericArray::from_slice(&buf[sz * i..sz * (i + 1)]))?; + } + Ok(StdArray(res)) + } } - Ok(StdArray(res)) - } + }; } +impl_serializable!(16, U16); +impl_serializable!(32, U32); +impl_serializable!(64, U64); +impl_serializable!(256, U256); + #[cfg(all(test, unit_test))] mod test { use std::iter; diff --git a/ipa-core/src/secret_sharing/vector/impls.rs b/ipa-core/src/secret_sharing/vector/impls.rs index e29d8712b..2ada6571c 100644 --- a/ipa-core/src/secret_sharing/vector/impls.rs +++ b/ipa-core/src/secret_sharing/vector/impls.rs @@ -3,7 +3,7 @@ use crate::{ ff::{ boolean::Boolean, - boolean_array::{BA20, BA256, BA3, BA32, BA5, BA64, BA8}, + boolean_array::{BA16, BA20, BA256, BA3, BA32, BA5, BA64, BA8}, Fp32BitPrime, }, secret_sharing::{ @@ -43,7 +43,28 @@ macro_rules! boolean_vector { boolean_vector!(3, BA3); boolean_vector!(5, BA5); boolean_vector!(8, BA8); +boolean_vector!(16, BA16); boolean_vector!(20, BA20); boolean_vector!(32, BA32); boolean_vector!(64, BA64); boolean_vector!(256, BA256); + +/// Expands to the type for storing vectorized shares of a multi-bit boolean value. +/// +/// The "width" is the bit width of the value for each record. For example, a breakdown key might +/// have an 8-bit width. +/// +/// The "dimension" is the vectorization dimension, which is a number of records. For example, +/// there might be no vectorization (dimension = 1), or computation might be vectorized over +/// 256 records (dimension = 256). +/// +/// When the dimension is one, `BoolVector!(width, 1)` expands to an `AdditiveShare` of the Boolean +/// array type with the requested width. +/// +/// When the dimension is greater than one, `BoolVector!(width, dim)` expands to +/// `BitDecomposed>`. +#[macro_export] +macro_rules! BoolVector { + (16, 1) => { $crate::secret_sharing::replicated::semi_honest::AdditiveShare<$crate::ff::BA16> }; + ($width:expr, $dim:expr) => { BitDecomposed<$crate::secret_sharing::replicated::semi_honest::AdditiveShare<$crate::ff::boolean::Boolean, $dim>> }; +} diff --git a/ipa-core/src/secret_sharing/vector/mod.rs b/ipa-core/src/secret_sharing/vector/mod.rs index e276d7d22..4e4575af3 100644 --- a/ipa-core/src/secret_sharing/vector/mod.rs +++ b/ipa-core/src/secret_sharing/vector/mod.rs @@ -51,6 +51,10 @@ mod array; mod impls; mod traits; +mod transpose; pub use array::StdArray; pub use traits::{FieldArray, FieldSimd, FieldVectorizable, SharedValueArray, Vectorizable}; +pub use transpose::TransposeFrom; +#[cfg(feature = "enable-benches")] +pub use transpose::{transpose_16x16, transpose_8x8}; diff --git a/ipa-core/src/secret_sharing/vector/transpose.rs b/ipa-core/src/secret_sharing/vector/transpose.rs new file mode 100644 index 000000000..2ee1f9757 --- /dev/null +++ b/ipa-core/src/secret_sharing/vector/transpose.rs @@ -0,0 +1,800 @@ +//! Bit matrix transpose operations. +//! +//! These are used to convert data to and from vectorized representation. +//! +//! For example, if there is a 32-bit value associated with each record, the natural storage +//! representation for those values is something like a `Vec`, with the vector indexed by +//! records. +//! +//! In vectorized code, we instead want to use something like `BitDecomposed`, where each +//! `BA16` holds the value of a particular bit for each of 16 records, and the `BitDecomposed` +//! (which is just a wrapper around a `Vec`) is indexed by bits. +//! +//! To convert between these representations we need to transpose a 16x32 bit matrix into a 32x16 +//! bit matrix. +//! +//! This module stores bytes and bits are in little-endian order. Less significant bytes store data +//! closer to the top or left of the matrix. Within each byte, the first (leftmost) column is in +//! the least significant bit, and the last (rightmost) column is in the most significant bit. +//! +//! These implementations are somewhat optimized; it is certainly possible to optimize further, but +//! that is only worthwhile if profiling indicates this is a significant contributor to our overall +//! performance. Also, for some functions, the generated code is much better with `codegen-units = +//! 1` than with the default codegen-units (unfortunately, `codegen-units = 1` significantly +//! increases compile time). See [rust issue 47745](https://github.com/rust-lang/rust/issues/47745). +//! +//! Some possibilities for further optimization: +//! * Use codegen-units = 1 or figure out how to get comparable codegen without it. +//! * Avoid cost of zero-initializing the transpose destination. +//! * Use Rust's portable SIMD abstraction (not yet stable as of early 2024), or code directly +//! against platform SIMD intrinsics. +//! +//! For more ideas on optimizing bit matrix transposes in rust, see: +//! * +//! * + +// This rule throws false positives on "MxN". +#![allow(clippy::doc_markdown)] + +use std::array; + +use crate::{ + ff::{ + boolean::Boolean, + boolean_array::{BA16, BA256, BA64}, + }, + secret_sharing::{ + replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, + BitDecomposed, SharedValue, StdArray, + }, +}; + +/// Trait for overwriting a value with the transpose of a source value. +pub trait TransposeFrom { + fn transpose_from(&mut self, src: T); + + fn transposed_from(src: T) -> Self + where + Self: Default, + { + let mut dst = Self::default(); + dst.transpose_from(src); + dst + } +} + +/// 8x8 bit matrix transpose. +// +// From Hacker's Delight (2nd edition), Figure 7-6. +#[cfg(any(all(test, unit_test), feature = "enable-benches"))] +#[allow(clippy::trivially_copy_pass_by_ref)] // Keeps interface consistent with other functions. +#[inline] +pub fn transpose_8x8(x: &[u8; 8]) -> [u8; 8] { + let mut x = u64::from_le_bytes(*x); + + x = x & 0xaa55_aa55_aa55_aa55 + | (x & 0x00aa_00aa_00aa_00aa) << 7 + | (x >> 7) & 0x00aa_00aa_00aa_00aa; + + x = x & 0xcccc_3333_cccc_3333 + | (x & 0x0000_cccc_0000_cccc) << 14 + | (x >> 14) & 0x0000_cccc_0000_cccc; + + x = x & 0xf0f0_f0f0_0f0f_0f0f + | (x & 0x0000_0000_f0f0_f0f0) << 28 + | (x >> 28) & 0x0000_0000_f0f0_f0f0; + + x.to_le_bytes() +} + +/// 16x16 bit matrix transpose. +// +// Loosely based on Hacker's Delight (2nd edition), Figure 7-6. +#[inline] +pub fn transpose_16x16(src: &[u8; 32]) -> [u8; 32] { + let x: [u64; 4] = + array::from_fn(|i| u64::from_le_bytes(src[8 * i..8 * (i + 1)].try_into().unwrap())); + + let mut y0 = [0u64; 4]; + let s0 = 15; + let mut y1 = [0u64; 4]; + let s1 = 30; + for i in 0..4 { + y0[i] = x[i] & 0xaaaa_5555_aaaa_5555 + | (x[i] & 0x0000_aaaa_0000_aaaa) << s0 + | (x[i] >> s0) & 0x0000_aaaa_0000_aaaa; + + y1[i] = y0[i] & 0xcccc_cccc_3333_3333 + | (y0[i] & 0x0000_0000_cccc_cccc) << s1 + | (y0[i] >> s1) & 0x0000_0000_cccc_cccc; + } + + let y1_swp = [y1[1], y1[0], y1[3], y1[2]]; + let m2a = [ + 0x0f0f_0f0f_0f0f_0f0f, + 0xf0f0_f0f0_f0f0_f0f0, + 0x0f0f_0f0f_0f0f_0f0f, + 0xf0f0_f0f0_f0f0_f0f0, + ]; + let m2b = [0xf0f0_f0f0_f0f0_f0f0, 0, 0xf0f0_f0f0_f0f0_f0f0, 0]; + let m2c = [0, 0xf0f0_f0f0_f0f0_f0f0, 0, 0xf0f0_f0f0_f0f0_f0f0]; + let s2 = 4; + let mut y2 = [0u64; 4]; + for i in 0..4 { + y2[i] = y1[i] & m2a[i] | (y1_swp[i] << s2) & m2b[i] | (y1_swp[i] & m2c[i]) >> s2; + } + + let mut y3 = [0u64; 4]; + for i in 0..2 { + y3[i] = y2[i] & 0x00ff_00ff_00ff_00ff | (y2[i + 2] & 0x00ff_00ff_00ff_00ff) << 8; + } + for i in 0..2 { + y3[i + 2] = (y2[i] & 0xff00_ff00_ff00_ff00) >> 8 | y2[i + 2] & 0xff00_ff00_ff00_ff00; + } + + let mut dst = [0u8; 32]; + for i in 0..4 { + *<&mut [u8; 8] as TryFrom<&mut [u8]>>::try_from(&mut dst[8 * i..8 * (i + 1)]).unwrap() = + y3[i].to_le_bytes(); + } + dst +} + +// Degenerate transposes. + +impl TransposeFrom> for Vec> { + fn transpose_from(&mut self, src: AdditiveShare) { + *self = vec![src]; + } +} + +impl TransposeFrom>> for Vec { + fn transpose_from(&mut self, src: Vec>) { + *self = vec![src.iter().map(Boolean::from_array).collect::()]; + } +} + +/// Perform a larger transpose using an 16x16 kernel. +/// +/// Matrix height and width must be multiples of 16. +#[inline] +fn do_transpose_16 [u8; 32], DF: FnMut(usize, usize, [u8; 32])>( + rows_div16: usize, + cols_div16: usize, + read_src: SF, + mut write_dst: DF, +) { + for i in 0..rows_div16 { + for j in 0..cols_div16 { + let m = read_src(i, j); + let m_t = transpose_16x16(&m); + write_dst(j, i, m_t); + } + } +} + +/// Implement a transpose of a MxN bit matrix represented as `[BA{N}; {M}]` into a NxM bit matrix +/// represented as `[BA{M}; {N}]`. +/// +/// The invocation looks like `impl_transpose_ba_to_ba!(BA, BA, , )`. e.g. for MxN = 16x64, +/// `impl_transpose_ba_to_ba!(BA16, BA64, 16, 64)`. Or to put it differently, write the MxN dimensions +/// twice, first with BA in front, and then without. +macro_rules! impl_transpose_ba_to_ba { + ($dst_row:ty, $src_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident) => { + impl TransposeFrom<&[$src_row; $src_rows]> for [$dst_row; $src_cols] { + fn transpose_from(&mut self, src: &[$src_row; $src_rows]) { + do_transpose_16( + $src_rows / 16, + $src_cols / 16, + |i, j| { + let mut d = [0u8; 32]; + for k in 0..16 { + d[2 * k..2 * (k + 1)].copy_from_slice( + &src[16 * i + k].as_raw_slice()[2 * j..2 * (j + 1)], + ); + } + d + }, + |i, j, d| { + for k in 0..16 { + self[16 * i + k].as_raw_mut_slice()[2 * j..2 * (j + 1)] + .copy_from_slice(&d[2 * k..2 * (k + 1)]); + } + }, + ); + } + } + + #[cfg(all(test, unit_test))] + #[test] + fn $test_fn() { + tests::test_transpose_ba_to_ba::<$dst_row, $src_row, $src_rows, $src_cols>(); + } + + impl TransposeFrom<&BitDecomposed<$src_row>> for Vec<$dst_row> { + fn transpose_from(&mut self, src: &BitDecomposed<$src_row>) { + self.resize($src_cols, <$dst_row>::ZERO); + let src = <&[$src_row; $src_rows]>::try_from(&**src).unwrap(); + let dst = <&mut [$dst_row; $src_cols]>::try_from(&mut **self).unwrap(); + dst.transpose_from(src); + } + } + + impl TransposeFrom<&[$src_row; $src_rows]> for Vec<$dst_row> { + fn transpose_from(&mut self, src: &[$src_row; $src_rows]) { + self.resize($src_cols, <$dst_row>::ZERO); + let dst = <&mut [$dst_row; $src_cols]>::try_from(&mut **self).unwrap(); + dst.transpose_from(src); + } + } + }; +} + +impl_transpose_ba_to_ba!(BA16, BA64, 16, 64, test_transpose_ba_16x64); +impl_transpose_ba_to_ba!(BA64, BA64, 64, 64, test_transpose_ba_64x64); +impl_transpose_ba_to_ba!(BA256, BA64, 256, 64, test_transpose_ba_256x64); +impl_transpose_ba_to_ba!(BA256, BA256, 256, 256, test_transpose_ba_256x256); + +/// Implement a transpose of a MxN matrix of secret-shared bits represented as +/// `[AdditiveShare; ]` into a NxM bit matrix represented as `[AdditiveShare>; N]`. +/// +/// For MxN = 256x64, the invocation looks like `impl_transpose_bool_to_ba!(BA256, 256, 64)`. +macro_rules! impl_transpose_shares_bool_to_ba { + ($dst_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident) => { + impl TransposeFrom<&[AdditiveShare; $src_rows]> + for [AdditiveShare<$dst_row>; $src_cols] + { + fn transpose_from(&mut self, src: &[AdditiveShare; $src_rows]) { + // Transpose left share + do_transpose_16( + $src_rows / 16, + $src_cols / 16, + |i, j| { + let mut d = [0u8; 32]; + for k in 0..16 { + d[2 * k..2 * (k + 1)].copy_from_slice( + &src[16 * i + k].left_arr().as_raw_slice()[2 * j..2 * (j + 1)], + ); + } + d + }, + |i, j, d| { + for k in 0..16 { + self[16 * i + k].left_arr_mut().0[0].as_raw_mut_slice() + [2 * j..2 * (j + 1)] + .copy_from_slice(&d[2 * k..2 * (k + 1)]); + } + }, + ); + // Transpose right share + do_transpose_16( + $src_rows / 16, + $src_cols / 16, + |i, j| { + let mut d = [0u8; 32]; + for k in 0..16 { + d[2 * k..2 * (k + 1)].copy_from_slice( + &src[16 * i + k].right_arr().as_raw_slice()[2 * j..2 * (j + 1)], + ); + } + d + }, + |i, j, d| { + for k in 0..16 { + self[16 * i + k].right_arr_mut().0[0].as_raw_mut_slice() + [2 * j..2 * (j + 1)] + .copy_from_slice(&d[2 * k..2 * (k + 1)]); + } + }, + ); + } + } + + #[cfg(all(test, unit_test))] + #[test] + fn $test_fn() { + tests::test_transpose_shares_bool_to_ba::<$dst_row, $src_rows, $src_cols>(); + } + + impl TransposeFrom<&BitDecomposed>> + for Vec> + { + fn transpose_from(&mut self, src: &BitDecomposed>) { + self.resize($src_cols, AdditiveShare::<$dst_row>::ZERO); + let src = + <&[AdditiveShare; $src_rows]>::try_from(&**src).unwrap(); + let dst = + <&mut [AdditiveShare<$dst_row>; $src_cols]>::try_from(&mut **self).unwrap(); + dst.transpose_from(src); + } + } + }; +} + +impl_transpose_shares_bool_to_ba!(BA256, 256, 16, test_transpose_shares_bool_to_ba_256x16); +impl_transpose_shares_bool_to_ba!(BA256, 256, 64, test_transpose_shares_bool_to_ba_256x64); +impl_transpose_shares_bool_to_ba!(BA256, 256, 256, test_transpose_shares_bool_to_ba_256x256); + +/// Implement a transpose of a MxN matrix of secret-shared bits accessed via +/// `Fn(usize) -> AdditiveShare` into a NxM bit matrix represented as `[AdditiveShare; N]`. +/// +/// For MxN = 256x64, the invocation looks like `impl_transpose_shares_ba_fn_to_bool!(BA64, 256, 64)`. +macro_rules! impl_transpose_shares_ba_fn_to_bool { + ($src_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident) => { + // This function-based access to the source is useful when the source is not contiguous in + // memory (i.e. accessing the match key for each input record). However, it does not + // optimize as well as the other implementations (even without the dynamic dispatch). + impl TransposeFrom<&dyn Fn(usize) -> AdditiveShare<$src_row>> + for [AdditiveShare; $src_cols] + { + fn transpose_from(&mut self, src: &dyn Fn(usize) -> AdditiveShare<$src_row>) { + // Transpose left share + do_transpose_16( + $src_rows / 16, + $src_cols / 16, + |i, j| { + let mut d = [0u8; 32]; + for k in 0..16 { + d[2 * k..2 * (k + 1)].copy_from_slice( + &src(16 * i + k).left().as_raw_slice()[2 * j..2 * (j + 1)], + ); + } + d + }, + |i, j, d| { + for k in 0..16 { + self[16 * i + k].left_arr_mut().as_raw_mut_slice()[2 * j..2 * (j + 1)] + .copy_from_slice(&d[2 * k..2 * (k + 1)]); + } + }, + ); + // Transpose right share + do_transpose_16( + $src_rows / 16, + $src_cols / 16, + |i, j| { + let mut d = [0u8; 32]; + for k in 0..16 { + d[2 * k..2 * (k + 1)].copy_from_slice( + &src(16 * i + k).right().as_raw_slice()[2 * j..2 * (j + 1)], + ); + } + d + }, + |i, j, d| { + for k in 0..16 { + self[16 * i + k].right_arr_mut().as_raw_mut_slice()[2 * j..2 * (j + 1)] + .copy_from_slice(&d[2 * k..2 * (k + 1)]); + } + }, + ); + } + } + + impl TransposeFrom<&dyn Fn(usize) -> AdditiveShare<$src_row>> + for BitDecomposed> + { + fn transpose_from(&mut self, src: &dyn Fn(usize) -> AdditiveShare<$src_row>) { + self.resize($src_cols, AdditiveShare::::ZERO); + let dst = + <&mut [AdditiveShare; $src_cols]>::try_from(&mut **self) + .unwrap(); + dst.transpose_from(src); + } + } + }; +} + +impl_transpose_shares_ba_fn_to_bool!(BA64, 16, 64, test_transpose_shares_ba_fn_to_bool_16x64); +impl_transpose_shares_ba_fn_to_bool!(BA64, 256, 64, test_transpose_shares_ba_fn_to_bool_256x64); + +/// Implement a transpose of a MxN matrix of secret-shared bits represented as +/// `[AdditiveShare; ]` into a NxM bit matrix represented as `[AdditiveShare>; N]`. +/// +/// For MxN = 256x64, the invocation looks like `impl_transpose_bool_to_bool!(BA64, 256, 64)`. +macro_rules! impl_transpose_shares_bool_to_bool { + ($src_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident) => { + impl TransposeFrom<&[AdditiveShare; $src_rows]> + for [AdditiveShare; $src_cols] + { + fn transpose_from(&mut self, src: &[AdditiveShare; $src_rows]) { + // Transpose left share + do_transpose_16( + $src_rows / 16, + $src_cols / 16, + |i, j| { + let mut d = [0u8; 32]; + for k in 0..16 { + d[2 * k..2 * (k + 1)].copy_from_slice( + &src[16 * i + k].left_arr().as_raw_slice()[2 * j..2 * (j + 1)], + ); + } + d + }, + |i, j, d| { + for k in 0..16 { + self[16 * i + k].left_arr_mut().as_raw_mut_slice()[2 * j..2 * (j + 1)] + .copy_from_slice(&d[2 * k..2 * (k + 1)]); + } + }, + ); + // Transpose right share + do_transpose_16( + $src_rows / 16, + $src_cols / 16, + |i, j| { + let mut d = [0u8; 32]; + for k in 0..16 { + d[2 * k..2 * (k + 1)].copy_from_slice( + &src[16 * i + k].right_arr().as_raw_slice()[2 * j..2 * (j + 1)], + ); + } + d + }, + |i, j, d| { + for k in 0..16 { + self[16 * i + k].right_arr_mut().as_raw_mut_slice()[2 * j..2 * (j + 1)] + .copy_from_slice(&d[2 * k..2 * (k + 1)]); + } + }, + ); + } + } + + #[cfg(all(test, unit_test))] + #[test] + fn $test_fn() { + tests::test_transpose_shares_bool_to_bool::<$src_rows, $src_cols>(); + } + + impl TransposeFrom<&[AdditiveShare]> + for BitDecomposed> + { + fn transpose_from(&mut self, src: &[AdditiveShare]) { + let src = <&[AdditiveShare; $src_rows]>::try_from(src).unwrap(); + self.transpose_from(src); + } + } + + impl TransposeFrom<&[AdditiveShare; $src_rows]> + for BitDecomposed> + { + fn transpose_from(&mut self, src: &[AdditiveShare; $src_rows]) { + self.resize($src_cols, AdditiveShare::::ZERO); + let dst = + <&mut [AdditiveShare; $src_cols]>::try_from(&mut **self) + .unwrap(); + dst.transpose_from(src); + } + } + }; +} + +impl_transpose_shares_bool_to_bool!(BA64, 16, 64, test_transpose_shares_bool_to_bool_16x64); +impl_transpose_shares_bool_to_bool!(BA64, 64, 64, test_transpose_shares_bool_to_bool_64x64); +impl_transpose_shares_bool_to_bool!(BA64, 256, 64, test_transpose_shares_bool_to_bool_256x64); + +#[cfg(all(test, unit_test))] +mod tests { + // Using `.enumerate()` would just obfuscate the nested for loops verifying transposes. + #![allow(clippy::needless_range_loop)] + + use std::{ + array, + cmp::min, + fmt::Debug, + iter::repeat_with, + ops::{BitAnd, Not, Shl, Shr}, + }; + + use rand::{ + distributions::{Distribution, Standard}, + thread_rng, Rng, + }; + + use super::*; + use crate::{ff::ArrayAccess, secret_sharing::Vectorizable}; + + fn random_array() -> [T; N] + where + Standard: Distribution, + { + let mut rng = thread_rng(); + array::from_fn(|_| rng.gen()) + } + + trait ByteConversion { + type Bytes; + fn into_bytes(self) -> Self::Bytes; + fn from_bytes(bytes: Self::Bytes) -> Self; + } + + impl ByteConversion for [u8; 8] { + type Bytes = Self; + + fn into_bytes(self) -> Self::Bytes { + self + } + + fn from_bytes(bytes: Self::Bytes) -> Self { + bytes + } + } + + macro_rules! impl_byte_conversion { + ([$word:ty; $n_words:expr], [u8; $n_bytes:expr]) => { + impl ByteConversion for [$word; $n_words] { + type Bytes = [u8; $n_bytes]; + + fn into_bytes(self) -> Self::Bytes { + self.into_iter() + .flat_map(<$word>::to_le_bytes) + .collect::>() + .try_into() + .unwrap() + } + + fn from_bytes(bytes: Self::Bytes) -> Self { + const BYTES: usize = $n_bytes / $n_words; + bytes + .chunks_exact(BYTES) + .map(|slice| { + <$word>::from_le_bytes(<[u8; BYTES]>::try_from(slice).unwrap()) + }) + .collect::>() + .try_into() + .unwrap() + } + } + }; + } + + impl_byte_conversion!([u16; 16], [u8; 32]); + impl_byte_conversion!([u32; 32], [u8; 128]); + impl_byte_conversion!([u64; 64], [u8; 512]); + + fn test_transpose_array< + T, // Matrix integer type (e.g. u16 for 16x16) + const N: usize, // Matrix dimension + const NB: usize, // Matrix byte array size + >( + t_impl: fn(&[u8; NB]) -> [u8; NB], + ) where + T: Copy + + Debug + + Default + + PartialEq + + Not + + Shl + + Shr + + BitAnd, + [T; N]: Copy + Debug + PartialEq<[T; N]> + ByteConversion, + { + let zero = T::default(); + let one = !zero >> (N - 1); + + // Identity + let m: [u8; NB] = <[T; N]>::into_bytes(array::from_fn(|i| one << i)); + let m_t = t_impl(&m); + assert_eq!(m_t, m); + + // Anti-diagonal + let m: [u8; NB] = <[T; N]>::into_bytes(array::from_fn(|i| one << (N - 1 - i))); + let m_t = t_impl(&m); + assert_eq!(m_t, m); + + // Lower triangular + let m: [u8; NB] = <[T; N]>::into_bytes(array::from_fn(|i| !zero >> (N - 1 - i))); + let m_t = t_impl(&m); + assert_eq!(<[T; N]>::from_bytes(m_t), array::from_fn(|i| !zero << i)); + + // Random + let m: [u8; NB] = random_array(); + let m_t = t_impl(&m); + let m = <[T; N]>::from_bytes(m); + let m_t = <[T; N]>::from_bytes(m_t); + + for i in 0..N { + for j in 0..N { + assert_eq!((m_t[i] >> j) & one, (m[j] >> i) & one); + } + } + } + + #[test] + fn transpose_8x8() { + test_transpose_array::(super::transpose_8x8); + } + + #[test] + fn transpose_16x16() { + test_transpose_array::(super::transpose_16x16); + } + + // The order of type parameters matches the implementation macro: BA, BA, , + pub(super) fn test_transpose_ba_to_ba< + DR, // Destination row type + SR, // Source row type + const SM: usize, // Source rows (== dest cols) + const DM: usize, // Destination rows (== source cols) + >() + where + SR: PartialEq + SharedValue + ArrayAccess, + DR: PartialEq + SharedValue + ArrayAccess, + [DR; DM]: for<'a> TransposeFrom<&'a [SR; SM]>, + Standard: Distribution, + { + let t_impl = |src| { + let mut dst = [DR::ZERO; DM]; + dst.transpose_from(src); + dst + }; + + let step = min(SM, DM); + let m = array::from_fn(|i| { + let mut v = SR::ZERO; + for j in ((i % DM)..DM).step_by(step) { + v.set(j, Boolean::TRUE); + } + v + }); + let m_t = t_impl(&m); + assert_eq!( + m_t, + array::from_fn(|i| { + let mut v = DR::ZERO; + for j in ((i % SM)..SM).step_by(step) { + v.set(j, Boolean::TRUE); + } + v + }) + ); + + let mut rng = thread_rng(); + let m = repeat_with(|| rng.gen()).take(SM).collect::>(); + let m_t = t_impl(<&[SR; SM]>::try_from(m.as_slice()).unwrap()); + + for i in 0..DM { + for j in 0..SM { + assert_eq!(m_t[i].get(j), m[j].get(i)); + } + } + } + + // The order of type parameters matches the implementation macro: BA, , + pub(super) fn test_transpose_shares_bool_to_ba< + DR, // Destination row type + const SM: usize, // Source rows (== dest cols) + const DM: usize, // Destination rows (== source cols) + >() + where + Boolean: Vectorizable, + >::Array: ArrayAccess, + DR: SharedValue + ArrayAccess, + [AdditiveShare; DM]: for<'a> TransposeFrom<&'a [AdditiveShare; SM]>, + { + let t_impl = |src| { + let mut dst = [AdditiveShare::::ZERO; DM]; + dst.transpose_from(src); + dst + }; + + let step = min(SM, DM); + let m = array::from_fn(|i| { + let mut left = vec![Boolean::FALSE; DM]; + let mut right = vec![Boolean::FALSE; DM]; + for j in ((i % DM)..DM).step_by(step) { + let b = Boolean::from(j % 2 != 0); + left[j] = b; + right[j] = !b; + } + AdditiveShare::new_arr( + >::Array::from_iter(left), + >::Array::from_iter(right), + ) + }); + let m_t = t_impl(&m); + assert_eq!( + m_t, + array::from_fn(|i| { + let mut v = AdditiveShare::::ZERO; + for j in ((i % SM)..SM).step_by(step) { + let b = Boolean::from(j % 2 != 0); + v.set(j, AdditiveShare::new(b, !b)); + } + v + }) + ); + + let mut left_rng = thread_rng(); + let mut right_rng = thread_rng(); + let m = repeat_with(|| AdditiveShare::from_fns(|_| left_rng.gen(), |_| right_rng.gen())) + .take(SM) + .collect::>(); + let m_t = t_impl(<&[AdditiveShare; SM]>::try_from(m.as_slice()).unwrap()); + + for i in 0..DM { + for j in 0..SM { + assert_eq!( + m_t[i].get(j).unwrap().left(), + m[j].left_arr().get(i).unwrap() + ); + assert_eq!( + m_t[i].get(j).unwrap().right(), + m[j].right_arr().get(i).unwrap() + ); + } + } + } + + pub(super) fn test_transpose_shares_bool_to_bool< + const SM: usize, // Source rows (== dest cols) + const DM: usize, // Destination rows (== source cols) + >() + where + Boolean: Vectorizable, + >::Array: ArrayAccess, + Boolean: Vectorizable, + >::Array: ArrayAccess, + [AdditiveShare; DM]: + for<'a> TransposeFrom<&'a [AdditiveShare; SM]>, + { + let t_impl = |src| { + let mut dst = [AdditiveShare::::ZERO; DM]; + dst.transpose_from(src); + dst + }; + + let step = min(SM, DM); + let m = array::from_fn(|i| { + let mut left = vec![Boolean::FALSE; DM]; + let mut right = vec![Boolean::FALSE; DM]; + for j in ((i % DM)..DM).step_by(step) { + let b = Boolean::from(j % 2 != 0); + left[j] = b; + right[j] = !b; + } + AdditiveShare::new_arr( + >::Array::from_iter(left), + >::Array::from_iter(right), + ) + }); + let m_t = t_impl(&m); + assert_eq!( + m_t, + array::from_fn(|i| { + let mut left = vec![Boolean::FALSE; SM]; + let mut right = vec![Boolean::FALSE; SM]; + for j in ((i % SM)..SM).step_by(step) { + let b = Boolean::from(j % 2 != 0); + left[j] = b; + right[j] = !b; + } + AdditiveShare::new_arr( + >::Array::from_iter(left), + >::Array::from_iter(right), + ) + }) + ); + + let mut left_rng = thread_rng(); + let mut right_rng = thread_rng(); + let m = repeat_with(|| AdditiveShare::from_fns(|_| left_rng.gen(), |_| right_rng.gen())) + .take(SM) + .collect::>(); + let m_t = t_impl(<&[AdditiveShare; SM]>::try_from(m.as_slice()).unwrap()); + + for i in 0..DM { + for j in 0..SM { + assert_eq!( + m_t[i].left_arr().get(j).unwrap(), + m[j].left_arr().get(i).unwrap() + ); + assert_eq!( + m_t[i].right_arr().get(j).unwrap(), + m[j].right_arr().get(i).unwrap() + ); + } + } + } +} From 46f1a3a85ac5c15e09868c78171c21858b8b77ac Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Mon, 18 Mar 2024 17:04:49 -0700 Subject: [PATCH 086/135] PR feedback --- ipa-core/benches/transpose.rs | 5 +- .../src/secret_sharing/vector/transpose.rs | 151 +++++++++++++----- 2 files changed, 116 insertions(+), 40 deletions(-) diff --git a/ipa-core/benches/transpose.rs b/ipa-core/benches/transpose.rs index 9350e9ccc..e0b872e93 100644 --- a/ipa-core/benches/transpose.rs +++ b/ipa-core/benches/transpose.rs @@ -16,6 +16,7 @@ use std::{array, iter::repeat_with, time::Duration}; use criterion::{criterion_group, criterion_main, BatchSize, BenchmarkId, Criterion, Throughput}; use ipa_core::{ + error::UnwrapInfallible, ff::boolean_array::BA64, secret_sharing::{ vector::{transpose_16x16, transpose_8x8}, @@ -75,7 +76,7 @@ fn bench_8x8(c: &mut Criterion) { cols: 8, iters: 100, }, - transpose_8x8, + |m| transpose_8x8(m), ); } @@ -101,7 +102,7 @@ fn bench_64x64(c: &mut Criterion) { }, |src| { let mut dst = array::from_fn(|_| BA64::ZERO); - dst.transpose_from(src); + dst.transpose_from(src).unwrap_infallible(); dst }, ); diff --git a/ipa-core/src/secret_sharing/vector/transpose.rs b/ipa-core/src/secret_sharing/vector/transpose.rs index 2ee1f9757..8b4145671 100644 --- a/ipa-core/src/secret_sharing/vector/transpose.rs +++ b/ipa-core/src/secret_sharing/vector/transpose.rs @@ -36,9 +36,12 @@ // This rule throws false positives on "MxN". #![allow(clippy::doc_markdown)] -use std::array; +#[cfg(any(all(test, unit_test), feature = "enable-benches"))] +use std::borrow::Borrow; +use std::{array, convert::Infallible}; use crate::{ + error::{LengthError, UnwrapInfallible}, ff::{ boolean::Boolean, boolean_array::{BA16, BA256, BA64}, @@ -51,15 +54,25 @@ use crate::{ /// Trait for overwriting a value with the transpose of a source value. pub trait TransposeFrom { - fn transpose_from(&mut self, src: T); - - fn transposed_from(src: T) -> Self + type Error; + + /// Overwrite `self` with the transpose of `src`. + /// + /// # Errors + /// If the size of the source and destination are not compatible. + fn transpose_from(&mut self, src: T) -> Result<(), Self::Error>; + + /// Fills a new `Self` with the transpose of `src`. + /// + /// # Errors + /// If the size of the source and destination are not compatible. + fn transposed_from(src: T) -> Result where Self: Default, { let mut dst = Self::default(); - dst.transpose_from(src); - dst + dst.transpose_from(src)?; + Ok(dst) } } @@ -67,10 +80,9 @@ pub trait TransposeFrom { // // From Hacker's Delight (2nd edition), Figure 7-6. #[cfg(any(all(test, unit_test), feature = "enable-benches"))] -#[allow(clippy::trivially_copy_pass_by_ref)] // Keeps interface consistent with other functions. #[inline] -pub fn transpose_8x8(x: &[u8; 8]) -> [u8; 8] { - let mut x = u64::from_le_bytes(*x); +pub fn transpose_8x8>(x: B) -> [u8; 8] { + let mut x = u64::from_le_bytes(*x.borrow()); x = x & 0xaa55_aa55_aa55_aa55 | (x & 0x00aa_00aa_00aa_00aa) << 7 @@ -143,14 +155,20 @@ pub fn transpose_16x16(src: &[u8; 32]) -> [u8; 32] { // Degenerate transposes. impl TransposeFrom> for Vec> { - fn transpose_from(&mut self, src: AdditiveShare) { + type Error = Infallible; + + fn transpose_from(&mut self, src: AdditiveShare) -> Result<(), Infallible> { *self = vec![src]; + Ok(()) } } impl TransposeFrom>> for Vec { - fn transpose_from(&mut self, src: Vec>) { + type Error = Infallible; + + fn transpose_from(&mut self, src: Vec>) -> Result<(), Infallible> { *self = vec![src.iter().map(Boolean::from_array).collect::()]; + Ok(()) } } @@ -182,7 +200,9 @@ fn do_transpose_16 [u8; 32], DF: FnMut(usize, usize, [u8 macro_rules! impl_transpose_ba_to_ba { ($dst_row:ty, $src_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident) => { impl TransposeFrom<&[$src_row; $src_rows]> for [$dst_row; $src_cols] { - fn transpose_from(&mut self, src: &[$src_row; $src_rows]) { + type Error = Infallible; + + fn transpose_from(&mut self, src: &[$src_row; $src_rows]) -> Result<(), Infallible> { do_transpose_16( $src_rows / 16, $src_cols / 16, @@ -202,6 +222,7 @@ macro_rules! impl_transpose_ba_to_ba { } }, ); + Ok(()) } } @@ -212,19 +233,27 @@ macro_rules! impl_transpose_ba_to_ba { } impl TransposeFrom<&BitDecomposed<$src_row>> for Vec<$dst_row> { - fn transpose_from(&mut self, src: &BitDecomposed<$src_row>) { + type Error = LengthError; + + fn transpose_from(&mut self, src: &BitDecomposed<$src_row>) -> Result<(), LengthError> { self.resize($src_cols, <$dst_row>::ZERO); - let src = <&[$src_row; $src_rows]>::try_from(&**src).unwrap(); + let src = <&[$src_row; $src_rows]>::try_from(&**src).map_err(|_| LengthError { + expected: $src_rows, + actual: src.len(), + })?; let dst = <&mut [$dst_row; $src_cols]>::try_from(&mut **self).unwrap(); - dst.transpose_from(src); + dst.transpose_from(src).unwrap_infallible(); + Ok(()) } } impl TransposeFrom<&[$src_row; $src_rows]> for Vec<$dst_row> { - fn transpose_from(&mut self, src: &[$src_row; $src_rows]) { + type Error = Infallible; + + fn transpose_from(&mut self, src: &[$src_row; $src_rows]) -> Result<(), Infallible> { self.resize($src_cols, <$dst_row>::ZERO); let dst = <&mut [$dst_row; $src_cols]>::try_from(&mut **self).unwrap(); - dst.transpose_from(src); + dst.transpose_from(src) } } }; @@ -244,7 +273,12 @@ macro_rules! impl_transpose_shares_bool_to_ba { impl TransposeFrom<&[AdditiveShare; $src_rows]> for [AdditiveShare<$dst_row>; $src_cols] { - fn transpose_from(&mut self, src: &[AdditiveShare; $src_rows]) { + type Error = Infallible; + + fn transpose_from( + &mut self, + src: &[AdditiveShare; $src_rows], + ) -> Result<(), Infallible> { // Transpose left share do_transpose_16( $src_rows / 16, @@ -287,6 +321,7 @@ macro_rules! impl_transpose_shares_bool_to_ba { } }, ); + Ok(()) } } @@ -299,13 +334,22 @@ macro_rules! impl_transpose_shares_bool_to_ba { impl TransposeFrom<&BitDecomposed>> for Vec> { - fn transpose_from(&mut self, src: &BitDecomposed>) { + type Error = LengthError; + + fn transpose_from( + &mut self, + src: &BitDecomposed>, + ) -> Result<(), LengthError> { self.resize($src_cols, AdditiveShare::<$dst_row>::ZERO); - let src = - <&[AdditiveShare; $src_rows]>::try_from(&**src).unwrap(); + let src = <&[AdditiveShare; $src_rows]>::try_from(&**src) + .map_err(|_| LengthError { + expected: $src_rows, + actual: src.len(), + })?; let dst = <&mut [AdditiveShare<$dst_row>; $src_cols]>::try_from(&mut **self).unwrap(); - dst.transpose_from(src); + dst.transpose_from(src).unwrap_infallible(); + Ok(()) } } }; @@ -327,7 +371,12 @@ macro_rules! impl_transpose_shares_ba_fn_to_bool { impl TransposeFrom<&dyn Fn(usize) -> AdditiveShare<$src_row>> for [AdditiveShare; $src_cols] { - fn transpose_from(&mut self, src: &dyn Fn(usize) -> AdditiveShare<$src_row>) { + type Error = Infallible; + + fn transpose_from( + &mut self, + src: &dyn Fn(usize) -> AdditiveShare<$src_row>, + ) -> Result<(), Infallible> { // Transpose left share do_transpose_16( $src_rows / 16, @@ -368,18 +417,24 @@ macro_rules! impl_transpose_shares_ba_fn_to_bool { } }, ); + Ok(()) } } impl TransposeFrom<&dyn Fn(usize) -> AdditiveShare<$src_row>> for BitDecomposed> { - fn transpose_from(&mut self, src: &dyn Fn(usize) -> AdditiveShare<$src_row>) { + type Error = Infallible; + + fn transpose_from( + &mut self, + src: &dyn Fn(usize) -> AdditiveShare<$src_row>, + ) -> Result<(), Infallible> { self.resize($src_cols, AdditiveShare::::ZERO); let dst = <&mut [AdditiveShare; $src_cols]>::try_from(&mut **self) .unwrap(); - dst.transpose_from(src); + dst.transpose_from(src) } } }; @@ -397,7 +452,12 @@ macro_rules! impl_transpose_shares_bool_to_bool { impl TransposeFrom<&[AdditiveShare; $src_rows]> for [AdditiveShare; $src_cols] { - fn transpose_from(&mut self, src: &[AdditiveShare; $src_rows]) { + type Error = Infallible; + + fn transpose_from( + &mut self, + src: &[AdditiveShare; $src_rows], + ) -> Result<(), Infallible> { // Transpose left share do_transpose_16( $src_rows / 16, @@ -438,6 +498,7 @@ macro_rules! impl_transpose_shares_bool_to_bool { } }, ); + Ok(()) } } @@ -450,21 +511,34 @@ macro_rules! impl_transpose_shares_bool_to_bool { impl TransposeFrom<&[AdditiveShare]> for BitDecomposed> { - fn transpose_from(&mut self, src: &[AdditiveShare]) { - let src = <&[AdditiveShare; $src_rows]>::try_from(src).unwrap(); - self.transpose_from(src); + type Error = LengthError; + fn transpose_from( + &mut self, + src: &[AdditiveShare], + ) -> Result<(), LengthError> { + let src = <&[AdditiveShare; $src_rows]>::try_from(src) + .map_err(|_| LengthError { + expected: $src_rows, + actual: src.len(), + })?; + self.transpose_from(src).unwrap_infallible(); + Ok(()) } } impl TransposeFrom<&[AdditiveShare; $src_rows]> for BitDecomposed> { - fn transpose_from(&mut self, src: &[AdditiveShare; $src_rows]) { + type Error = Infallible; + fn transpose_from( + &mut self, + src: &[AdditiveShare; $src_rows], + ) -> Result<(), Infallible> { self.resize($src_cols, AdditiveShare::::ZERO); let dst = <&mut [AdditiveShare; $src_cols]>::try_from(&mut **self) .unwrap(); - dst.transpose_from(src); + dst.transpose_from(src) } } }; @@ -603,7 +677,7 @@ mod tests { #[test] fn transpose_8x8() { - test_transpose_array::(super::transpose_8x8); + test_transpose_array::(|m| super::transpose_8x8(m)); } #[test] @@ -621,12 +695,12 @@ mod tests { where SR: PartialEq + SharedValue + ArrayAccess, DR: PartialEq + SharedValue + ArrayAccess, - [DR; DM]: for<'a> TransposeFrom<&'a [SR; SM]>, + [DR; DM]: for<'a> TransposeFrom<&'a [SR; SM], Error = Infallible>, Standard: Distribution, { let t_impl = |src| { let mut dst = [DR::ZERO; DM]; - dst.transpose_from(src); + dst.transpose_from(src).unwrap_infallible(); dst }; @@ -671,11 +745,12 @@ mod tests { Boolean: Vectorizable, >::Array: ArrayAccess, DR: SharedValue + ArrayAccess, - [AdditiveShare; DM]: for<'a> TransposeFrom<&'a [AdditiveShare; SM]>, + [AdditiveShare; DM]: + for<'a> TransposeFrom<&'a [AdditiveShare; SM], Error = Infallible>, { let t_impl = |src| { let mut dst = [AdditiveShare::::ZERO; DM]; - dst.transpose_from(src); + dst.transpose_from(src).unwrap_infallible(); dst }; @@ -737,11 +812,11 @@ mod tests { Boolean: Vectorizable, >::Array: ArrayAccess, [AdditiveShare; DM]: - for<'a> TransposeFrom<&'a [AdditiveShare; SM]>, + for<'a> TransposeFrom<&'a [AdditiveShare; SM], Error = Infallible>, { let t_impl = |src| { let mut dst = [AdditiveShare::::ZERO; DM]; - dst.transpose_from(src); + dst.transpose_from(src).unwrap_infallible(); dst }; From a4a2aa205ac6baec70c83cd5559602361338b78f Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Mon, 18 Mar 2024 17:49:24 -0700 Subject: [PATCH 087/135] Fix redundant import warning (that may only be detected by nightly?) --- ipa-core/src/secret_sharing/vector/transpose.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/ipa-core/src/secret_sharing/vector/transpose.rs b/ipa-core/src/secret_sharing/vector/transpose.rs index 8b4145671..020cdb9a6 100644 --- a/ipa-core/src/secret_sharing/vector/transpose.rs +++ b/ipa-core/src/secret_sharing/vector/transpose.rs @@ -554,7 +554,6 @@ mod tests { #![allow(clippy::needless_range_loop)] use std::{ - array, cmp::min, fmt::Debug, iter::repeat_with, From 93388082704cdfc15a42aa002079c15c0c31452e Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Mon, 18 Mar 2024 17:42:02 -0700 Subject: [PATCH 088/135] Stream helpers for chunked processing Consolidate stream helpers under crate::helpers::stream. Remove old, unused `ChunkScan` helper. --- ipa-core/src/chunkscan.rs | 106 ---- ipa-core/src/helpers/mod.rs | 1 + ipa-core/src/helpers/stream/chunks.rs | 557 ++++++++++++++++++ ipa-core/src/{ => helpers/stream}/exact.rs | 2 +- ipa-core/src/helpers/stream/mod.rs | 5 + ipa-core/src/lib.rs | 2 - .../modulus_conversion/convert_shares.rs | 3 +- ipa-core/src/seq_join/mod.rs | 2 +- 8 files changed, 566 insertions(+), 112 deletions(-) delete mode 100644 ipa-core/src/chunkscan.rs create mode 100644 ipa-core/src/helpers/stream/chunks.rs rename ipa-core/src/{ => helpers/stream}/exact.rs (98%) create mode 100644 ipa-core/src/helpers/stream/mod.rs diff --git a/ipa-core/src/chunkscan.rs b/ipa-core/src/chunkscan.rs deleted file mode 100644 index 35591a91e..000000000 --- a/ipa-core/src/chunkscan.rs +++ /dev/null @@ -1,106 +0,0 @@ -use std::{ - future::Future, - mem, - pin::Pin, - task::{Context, Poll}, -}; - -use futures::{ready, Stream}; -use pin_project::pin_project; -use tracing::error; - -use crate::error::BoxError; - -/// A variant of stream transform that combines semantic of `StreamExt::chunks` and `StreamExt::scan`. -/// Consumes the input stream and keeps accumulating items in the internal buffer until it reaches -/// `capacity` elements. Then the elements are moved to the `f` function that must produce a future -/// resolvable to the same type as element type of the input stream. -/// -/// When elements are given to the `f` function, no other elements will be taken off the input stream -/// until the future returned by it is resolved. It is important to note that the resulting item -/// returned by this function is kept in the buffer, so next time stream is polled, only (`capacity`-1) -/// elements will be polled off before calling `f` again. -/// -/// If input stream yields `None` while buf does not have at least `capacity` elements, `f` will -/// be called on partial buf -#[pin_project] -pub struct ChunkScan { - /// Input stream - #[pin] - stream: St, - - /// how many elements to keep in the buffer before calling `f` - capacity: usize, - - /// Buffer for items taken off the input stream - buf: Vec, - - /// Transforms `Vec` -> Future> - f: F, - - /// future in progress - #[pin] - future: Option, -} - -impl Stream for ChunkScan -where - St: Stream, - St::Item: Clone, - F: FnMut(Vec) -> Fut, - Fut: Future>, -{ - type Item = St::Item; - - fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let mut this = self.as_mut().project(); - - loop { - // if future is set we poll it first before taking anything off the input stream - if let Some(fut) = this.future.as_mut().as_pin_mut() { - let item = ready!(fut.poll(cx)); - this.future.set(None); - - if let Err(e) = item { - // TODO (alex): we should propagate errors back to caller - error!({ e }, "An error occurred computing next stream element"); - return Poll::Ready(None); - } - let item = item.unwrap(); - this.buf.push(item.clone()); - - return Poll::Ready(Some(item)); - } else if let Some(item) = ready!(this.stream.as_mut().poll_next(cx)) { - // otherwise we poll the input stream - this.buf.push(item); - if this.buf.len() == *this.capacity { - let items = mem::replace(this.buf, Vec::with_capacity(2)); - this.future.set(Some((this.f)(items))); - } - } else if !this.buf.is_empty() { - // Input stream is closed, but we still have some items to process - let items = mem::take(this.buf); - this.future.set(Some((this.f)(items))); - } else { - return Poll::Ready(None); - } - } - } -} - -impl ChunkScan -where - St: Stream, - F: FnMut(Vec) -> Fut, - Fut: Future>, -{ - pub fn new(stream: St, capacity: usize, f: F) -> Self { - Self { - stream, - capacity, - buf: Vec::with_capacity(capacity), - f, - future: None, - } - } -} diff --git a/ipa-core/src/helpers/mod.rs b/ipa-core/src/helpers/mod.rs index f9f9acc42..3bccffc83 100644 --- a/ipa-core/src/helpers/mod.rs +++ b/ipa-core/src/helpers/mod.rs @@ -11,6 +11,7 @@ mod error; mod futures; mod gateway; pub(crate) mod prss_protocol; +pub mod stream; mod transport; use std::ops::{Index, IndexMut}; diff --git a/ipa-core/src/helpers/stream/chunks.rs b/ipa-core/src/helpers/stream/chunks.rs new file mode 100644 index 000000000..6a275aa9b --- /dev/null +++ b/ipa-core/src/helpers/stream/chunks.rs @@ -0,0 +1,557 @@ +use std::{ + future::Future, + iter::Take, + mem, + ops::Deref, + pin::Pin, + task::{Context, Poll}, +}; + +use futures::{Stream, TryStream}; +use pin_project::pin_project; + +use crate::error::Error; + +/// A chunk of `N` records that may be borrowed or owned. +/// +/// This type is used for the input data to processing functions. +#[derive(Clone, Debug)] +pub enum ChunkData<'a, T, const N: usize> { + Borrowed(&'a [T; N]), + Owned(Box<[T; N]>), +} + +impl<'a, T, const N: usize> Deref for ChunkData<'a, T, N> { + type Target = [T; N]; + + fn deref(&self) -> &Self::Target { + match *self { + ChunkData::Borrowed(r) => r, + ChunkData::Owned(ref v) => v.as_ref(), + } + } +} + +/// Tracks whether a chunk is full or partial. +/// +/// If the record count is not a multiple of the chunk size, the last chunk will be a partial chunk. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum ChunkType { + Full, + Partial(usize), +} + +impl ChunkType { + fn into_chunk(self, data: [T; N]) -> Chunk { + Chunk { + chunk_type: self, + data, + } + } +} + +/// An owned chunk that may be fully or partially valid. +/// +/// This type is used for the output data from processing functions. +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct Chunk { + chunk_type: ChunkType, + data: [T; N], +} + +impl Chunk { + pub fn new(chunk_type: ChunkType, data: [T; N]) -> Self { + Self { chunk_type, data } + } +} + +impl IntoIterator for Chunk { + type Item = T; + type IntoIter = Take<<[T; N] as IntoIterator>::IntoIter>; + + fn into_iter(self) -> Self::IntoIter { + let len = match self.chunk_type { + ChunkType::Full => N, + ChunkType::Partial(len) => len, + }; + self.data.into_iter().take(len) + } +} + +impl AsRef<[T]> for Chunk { + fn as_ref(&self) -> &[T] { + match self.chunk_type { + ChunkType::Full => self.data.as_slice(), + ChunkType::Partial(len) => &self.data[..len], + } + } +} + +/// Future for a chunk of processed data. +#[pin_project] +pub struct ChunkFuture +where + Fut: Future>, +{ + #[pin] + fut: Fut, + chunk_type: ChunkType, +} + +impl ChunkFuture +where + Fut: Future>, +{ + fn new(fut: Fut, chunk_type: ChunkType) -> Self { + Self { fut, chunk_type } + } +} + +impl Future for ChunkFuture +where + Fut: Future>, +{ + type Output = Result, Error>; + + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let this = self.project(); + match this.fut.poll(cx) { + Poll::Ready(Ok(data)) => Poll::Ready(Ok(this.chunk_type.into_chunk(data))), + Poll::Ready(Err(e)) => Poll::Ready(Err(e)), + Poll::Pending => Poll::Pending, + } + } +} + +/// Stream returned by `ProcessChunks::process_chunks`. +// +// We implement structural pinning for `process_fn` to avoid adding a bunch of `C: Unpin` bounds to +// the protocol code (even if those bounds are satisfiable). Structural pinning could be implemented +// for `dummy_fn` as well, but that isn't currently required to avoid `Unpin` bounds. +#[pin_project] +pub struct SliceChunkProcessor<'a, T, U, F, Fut, D, const N: usize> +where + T: Clone + 'a, + F: Fn(usize, ChunkData<'a, T, N>) -> Fut, + Fut: Future> + 'a, + D: Fn() -> T, +{ + slice: &'a [T], + + /// Current input position, counted in chunks. + pos: usize, + + /// Number of records in the final partial chunk. + /// + /// Cleared to zero after the partial chunk is processed. + remainder_len: usize, + + process_fn: F, + + dummy_fn: D, +} + +impl<'a, T, U, F, Fut, D, const N: usize> SliceChunkProcessor<'a, T, U, F, Fut, D, N> +where + T: Clone, + F: Fn(usize, ChunkData<'a, T, N>) -> Fut, + Fut: Future> + 'a, + D: Fn() -> T + Unpin, +{ + fn next_chunk(self: Pin<&mut Self>) -> Option> { + let this = self.project(); + + let whole_chunks = this.slice.len() / N; + + if *this.pos < whole_chunks { + let idx = *this.pos; + let slice = &this.slice[N * idx..N * (idx + 1)]; + *this.pos += 1; + Some(ChunkFuture::new( + (*this.process_fn)(idx, ChunkData::Borrowed(slice.try_into().unwrap())), + ChunkType::Full, + )) + } else if *this.pos == whole_chunks && *this.remainder_len != 0 { + let idx = *this.pos; + let remainder_len = mem::replace(this.remainder_len, 0); + let mut last_chunk = Vec::with_capacity(N); + last_chunk.extend_from_slice(&this.slice[N * idx..]); + last_chunk.resize_with(N, this.dummy_fn); + let last_chunk = Box::<[T; N]>::try_from(last_chunk).ok().unwrap(); + Some(ChunkFuture::new( + (*this.process_fn)(idx, ChunkData::Owned(last_chunk)), + ChunkType::Partial(remainder_len), + )) + } else { + return None; + } + } +} + +impl<'a, T, U, F, Fut, D, const N: usize> Stream for SliceChunkProcessor<'a, T, U, F, Fut, D, N> +where + T: Clone, + F: Fn(usize, ChunkData<'a, T, N>) -> Fut, + Fut: Future> + 'a, + D: Fn() -> T + Unpin, +{ + type Item = ChunkFuture; + + fn poll_next(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(self.next_chunk()) + } +} + +/// Trait for processing data by chunks. +pub trait ProcessChunks<'a, T: Clone, const N: usize> { + /// Process data by chunks. + /// + /// This method returns a stream that will invoke `process_fn` for `N` records at a time, + /// returning the resulting processed chunks. If the input length is not a multiple of `N`, + /// `dummy_fn` is used to generate records to complete the last chunk. + fn process_chunks( + self, + process_fn: F, + dummy_fn: D, + ) -> SliceChunkProcessor<'a, T, U, F, Fut, D, N> + where + F: Fn(usize, ChunkData<'a, T, N>) -> Fut, + Fut: Future> + 'a, + D: Fn() -> T + Unpin; +} + +impl<'a, T: Clone, const N: usize> ProcessChunks<'a, T, N> for &'a [T] { + fn process_chunks( + self, + process_fn: F, + dummy_fn: D, + ) -> SliceChunkProcessor<'a, T, U, F, Fut, D, N> + where + F: Fn(usize, ChunkData<'a, T, N>) -> Fut, + Fut: Future> + 'a, + D: Fn() -> T + Unpin, + { + SliceChunkProcessor { + slice: self, + pos: 0, + remainder_len: self.len() % N, + process_fn, + dummy_fn, + } + } +} + +/// Trait to flatten a stream of iterables. +pub trait TryFlattenItersExt: TryStream { + /// Flatten a `TryStream` of `IntoIterator`s. + /// + /// Similar to `TryStream::try_flatten`, but that flattens a `TryStream` of `TryStream`s. + fn try_flatten_iters(self) -> TryFlattenIters + where + I: IntoIterator, + Self: Stream> + Sized; +} + +impl TryFlattenItersExt for St { + fn try_flatten_iters(self) -> TryFlattenIters + where + I: IntoIterator, + Self: Stream> + Sized, + { + TryFlattenIters { + stream: self, + iter: None, + finished: false, + } + } +} + +/// Stream returned by `TryFlattenIters::try_flatten_iters`. +#[pin_project] +pub struct TryFlattenIters +where + I: IntoIterator, + St: Stream>, +{ + #[pin] + stream: St, + iter: Option<::IntoIter>, + finished: bool, +} + +impl Stream for TryFlattenIters +where + I: IntoIterator, + St: Stream>, +{ + type Item = Result; + + fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + if self.finished { + return Poll::Ready(None); + } + + let mut this = self.project(); + + loop { + if let Some(item) = this.iter.as_mut().and_then(Iterator::next) { + return Poll::Ready(Some(Ok(item))); + } + *this.iter = None; + match this.stream.as_mut().poll_next(cx) { + Poll::Ready(Some(Ok(into_iter))) => *this.iter = Some(into_iter.into_iter()), + Poll::Ready(Some(Err(e))) => return Poll::Ready(Some(Err(e))), + Poll::Ready(None) => { + *this.finished = true; + return Poll::Ready(None); + } + Poll::Pending => return Poll::Pending, + } + } + } +} + +#[cfg(all(test, unit_test))] +mod tests { + use std::{ + future::ready, + iter::{self, FromFn}, + ops::Neg, + }; + + use futures::{ + channel::mpsc::channel, + stream::{self, poll_immediate}, + SinkExt, StreamExt, TryStreamExt, + }; + + use super::*; + + impl PartialEq<[T; N]> for Chunk + where + [T; N]: PartialEq<[T; N]>, + { + fn eq(&self, other: &[T; N]) -> bool { + self.chunk_type == ChunkType::Full && self.data == *other + } + } + + impl PartialEq<[T]> for Chunk { + fn eq(&self, other: &[T]) -> bool { + if self.chunk_type == ChunkType::Full && other.len() != N { + return false; + } + self.data[..other.len()] == *other + } + } + + #[tokio::test] + async fn process_chunks() { + let data = vec![1, 2, 3, 4]; + + let mut st = data + .as_slice() + .process_chunks(|_, chunk| ready(Ok(chunk.map(Neg::neg))), || 0); + + assert_eq!(&st.next().await.unwrap().await.unwrap(), &[-1, -2]); + assert_eq!(&st.next().await.unwrap().await.unwrap(), &[-3, -4]); + assert!(st.next().await.is_none()); + assert!(st.next().await.is_none()); + } + + #[tokio::test] + async fn process_chunks_partial() { + let data = vec![1, 2, 3]; + + let mut st = data + .as_slice() + .process_chunks(|_, chunk| ready(Ok(chunk.map(Neg::neg))), || 7); + + assert_eq!(&st.next().await.unwrap().await.unwrap(), &[-1, -2]); + assert_eq!( + st.next().await.unwrap().await.unwrap(), + Chunk { + chunk_type: ChunkType::Partial(1), + data: [-3, -7] + }, + ); + assert!(st.next().await.is_none()); + assert!(st.next().await.is_none()); + } + + #[test] + fn chunk_into_iter() { + assert_eq!( + Chunk::new(ChunkType::Full, [1, 2]) + .into_iter() + .collect::>(), + [1, 2], + ); + assert_eq!( + Chunk::new(ChunkType::Partial(1), [3, 4]) + .into_iter() + .collect::>(), + [3], + ); + } + + #[tokio::test] + async fn flatten_iters() { + let st = stream::iter([Ok([1, 2]), Ok([3, 4])]); + assert_eq!( + st.try_flatten_iters() + .try_collect::>() + .await + .unwrap(), + [1, 2, 3, 4], + ); + } + + #[tokio::test] + async fn flatten_iters_error() { + let st = stream::iter([Ok([1, 2]), Err(Error::Internal), Ok([3, 4])]); + let res = st + .try_flatten_iters() + .collect::>>() + .await; + assert_eq!(res[0].as_ref().unwrap(), &1); + assert_eq!(res[1].as_ref().unwrap(), &2); + assert!(matches!(res[2].as_ref().unwrap_err(), &Error::Internal)); + assert_eq!(res[3].as_ref().unwrap(), &3); + assert_eq!(res[4].as_ref().unwrap(), &4); + } + + #[tokio::test] + async fn flatten_iters_is_fused() { + let mut st = stream::iter([Ok([1, 2]), Ok([3, 4])]).try_flatten_iters(); + assert!(st.next().await.is_some()); + assert!(st.next().await.is_some()); + assert!(st.next().await.is_some()); + assert!(st.next().await.is_some()); + assert!(!st.finished); + assert!(st.next().await.is_none()); + assert!(st.finished); + assert!(st.next().await.is_none()); + assert!(st.finished); + } + + #[tokio::test] + async fn flatten_iters_variable_size() { + let st = stream::iter([Ok(vec![]), Ok(vec![4]), Ok(vec![5, 6])]); + assert_eq!( + st.try_flatten_iters() + .try_collect::>() + .await + .unwrap(), + [4, 5, 6], + ); + } + + #[tokio::test] + async fn flatten_iters_unfused_src_pend() { + let (mut tx, rx) = channel:: Option>>, Error>>(1); + + let mut st = rx.try_flatten_iters(); + + assert!(matches!( + poll_immediate(&mut st).next().await, + Some(Poll::Pending) + )); + + let mut i = 0; + tx.send(Ok({ + iter::from_fn(Box::new(move || { + let res = match i { + 0 => Some(0), + 1 => Some(1), + 2 => None, + _ => panic!("called after returning None"), + }; + i += 1; + res + })) + })) + .await + .unwrap(); + + assert!(matches!( + poll_immediate(&mut st).next().await, + Some(Poll::Ready(Ok(0))) + )); + + assert!(matches!( + poll_immediate(&mut st).next().await, + Some(Poll::Ready(Ok(1))) + )); + + assert!(matches!( + poll_immediate(&mut st).next().await, + Some(Poll::Pending) + )); + + // It should still be pending, and it should not try to advance the source iterator again. + assert!(matches!( + poll_immediate(&mut st).next().await, + Some(Poll::Pending) + )); + + tx.close().await.unwrap(); + + assert!(poll_immediate(&mut st).next().await.is_none()); + } + + #[tokio::test] + async fn flatten_iters_unfused_src_err() { + let (mut tx, rx) = channel:: Option>>, Error>>(1); + + let mut st = rx.try_flatten_iters(); + + assert!(matches!( + poll_immediate(&mut st).next().await, + Some(Poll::Pending) + )); + + let mut i = 0; + tx.send(Ok({ + iter::from_fn(Box::new(move || { + let res = match i { + 0 => Some(0), + 1 => Some(1), + 2 => None, + _ => panic!("called after returning None"), + }; + i += 1; + res + })) + })) + .await + .unwrap(); + + assert!(matches!( + poll_immediate(&mut st).next().await, + Some(Poll::Ready(Ok(0))) + )); + + assert!(matches!( + poll_immediate(&mut st).next().await, + Some(Poll::Ready(Ok(1))) + )); + + tx.send(Err(Error::Internal)).await.unwrap(); + + assert!(matches!( + poll_immediate(&mut st).next().await, + Some(Poll::Ready(Err(Error::Internal))) + )); + + // It should now be pending. It should not poll the source iterator again. + assert!(matches!( + poll_immediate(&mut st).next().await, + Some(Poll::Pending) + )); + + tx.close().await.unwrap(); + + assert!(poll_immediate(&mut st).next().await.is_none()); + } +} diff --git a/ipa-core/src/exact.rs b/ipa-core/src/helpers/stream/exact.rs similarity index 98% rename from ipa-core/src/exact.rs rename to ipa-core/src/helpers/stream/exact.rs index d7ffb58be..f3c6eb4d3 100644 --- a/ipa-core/src/exact.rs +++ b/ipa-core/src/helpers/stream/exact.rs @@ -87,7 +87,7 @@ mod test { use futures::stream::iter; use futures_util::StreamExt; - use crate::exact::{ExactSizeStream, FixedLength}; + use super::{ExactSizeStream, FixedLength}; #[test] fn fixed_stream() { diff --git a/ipa-core/src/helpers/stream/mod.rs b/ipa-core/src/helpers/stream/mod.rs new file mode 100644 index 000000000..b563c62ad --- /dev/null +++ b/ipa-core/src/helpers/stream/mod.rs @@ -0,0 +1,5 @@ +mod chunks; +mod exact; + +pub use chunks::{ChunkData, ProcessChunks, TryFlattenItersExt}; +pub use exact::ExactSizeStream; diff --git a/ipa-core/src/lib.rs b/ipa-core/src/lib.rs index abb5a3aa1..e9db2d679 100644 --- a/ipa-core/src/lib.rs +++ b/ipa-core/src/lib.rs @@ -7,7 +7,6 @@ // because of performance implications which shouldn't be a concern for unit testing. #![cfg_attr(test, allow(clippy::disallowed_methods))] -pub mod chunkscan; #[cfg(any(feature = "cli", feature = "web-app"))] pub mod cli; #[cfg(all(feature = "enable-serde", feature = "web-app"))] @@ -29,7 +28,6 @@ pub mod telemetry; pub mod test_fixture; mod app; -mod exact; mod seq_join; #[cfg(feature = "enable-serde")] mod serde; diff --git a/ipa-core/src/protocol/modulus_conversion/convert_shares.rs b/ipa-core/src/protocol/modulus_conversion/convert_shares.rs index 03d26543c..0ab10aba3 100644 --- a/ipa-core/src/protocol/modulus_conversion/convert_shares.rs +++ b/ipa-core/src/protocol/modulus_conversion/convert_shares.rs @@ -33,9 +33,8 @@ use pin_project::pin_project; use crate::{ error::Error, - exact::ExactSizeStream, ff::{ArrayAccess, Field, Gf2, PrimeField, U128Conversions}, - helpers::Role, + helpers::{stream::ExactSizeStream, Role}, protocol::{ basics::{SecureMul, ZeroPositions}, boolean::xor_sparse, diff --git a/ipa-core/src/seq_join/mod.rs b/ipa-core/src/seq_join/mod.rs index cee30901e..6bee87e13 100644 --- a/ipa-core/src/seq_join/mod.rs +++ b/ipa-core/src/seq_join/mod.rs @@ -5,7 +5,7 @@ use futures::{ Future, Stream, TryStreamExt, }; -use crate::exact::ExactSizeStream; +use crate::helpers::stream::ExactSizeStream; #[cfg(not(feature = "multi-threading"))] mod local; From 9cc9a53e14dbc54028bdb855e952fd15aebe9e6d Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Tue, 19 Mar 2024 16:10:14 -0700 Subject: [PATCH 089/135] Clarify the pinning situation --- ipa-core/src/helpers/stream/chunks.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ipa-core/src/helpers/stream/chunks.rs b/ipa-core/src/helpers/stream/chunks.rs index 6a275aa9b..e0d14dba1 100644 --- a/ipa-core/src/helpers/stream/chunks.rs +++ b/ipa-core/src/helpers/stream/chunks.rs @@ -125,9 +125,9 @@ where /// Stream returned by `ProcessChunks::process_chunks`. // -// We implement structural pinning for `process_fn` to avoid adding a bunch of `C: Unpin` bounds to -// the protocol code (even if those bounds are satisfiable). Structural pinning could be implemented -// for `dummy_fn` as well, but that isn't currently required to avoid `Unpin` bounds. +// We could avoid pin projection and instead require that `SliceChunkProcessor` (and its fields) be +// `Unpin`. Requiring `D: Unpin` is easy, but requiring `F: Unpin` in turn requires a bunch of `C: +// Unpin` bounds in protocols. #[pin_project] pub struct SliceChunkProcessor<'a, T, U, F, Fut, D, const N: usize> where @@ -156,7 +156,7 @@ where T: Clone, F: Fn(usize, ChunkData<'a, T, N>) -> Fut, Fut: Future> + 'a, - D: Fn() -> T + Unpin, + D: Fn() -> T, { fn next_chunk(self: Pin<&mut Self>) -> Option> { let this = self.project(); @@ -193,7 +193,7 @@ where T: Clone, F: Fn(usize, ChunkData<'a, T, N>) -> Fut, Fut: Future> + 'a, - D: Fn() -> T + Unpin, + D: Fn() -> T, { type Item = ChunkFuture; @@ -217,7 +217,7 @@ pub trait ProcessChunks<'a, T: Clone, const N: usize> { where F: Fn(usize, ChunkData<'a, T, N>) -> Fut, Fut: Future> + 'a, - D: Fn() -> T + Unpin; + D: Fn() -> T; } impl<'a, T: Clone, const N: usize> ProcessChunks<'a, T, N> for &'a [T] { @@ -229,7 +229,7 @@ impl<'a, T: Clone, const N: usize> ProcessChunks<'a, T, N> for &'a [T] { where F: Fn(usize, ChunkData<'a, T, N>) -> Fut, Fut: Future> + 'a, - D: Fn() -> T + Unpin, + D: Fn() -> T, { SliceChunkProcessor { slice: self, From a637a83200bd1cb90264a176a17969e5457cfad2 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Wed, 20 Mar 2024 14:43:07 -0700 Subject: [PATCH 090/135] Replace tokio yield with sleep(1ms) Fixes #986 --- ipa-core/src/seq_join/multi_thread.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ipa-core/src/seq_join/multi_thread.rs b/ipa-core/src/seq_join/multi_thread.rs index 492dcae9f..e421ec3bc 100644 --- a/ipa-core/src/seq_join/multi_thread.rs +++ b/ipa-core/src/seq_join/multi_thread.rs @@ -177,7 +177,7 @@ where #[cfg(all(test, unit_test))] mod tests { - use std::{future::Future, num::NonZeroUsize, pin::Pin}; + use std::{future::Future, num::NonZeroUsize, pin::Pin, time::Duration}; use futures_util::future::lazy; @@ -223,7 +223,7 @@ mod tests { } break; } - tokio::task::yield_now().await; + tokio::time::sleep(Duration::from_millis(1)).await; } Ok::<_, ()>(()) } From 5bc5a2a00d802a7e431c4b464d54122adcceace0 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Wed, 20 Mar 2024 14:15:46 -0700 Subject: [PATCH 091/135] Unpin nightly version for miri tests --- .github/workflows/check.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 0406d6c0e..195ad733f 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -175,9 +175,6 @@ jobs: - uses: actions/checkout@v4 - uses: ./.github/actions/rm - uses: dtolnay/rust-toolchain@nightly - with: - # More recent nightlies don't work, probably https://github.com/rust-lang/rust/issues/122399 - toolchain: nightly-2024-03-11 - name: Add Miri run: rustup component add miri - name: Setup Miri From 4949f06029855d62522266ef226f96f183b383db Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Wed, 20 Mar 2024 15:27:48 -0700 Subject: [PATCH 092/135] TestWorld for sharded environments (#982) * TestWorld for sharded environments This change introduces the ability to run very simple circuits on multiple shards in parallel. It is not possible to communicate between shards yet, but it is possible to use the same test infrastructure to create multiple shards and use PRSS inside them as well as provide the input for each shard and consume their output. The next and hopefully final change will bring the ability to communicate across shards. * Address feedback * Replace generic with AT in `Transport` * Get rid of `IdentityHandlerExt` replace it with `ListenerSetup` trait that is hopefully less confusing to use * Document `RequestHandler` trait * s/W/S * Rename Sharded to WithShards * Final touches * ok().unwrap() instead of unwrap_or_else() --- ipa-core/src/helpers/gateway/mod.rs | 7 +- ipa-core/src/helpers/gateway/receive.rs | 4 +- ipa-core/src/helpers/gateway/transport.rs | 30 +- ipa-core/src/helpers/mod.rs | 4 +- .../helpers/transport/in_memory/handlers.rs | 92 +++ .../src/helpers/transport/in_memory/mod.rs | 60 +- .../helpers/transport/in_memory/routing.rs | 53 ++ .../helpers/transport/in_memory/sharding.rs | 148 +++++ .../helpers/transport/in_memory/transport.rs | 169 ++--- ipa-core/src/helpers/transport/mod.rs | 21 +- ipa-core/src/net/transport.rs | 3 +- ipa-core/src/protocol/context/malicious.rs | 4 +- ipa-core/src/protocol/context/mod.rs | 42 +- ipa-core/src/protocol/context/semi_honest.rs | 85 ++- ipa-core/src/protocol/context/validator.rs | 26 +- ipa-core/src/query/processor.rs | 16 +- ipa-core/src/sharding.rs | 43 +- ipa-core/src/test_fixture/app.rs | 6 +- ipa-core/src/test_fixture/sharing.rs | 4 + ipa-core/src/test_fixture/world.rs | 603 ++++++++++++++---- 20 files changed, 1061 insertions(+), 359 deletions(-) create mode 100644 ipa-core/src/helpers/transport/in_memory/handlers.rs create mode 100644 ipa-core/src/helpers/transport/in_memory/routing.rs create mode 100644 ipa-core/src/helpers/transport/in_memory/sharding.rs diff --git a/ipa-core/src/helpers/gateway/mod.rs b/ipa-core/src/helpers/gateway/mod.rs index a9449cd99..6c75de9a6 100644 --- a/ipa-core/src/helpers/gateway/mod.rs +++ b/ipa-core/src/helpers/gateway/mod.rs @@ -19,8 +19,7 @@ use crate::{ gateway::{ receive::GatewayReceivers, send::GatewaySenders, transport::RoleResolvingTransport, }, - HelperChannelId, HelperIdentity, Message, Role, RoleAssignment, RouteId, TotalRecords, - Transport, + HelperChannelId, Message, Role, RoleAssignment, RouteId, TotalRecords, Transport, }, protocol::QueryId, }; @@ -30,12 +29,12 @@ use crate::{ /// To avoid proliferation of type parameters, most code references this concrete type alias, rather /// than a type parameter `T: Transport`. #[cfg(feature = "in-memory-infra")] -pub type TransportImpl = super::transport::InMemoryTransport; +pub type TransportImpl = super::transport::InMemoryTransport; #[cfg(feature = "real-world-infra")] pub type TransportImpl = crate::sync::Arc; -pub type TransportError = >::Error; +pub type TransportError = ::Error; /// Gateway into IPA Network infrastructure. It allows helpers send and receive messages. pub struct Gateway { diff --git a/ipa-core/src/helpers/gateway/receive.rs b/ipa-core/src/helpers/gateway/receive.rs index 6326cf5c3..6e37f05d8 100644 --- a/ipa-core/src/helpers/gateway/receive.rs +++ b/ipa-core/src/helpers/gateway/receive.rs @@ -25,8 +25,8 @@ pub(super) struct GatewayReceivers { } pub(super) type UR = UnorderedReceiver< - >::RecordsStream, - <>::RecordsStream as Stream>::Item, + ::RecordsStream, + <::RecordsStream as Stream>::Item, >; impl ReceivingEnd { diff --git a/ipa-core/src/helpers/gateway/transport.rs b/ipa-core/src/helpers/gateway/transport.rs index efbc90970..558e44e40 100644 --- a/ipa-core/src/helpers/gateway/transport.rs +++ b/ipa-core/src/helpers/gateway/transport.rs @@ -1,26 +1,17 @@ -use std::{ - pin::Pin, - task::{Context, Poll}, -}; - use async_trait::async_trait; use futures::Stream; use crate::{ helpers::{ - HelperIdentity, NoResourceIdentifier, QueryIdBinding, Role, RoleAssignment, RouteId, - RouteParams, StepBinding, Transport, TransportImpl, + NoResourceIdentifier, QueryIdBinding, Role, RoleAssignment, RouteId, RouteParams, + StepBinding, Transport, TransportImpl, }, protocol::{step::Gate, QueryId}, }; #[derive(Debug, thiserror::Error)] #[error("Failed to send to {0:?}: {1:?}")] -pub struct SendToRoleError(Role, >::Error); - -/// This struct exists to hide the generic type used to index streams internally. -#[pin_project::pin_project] -pub struct RoleRecordsStream(#[pin] >::RecordsStream); +pub struct SendToRoleError(Role, ::Error); /// Transport adapter that resolves [`Role`] -> [`HelperIdentity`] mapping. As gateways created /// per query, it is not ambiguous. @@ -32,17 +23,10 @@ pub struct RoleResolvingTransport { pub(super) inner: TransportImpl, } -impl Stream for RoleRecordsStream { - type Item = Vec; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.project().0.poll_next(cx) - } -} - #[async_trait] -impl Transport for RoleResolvingTransport { - type RecordsStream = RoleRecordsStream; +impl Transport for RoleResolvingTransport { + type Identity = Role; + type RecordsStream = ::RecordsStream; type Error = SendToRoleError; fn identity(&self) -> Role { @@ -89,6 +73,6 @@ impl Transport for RoleResolvingTransport { "can't receive message from itself" ); - RoleRecordsStream(self.inner.receive(origin_helper, route)) + self.inner.receive(origin_helper, route) } } diff --git a/ipa-core/src/helpers/mod.rs b/ipa-core/src/helpers/mod.rs index 3bccffc83..1b4e287f8 100644 --- a/ipa-core/src/helpers/mod.rs +++ b/ipa-core/src/helpers/mod.rs @@ -58,7 +58,7 @@ pub use transport::{ WrappedBoxBodyStream, }; #[cfg(feature = "in-memory-infra")] -pub use transport::{InMemoryNetwork, InMemoryTransport}; +pub use transport::{InMemoryMpcNetwork, InMemoryShardNetwork, InMemoryTransport}; use typenum::{Unsigned, U8}; use x25519_dalek::PublicKey; @@ -352,7 +352,7 @@ impl IndexMut for Vec { impl RoleAssignment { #[must_use] - pub fn new(helper_roles: [HelperIdentity; 3]) -> Self { + pub const fn new(helper_roles: [HelperIdentity; 3]) -> Self { Self { helper_roles } } diff --git a/ipa-core/src/helpers/transport/in_memory/handlers.rs b/ipa-core/src/helpers/transport/in_memory/handlers.rs new file mode 100644 index 000000000..209b9d3e4 --- /dev/null +++ b/ipa-core/src/helpers/transport/in_memory/handlers.rs @@ -0,0 +1,92 @@ +use std::{collections::HashSet, future::Future}; + +use crate::{ + helpers::{ + query::{PrepareQuery, QueryConfig}, + transport::in_memory::{routing::Addr, transport::Error, InMemoryTransport}, + HelperIdentity, RouteId, Transport, TransportCallbacks, TransportIdentity, + }, + protocol::QueryId, + sharding::ShardIndex, +}; + +/// Trait for in-memory request handlers. MPC handlers need to be able to process query requests, +/// while shard traffic does not need to and therefore does not make use of it. +/// +/// See [`HelperRequestHandler`]. +pub trait RequestHandler: Send { + fn handle( + &mut self, + transport: InMemoryTransport, + addr: Addr, + ) -> impl Future>> + Send; +} + +impl RequestHandler for () { + async fn handle( + &mut self, + _transport: InMemoryTransport, + addr: Addr, + ) -> Result<(), Error> { + panic!( + "Shards can only process {:?} requests, got {:?}", + RouteId::Records, + addr.route + ) + } +} + +/// Handler that keeps track of running queries and +/// routes [`RouteId::PrepareQuery`] and [`RouteId::ReceiveQuery`] requests to the stored +/// callback instance. This handler works for MPC networks, for sharding network see +/// [`RequestHandler`] +pub struct HelperRequestHandler { + active_queries: HashSet, + callbacks: TransportCallbacks>, +} + +impl From>> for HelperRequestHandler { + fn from(callbacks: TransportCallbacks>) -> Self { + Self { + active_queries: HashSet::default(), + callbacks, + } + } +} + +impl RequestHandler for HelperRequestHandler { + async fn handle( + &mut self, + transport: InMemoryTransport, + addr: Addr, + ) -> Result<(), Error> { + let dest = transport.identity(); + match addr.route { + RouteId::ReceiveQuery => { + let qc = addr.into::(); + (self.callbacks.receive_query)(Transport::clone_ref(&transport), qc) + .await + .map(|query_id| { + assert!( + self.active_queries.insert(query_id), + "the same query id {query_id:?} is generated twice" + ); + }) + .map_err(|e| Error::Rejected { + dest, + inner: Box::new(e), + }) + } + RouteId::PrepareQuery => { + let input = addr.into::(); + (self.callbacks.prepare_query)(Transport::clone_ref(&transport), input) + .await + .map_err(|e| Error::Rejected { + dest, + inner: Box::new(e), + }) + } + RouteId::Records => unreachable!(), + } + } +} diff --git a/ipa-core/src/helpers/transport/in_memory/mod.rs b/ipa-core/src/helpers/transport/in_memory/mod.rs index 36a9eaed4..929deca2d 100644 --- a/ipa-core/src/helpers/transport/in_memory/mod.rs +++ b/ipa-core/src/helpers/transport/in_memory/mod.rs @@ -1,21 +1,25 @@ +mod handlers; +mod routing; +mod sharding; mod transport; +pub use sharding::InMemoryShardNetwork; pub use transport::Setup; use crate::{ - helpers::{HelperIdentity, TransportCallbacks, TransportIdentity}, + helpers::{transport::in_memory::transport::ListenerSetup, HelperIdentity, TransportCallbacks}, sync::{Arc, Weak}, }; pub type InMemoryTransport = Weak>; -/// Container for all active transports +/// Container for all active MPC communication channels #[derive(Clone)] -pub struct InMemoryNetwork { - pub transports: [Arc>; 3], +pub struct InMemoryMpcNetwork { + pub transports: [Arc>; 3], } -impl Default for InMemoryNetwork { +impl Default for InMemoryMpcNetwork { fn default() -> Self { Self::new([ TransportCallbacks::default(), @@ -25,17 +29,21 @@ impl Default for InMemoryNetwork { } } -#[allow(dead_code)] -impl InMemoryNetwork { +impl InMemoryMpcNetwork { #[must_use] - #[allow(clippy::missing_panics_doc)] - pub fn identities(&self) -> [I; 3] { - self.transports - .iter() - .map(|t| t.identity()) - .collect::>() - .try_into() - .unwrap() + pub fn new(callbacks: [TransportCallbacks>; 3]) -> Self { + let [mut first, mut second, mut third]: [_; 3] = + HelperIdentity::make_three().map(Setup::new); + + first.connect(&mut second); + second.connect(&mut third); + third.connect(&mut first); + + let [cb1, cb2, cb3] = callbacks; + + Self { + transports: [first.start(cb1), second.start(cb2), third.start(cb3)], + } } /// Returns the transport to communicate with the given helper. @@ -43,7 +51,7 @@ impl InMemoryNetwork { /// ## Panics /// If [`HelperIdentity`] is somehow points to a non-existent helper, which shouldn't happen. #[must_use] - pub fn transport(&self, id: I) -> InMemoryTransport { + pub fn transport(&self, id: HelperIdentity) -> InMemoryTransport { self.transports .iter() .find(|t| t.identity() == id) @@ -52,7 +60,7 @@ impl InMemoryNetwork { #[allow(clippy::missing_panics_doc)] #[must_use] - pub fn transports(&self) -> [InMemoryTransport; 3] { + pub fn transports(&self) -> [InMemoryTransport; 3] { let transports: [InMemoryTransport<_>; 3] = self .transports .iter() @@ -71,21 +79,3 @@ impl InMemoryNetwork { } } } - -impl InMemoryNetwork { - #[must_use] - pub fn new(callbacks: [TransportCallbacks>; 3]) -> Self { - let [mut first, mut second, mut third]: [_; 3] = - HelperIdentity::make_three().map(Setup::new); - - first.connect(&mut second); - second.connect(&mut third); - third.connect(&mut first); - - let [cb1, cb2, cb3] = callbacks; - - Self { - transports: [first.start(cb1), second.start(cb2), third.start(cb3)], - } - } -} diff --git a/ipa-core/src/helpers/transport/in_memory/routing.rs b/ipa-core/src/helpers/transport/in_memory/routing.rs new file mode 100644 index 000000000..68c5015c0 --- /dev/null +++ b/ipa-core/src/helpers/transport/in_memory/routing.rs @@ -0,0 +1,53 @@ +use std::{borrow::Borrow, fmt::Debug}; + +use serde::de::DeserializeOwned; + +use crate::{ + helpers::{QueryIdBinding, RouteId, RouteParams, StepBinding, TransportIdentity}, + protocol::{step::Gate, QueryId}, +}; + +/// The header/metadata of the incoming request. +#[derive(Debug)] +pub(super) struct Addr { + pub route: RouteId, + pub origin: Option, + pub query_id: Option, + pub gate: Option, + pub params: String, +} + +impl Addr { + #[allow(clippy::needless_pass_by_value)] // to avoid using double-reference at callsites + pub fn from_route>( + origin: I, + route: R, + ) -> Self + where + Option: From, + Option: From, + { + Self { + route: route.resource_identifier(), + origin: Some(origin), + query_id: route.query_id().into(), + gate: route.gate().into(), + params: route.extra().borrow().to_string(), + } + } + + pub fn into(self) -> T { + serde_json::from_str(&self.params).unwrap() + } + + #[cfg(all(test, unit_test))] + pub fn records(from: I, query_id: QueryId, gate: Gate) -> Self { + Self { + route: RouteId::Records, + origin: Some(from), + query_id: Some(query_id), + gate: Some(gate), + params: String::new(), + } + } +} diff --git a/ipa-core/src/helpers/transport/in_memory/sharding.rs b/ipa-core/src/helpers/transport/in_memory/sharding.rs new file mode 100644 index 000000000..597bbd2f7 --- /dev/null +++ b/ipa-core/src/helpers/transport/in_memory/sharding.rs @@ -0,0 +1,148 @@ +use crate::{ + helpers::{ + transport::in_memory::transport::{InMemoryTransport, ListenerSetup, Setup}, + HelperIdentity, + }, + sharding::ShardIndex, + sync::{Arc, Weak}, +}; + +/// Container for shard-to-shard communication channels set up for each helper. Each shard is connected +/// to every other shard within the same helper and these connections are stored here. MPC connections +/// for each individual shard are created and stored inside [`super::InMemoryMpcNetwork`]. +/// +/// This structure helps to have a single entry point for in-memory runs. Dropping it causes all +/// connections to be destroyed. To obtain a sending end of shard communication channel, use +/// [`transport`] method. +/// +/// [`transport`]: InMemoryShardNetwork::transport +pub struct InMemoryShardNetwork { + pub shard_network: [Box<[Arc>]>; 3], +} + +impl InMemoryShardNetwork { + pub fn with_shards>(shard_count: I) -> Self { + let shard_count = shard_count.into(); + let shard_network: [_; 3] = HelperIdentity::make_three().map(|h| { + let mut shard_connections = shard_count.iter().map(Setup::new).collect::>(); + for i in 0..shard_connections.len() { + let (lhs, rhs) = shard_connections.split_at_mut(i); + if let Some((a, _)) = lhs.split_last_mut() { + for b in rhs { + Setup::connect(a, b); + } + } + } + + shard_connections + .into_iter() + .map(|s| tracing::info_span!("", ?h).in_scope(|| s.start(()))) + .collect::>() + .into() + }); + + Self { shard_network } + } + + pub fn transport>( + &self, + id: HelperIdentity, + shard_id: I, + ) -> Weak> { + Arc::downgrade(&self.shard_network[id][usize::from(shard_id.into())]) + } + + pub fn shard_transports>( + &self, + shard_id: I, + ) -> [Weak>; 3] { + let shard_id = usize::from(shard_id.into()); + // see #121 + [ + Arc::downgrade(&self.shard_network[0][shard_id]), + Arc::downgrade(&self.shard_network[1][shard_id]), + Arc::downgrade(&self.shard_network[2][shard_id]), + ] + } +} + +#[cfg(all(test, unit_test))] +mod tests { + + use futures_util::StreamExt; + use tokio::sync::mpsc; + use tokio_stream::wrappers::ReceiverStream; + + use crate::{ + helpers::{transport::in_memory::InMemoryShardNetwork, HelperIdentity, RouteId, Transport}, + protocol::{step::Gate, QueryId}, + sharding::ShardIndex, + test_executor::run, + test_fixture::logging, + }; + + fn shard_pairs>( + shard_count: I, + ) -> impl Iterator { + let shard_count = shard_count.into(); + shard_count.iter().flat_map(move |a| { + shard_count + .iter() + .filter_map(move |b| (a != b).then_some((a, b))) + }) + } + + #[test] + fn shards_talk_to_each_other() { + logging::setup(); + run(|| async { + let shard_count = 5; + let shard_network = InMemoryShardNetwork::with_shards(shard_count); + let mut sum: u32 = 0; + + for identity in HelperIdentity::make_three() { + for (a, b) in shard_pairs(shard_count) { + let (tx, rx) = mpsc::channel(1); + shard_network + .transport(identity, a) + .send( + b, + (RouteId::Records, QueryId, Gate::default()), + ReceiverStream::new(rx), + ) + .await + .unwrap(); + tx.send(vec![1]).await.unwrap(); + } + + for (a, b) in shard_pairs(shard_count) { + sum += shard_network + .transport(identity, a) + .receive(b, (QueryId, Gate::default())) + .collect::>() + .await + .into_iter() + .flatten() + .map(u32::from) + .sum::(); + } + } + + // total number of messages sent by each shard: N - 1 + assert_eq!(3 * shard_count * (shard_count - 1), sum); + }); + } + + #[test] + fn network_owns_transports() { + run(|| async { + let shard_network = InMemoryShardNetwork::with_shards(3); + let [h1, h2, h3] = + HelperIdentity::make_three().map(|identity| shard_network.transport(identity, 0)); + drop(shard_network); + assert!(h1.upgrade().is_none()); + assert!(h2.upgrade().is_none()); + assert!(h3.upgrade().is_none()); + }); + } +} diff --git a/ipa-core/src/helpers/transport/in_memory/transport.rs b/ipa-core/src/helpers/transport/in_memory/transport.rs index ab8173766..97fc45c6b 100644 --- a/ipa-core/src/helpers/transport/in_memory/transport.rs +++ b/ipa-core/src/helpers/transport/in_memory/transport.rs @@ -1,6 +1,5 @@ use std::{ - borrow::Borrow, - collections::{HashMap, HashSet}, + collections::HashMap, convert, fmt::{Debug, Formatter}, io, @@ -14,7 +13,6 @@ use ::tokio::sync::{ }; use async_trait::async_trait; use futures::{Stream, StreamExt}; -use serde::de::DeserializeOwned; #[cfg(all(feature = "shuttle", test))] use shuttle::future as tokio; use tokio_stream::wrappers::ReceiverStream; @@ -23,11 +21,15 @@ use tracing::Instrument; use crate::{ error::BoxError, helpers::{ - query::{PrepareQuery, QueryConfig}, + transport::in_memory::{ + handlers::{HelperRequestHandler, RequestHandler}, + routing::Addr, + }, HelperIdentity, NoResourceIdentifier, QueryIdBinding, ReceiveRecords, RouteId, RouteParams, - StepBinding, StreamCollection, Transport, TransportCallbacks, TransportIdentity, + StepBinding, StreamCollection, Transport, TransportIdentity, }, protocol::{step::Gate, QueryId}, + sharding::ShardIndex, sync::{Arc, Weak}, }; @@ -83,37 +85,20 @@ impl InMemoryTransport { /// out and processes it, the same way as query processor does. That will allow all tasks to be /// created in one place (driver). It does not affect the [`Transport`] interface, /// so I'll leave it as is for now. - fn listen( + fn listen>( self: &Arc, - callbacks: TransportCallbacks>, + mut callbacks: L::Handler, mut rx: ConnectionRx, ) { tokio::spawn( { let streams = self.record_streams.clone(); let this = Arc::downgrade(self); - let dest = this.identity(); async move { - let mut active_queries = HashSet::new(); while let Some((addr, stream, ack)) = rx.recv().await { tracing::trace!("received new message: {addr:?}"); let result = match addr.route { - RouteId::ReceiveQuery => { - let qc = addr.into::(); - (callbacks.receive_query)(Transport::clone_ref(&this), qc) - .await - .map(|query_id| { - assert!( - active_queries.insert(query_id), - "the same query id {query_id:?} is generated twice" - ); - }) - .map_err(|e| Error::Rejected { - dest, - inner: Box::new(e), - }) - } RouteId::Records => { let query_id = addr.query_id.unwrap(); let gate = addr.gate.unwrap(); @@ -121,14 +106,8 @@ impl InMemoryTransport { streams.add_stream((query_id, from, gate), stream); Ok(()) } - RouteId::PrepareQuery => { - let input = addr.into::(); - (callbacks.prepare_query)(Transport::clone_ref(&this), input) - .await - .map_err(|e| Error::Rejected { - dest, - inner: Box::new(e), - }) + RouteId::ReceiveQuery | RouteId::PrepareQuery => { + callbacks.handle(Clone::clone(&this), addr).await } }; @@ -159,7 +138,8 @@ impl InMemoryTransport { } #[async_trait] -impl Transport for Weak> { +impl Transport for Weak> { + type Identity = I; type RecordsStream = ReceiveRecords; type Error = Error; @@ -269,69 +249,16 @@ impl Debug for InMemoryStream { } } -struct Addr { - route: RouteId, - origin: Option, - query_id: Option, - gate: Option, - params: String, -} - -impl Addr { - #[allow(clippy::needless_pass_by_value)] // to avoid using double-reference at callsites - fn from_route>( - origin: I, - route: R, - ) -> Self - where - Option: From, - Option: From, - { - Self { - route: route.resource_identifier(), - origin: Some(origin), - query_id: route.query_id().into(), - gate: route.gate().into(), - params: route.extra().borrow().to_string(), - } - } - - fn into(self) -> T { - serde_json::from_str(&self.params).unwrap() - } - - #[cfg(all(test, unit_test))] - fn records(from: I, query_id: QueryId, gate: Gate) -> Self { - Self { - route: RouteId::Records, - origin: Some(from), - query_id: Some(query_id), - gate: Some(gate), - params: String::new(), - } - } -} - -impl Debug for Addr { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!( - f, - "Addr[route={:?}, query_id={:?}, step={:?}, params={}]", - self.route, self.query_id, self.gate, self.params - ) - } -} - -pub struct Setup { - identity: HelperIdentity, - tx: ConnectionTx, - rx: ConnectionRx, - connections: HashMap>, +pub struct Setup { + identity: I, + tx: ConnectionTx, + rx: ConnectionRx, + connections: HashMap>, } -impl Setup { +impl Setup { #[must_use] - pub fn new(identity: HelperIdentity) -> Self { + pub fn new(identity: I) -> Self { let (tx, rx) = channel(16); Self { identity, @@ -356,25 +283,47 @@ impl Setup { .is_none()); } - fn into_active_conn( + fn into_active_conn::Handler>>( self, - callbacks: TransportCallbacks>>, - ) -> ( - ConnectionTx, - Arc>, - ) { + callbacks: H, + ) -> (ConnectionTx, Arc>) + where + Self: ListenerSetup, + { let transport = Arc::new(InMemoryTransport::new(self.identity, self.connections)); - transport.listen(callbacks, self.rx); + transport.listen::(callbacks.into(), self.rx); (self.tx, transport) } +} - #[must_use] - pub fn start( - self, - callbacks: TransportCallbacks>>, - ) -> Arc> { - self.into_active_conn(callbacks).1 +/// Trait to tie up different transports to the requests handlers they can use inside their +/// listen loop. +pub trait ListenerSetup { + type Identity: TransportIdentity; + type Handler: RequestHandler + 'static; + type Listener; + + fn start>(self, handler: I) -> Self::Listener; +} + +impl ListenerSetup for Setup { + type Identity = HelperIdentity; + type Handler = HelperRequestHandler; + type Listener = Arc>; + + fn start>(self, handler: I) -> Self::Listener { + self.into_active_conn(handler).1 + } +} + +impl ListenerSetup for Setup { + type Identity = ShardIndex; + type Handler = (); + type Listener = Arc>; + + fn start>(self, handler: I) -> Self::Listener { + self.into_active_conn(handler).1 } } @@ -398,8 +347,10 @@ mod tests { helpers::{ query::{QueryConfig, QueryType::TestMultiply}, transport::in_memory::{ - transport::{Addr, ConnectionTx, Error, InMemoryStream, InMemoryTransport}, - InMemoryNetwork, Setup, + transport::{ + Addr, ConnectionTx, Error, InMemoryStream, InMemoryTransport, ListenerSetup, + }, + InMemoryMpcNetwork, Setup, }, HelperIdentity, OrderingSender, RouteId, Transport, TransportCallbacks, TransportIdentity, @@ -606,7 +557,7 @@ mod tests { async fn can_consume_ordering_sender() { let tx = Arc::new(OrderingSender::new(NonZeroUsize::new(2).unwrap(), 2)); let rx = Arc::clone(&tx).as_rc_stream(); - let network = InMemoryNetwork::default(); + let network = InMemoryMpcNetwork::default(); let transport1 = network.transport(HelperIdentity::ONE); let transport2 = network.transport(HelperIdentity::TWO); diff --git a/ipa-core/src/helpers/transport/mod.rs b/ipa-core/src/helpers/transport/mod.rs index 2bdcb5ace..458e2b5be 100644 --- a/ipa-core/src/helpers/transport/mod.rs +++ b/ipa-core/src/helpers/transport/mod.rs @@ -16,7 +16,7 @@ mod receive; mod stream; #[cfg(feature = "in-memory-infra")] -pub use in_memory::{InMemoryNetwork, InMemoryTransport}; +pub use in_memory::{InMemoryMpcNetwork, InMemoryShardNetwork, InMemoryTransport}; pub use receive::{LogErrors, ReceiveRecords}; #[cfg(feature = "web-app")] pub use stream::WrappedAxumBodyStream; @@ -25,7 +25,10 @@ pub use stream::{ WrappedBoxBodyStream, }; -use crate::{helpers::Role, sharding::ShardIndex}; +use crate::{ + helpers::{Role, TransportIdentity}, + sharding::ShardIndex, +}; /// An identity of a peer that can be communicated with using [`Transport`]. There are currently two /// types of peers - helpers and shards. @@ -138,16 +141,22 @@ impl RouteParams for (RouteId, QueryId, Gate) { /// Transport that supports per-query,per-step channels #[async_trait] -pub trait Transport: Clone + Send + Sync + 'static { +pub trait Transport: Clone + Send + Sync + 'static { + type Identity: TransportIdentity; type RecordsStream: Stream> + Send + Unpin; type Error: std::fmt::Debug; - fn identity(&self) -> I; + fn identity(&self) -> Self::Identity; /// Sends a new request to the given destination helper party. /// Depending on the specific request, it may or may not require acknowledgment by the remote /// party - async fn send(&self, dest: I, route: R, data: D) -> Result<(), Self::Error> + async fn send( + &self, + dest: Self::Identity, + route: R, + data: D, + ) -> Result<(), Self::Error> where Option: From, Option: From, @@ -160,7 +169,7 @@ pub trait Transport: Clone + Send + Sync + 'static { /// and step fn receive>( &self, - from: I, + from: Self::Identity, route: R, ) -> Self::RecordsStream; diff --git a/ipa-core/src/net/transport.rs b/ipa-core/src/net/transport.rs index 19c048e6c..e26c567a1 100644 --- a/ipa-core/src/net/transport.rs +++ b/ipa-core/src/net/transport.rs @@ -123,7 +123,8 @@ impl HttpTransport { } #[async_trait] -impl Transport for Arc { +impl Transport for Arc { + type Identity = HelperIdentity; type RecordsStream = ReceiveRecords; type Error = Error; diff --git a/ipa-core/src/protocol/context/malicious.rs b/ipa-core/src/protocol/context/malicious.rs index bc4fc0282..ef03a0dcf 100644 --- a/ipa-core/src/protocol/context/malicious.rs +++ b/ipa-core/src/protocol/context/malicious.rs @@ -32,6 +32,7 @@ use crate::{ ReplicatedSecretSharing, }, seq_join::SeqJoin, + sharding::NotSharded, sync::Arc, }; @@ -43,7 +44,7 @@ pub struct Context<'a> { impl<'a> Context<'a> { pub fn new(participant: &'a PrssEndpoint, gateway: &'a Gateway) -> Self { Self { - inner: Base::new(participant, gateway), + inner: Base::new(participant, gateway, NotSharded), } } @@ -182,6 +183,7 @@ impl<'a, F: ExtendableField> Upgraded<'a, F> { self.inner.gateway, self.gate.clone(), self.total_records, + NotSharded, ) } } diff --git a/ipa-core/src/protocol/context/mod.rs b/ipa-core/src/protocol/context/mod.rs index 4a54302ce..3bf6de8c7 100644 --- a/ipa-core/src/protocol/context/mod.rs +++ b/ipa-core/src/protocol/context/mod.rs @@ -15,9 +15,11 @@ use async_trait::async_trait; #[cfg(feature = "descriptive-gate")] pub use malicious::{Context as MaliciousContext, Upgraded as UpgradedMaliciousContext}; use prss::{InstrumentedIndexedSharedRandomness, InstrumentedSequentialSharedRandomness}; -pub use semi_honest::{Context as SemiHonestContext, Upgraded as UpgradedSemiHonestContext}; +pub use semi_honest::Upgraded as UpgradedSemiHonestContext; pub use upgrade::{UpgradeContext, UpgradeToMalicious}; pub use validator::Validator; +pub type SemiHonestContext<'a, B = NotSharded> = semi_honest::Context<'a, B>; +pub type ShardedSemiHonestContext<'a> = semi_honest::Context<'a, Sharded>; use crate::{ error::Error, @@ -33,6 +35,7 @@ use crate::{ SecretSharing, }, seq_join::SeqJoin, + sharding::{NotSharded, ShardBinding, ShardConfiguration, ShardIndex, Sharded}, }; /// Context used by each helper to perform secure computation. Provides access to shared randomness @@ -157,37 +160,46 @@ pub trait SpecialAccessToUpgradedContext: UpgradedContext /// Context for protocol executions suitable for semi-honest security model, i.e. secure against /// honest-but-curious adversary parties. #[derive(Clone)] -pub struct Base<'a> { +pub struct Base<'a, B: ShardBinding = NotSharded> { inner: Inner<'a>, gate: Gate, total_records: TotalRecords, + /// This indicates whether the system uses sharding or no. It's not ideal that we keep it here + /// because it gets cloned often, a potential solution to that, if this shows up on flame graph, + /// would be to move it to [`Inner`] struct. + sharding: B, } -impl<'a> Base<'a> { - fn new(participant: &'a PrssEndpoint, gateway: &'a Gateway) -> Self { +impl<'a, B: ShardBinding> Base<'a, B> { + fn new(participant: &'a PrssEndpoint, gateway: &'a Gateway, sharding: B) -> Self { Self::new_complete( participant, gateway, Gate::default(), TotalRecords::Unspecified, + sharding, ) } +} +impl<'a, B: ShardBinding> Base<'a, B> { fn new_complete( participant: &'a PrssEndpoint, gateway: &'a Gateway, gate: Gate, total_records: TotalRecords, + sharding: B, ) -> Self { Self { inner: Inner::new(participant, gateway), gate, total_records, + sharding, } } } -impl<'a> Context for Base<'a> { +impl<'a, B: ShardBinding> Context for Base<'a, B> { fn role(&self) -> Role { self.inner.gateway.role() } @@ -204,6 +216,7 @@ impl<'a> Context for Base<'a> { inner: self.inner.clone(), gate: self.gate.narrow(step), total_records: self.total_records, + sharding: self.sharding.clone(), } } @@ -212,6 +225,7 @@ impl<'a> Context for Base<'a> { inner: self.inner.clone(), gate: self.gate.clone(), total_records: self.total_records.overwrite(total_records), + sharding: self.sharding.clone(), } } @@ -251,7 +265,23 @@ impl<'a> Context for Base<'a> { } } -impl<'a> SeqJoin for Base<'a> { +/// Context for MPC circuits that can operate on multiple shards. Provides access to shard information +/// via [`ShardConfiguration`] trait. +pub trait ShardedContext: Context + ShardConfiguration {} + +impl ShardConfiguration for Base<'_, Sharded> { + fn shard_id(&self) -> ShardIndex { + self.sharding.shard_id + } + + fn shard_count(&self) -> ShardIndex { + self.sharding.shard_count + } +} + +impl<'a> ShardedContext for Base<'a, Sharded> {} + +impl<'a, B: ShardBinding> SeqJoin for Base<'a, B> { fn active_work(&self) -> NonZeroUsize { self.inner.gateway.config().active_work() } diff --git a/ipa-core/src/protocol/context/semi_honest.rs b/ipa-core/src/protocol/context/semi_honest.rs index b312121f2..c742c02e5 100644 --- a/ipa-core/src/protocol/context/semi_honest.rs +++ b/ipa-core/src/protocol/context/semi_honest.rs @@ -27,28 +27,56 @@ use crate::{ malicious::ExtendableField, semi_honest::AdditiveShare as Replicated, }, seq_join::SeqJoin, + sharding::{NotSharded, ShardBinding, ShardConfiguration, ShardIndex, Sharded}, }; #[derive(Clone)] -pub struct Context<'a> { - inner: Base<'a>, +pub struct Context<'a, B: ShardBinding> { + inner: Base<'a, B>, } +impl ShardConfiguration for Context<'_, Sharded> { + fn shard_id(&self) -> ShardIndex { + self.inner.shard_id() + } -impl<'a> Context<'a> { - pub fn new(participant: &'a PrssEndpoint, gateway: &'a Gateway) -> Self { + fn shard_count(&self) -> ShardIndex { + self.inner.shard_count() + } +} + +impl<'a, B: ShardBinding> Context<'a, B> { + pub fn new_complete(participant: &'a PrssEndpoint, gateway: &'a Gateway, shard: B) -> Self { Self { - inner: Base::new(participant, gateway), + inner: Base::new(participant, gateway, shard), } } +} + +impl<'a> Context<'a, NotSharded> { + pub fn new(participant: &'a PrssEndpoint, gateway: &'a Gateway) -> Self { + Self::new_complete(participant, gateway, NotSharded) + } +} + +impl<'a> Context<'a, Sharded> { + pub fn new_sharded( + participant: &'a PrssEndpoint, + gateway: &'a Gateway, + shard: Sharded, + ) -> Self { + Self::new_complete(participant, gateway, shard) + } +} +impl<'a, B: ShardBinding> Context<'a, B> { #[cfg(test)] #[must_use] - pub fn from_base(base: Base<'a>) -> Self { + pub fn from_base(base: Base<'a, B>) -> Self { Self { inner: base } } } -impl<'a> super::Context for Context<'a> { +impl<'a, B: ShardBinding> super::Context for Context<'a, B> { fn role(&self) -> Role { self.inner.role() } @@ -98,35 +126,37 @@ impl<'a> super::Context for Context<'a> { } } -impl<'a> UpgradableContext for Context<'a> { - type UpgradedContext = Upgraded<'a, F>; - type Validator = Validator<'a, F>; +impl<'a, B: ShardBinding> UpgradableContext for Context<'a, B> { + type UpgradedContext = Upgraded<'a, B, F>; + type Validator = Validator<'a, B, F>; fn validator(self) -> Self::Validator { Self::Validator::new(self.inner) } } -impl<'a> SeqJoin for Context<'a> { +impl<'a, B: ShardBinding> SeqJoin for Context<'a, B> { fn active_work(&self) -> NonZeroUsize { self.inner.active_work() } } -impl Debug for Context<'_> { +impl Debug for Context<'_, B> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "SemiHonestContext") + f.debug_struct("SemiHonestContext") + .field("shard", &self.inner.sharding) + .finish() } } #[derive(Clone)] -pub struct Upgraded<'a, F: ExtendableField> { - inner: Base<'a>, +pub struct Upgraded<'a, B: ShardBinding, F: ExtendableField> { + inner: Base<'a, B>, _f: PhantomData, } -impl<'a, F: ExtendableField> Upgraded<'a, F> { - pub(super) fn new(inner: Base<'a>) -> Self { +impl<'a, B: ShardBinding, F: ExtendableField> Upgraded<'a, B, F> { + pub(super) fn new(inner: Base<'a, B>) -> Self { Self { inner, _f: PhantomData, @@ -134,7 +164,7 @@ impl<'a, F: ExtendableField> Upgraded<'a, F> { } } -impl<'a, F: ExtendableField> super::Context for Upgraded<'a, F> { +impl<'a, B: ShardBinding, F: ExtendableField> super::Context for Upgraded<'a, B, F> { fn role(&self) -> Role { self.inner.role() } @@ -180,7 +210,7 @@ impl<'a, F: ExtendableField> super::Context for Upgraded<'a, F> { } } -impl<'a, F: ExtendableField> SeqJoin for Upgraded<'a, F> { +impl<'a, B: ShardBinding, F: ExtendableField> SeqJoin for Upgraded<'a, B, F> { fn active_work(&self) -> NonZeroUsize { self.inner.active_work() } @@ -197,7 +227,7 @@ pub(crate) enum UpgradeStep { } #[async_trait] -impl<'a, F: ExtendableField> UpgradedContext for Upgraded<'a, F> { +impl<'a, B: ShardBinding, F: ExtendableField> UpgradedContext for Upgraded<'a, B, F> { type Share = Replicated; fn share_known_value(&self, value: F) -> Self::Share { @@ -248,8 +278,10 @@ impl<'a, F: ExtendableField> UpgradedContext for Upgraded<'a, F> { } } -impl<'a, F: ExtendableField> SpecialAccessToUpgradedContext for Upgraded<'a, F> { - type Base = Base<'a>; +impl<'a, B: ShardBinding, F: ExtendableField> SpecialAccessToUpgradedContext + for Upgraded<'a, B, F> +{ + type Base = Base<'a, B>; fn accumulate_macs(self, _record_id: RecordId, _x: &Replicated) { // noop @@ -260,8 +292,13 @@ impl<'a, F: ExtendableField> SpecialAccessToUpgradedContext for Upgraded<'a, } } -impl Debug for Upgraded<'_, F> { +impl Debug for Upgraded<'_, B, F> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "SemiHonestContext<{:?}>", type_name::()) + write!( + f, + "SemiHonestContext<{:?}, {:?}>", + type_name::(), + type_name::() + ) } } diff --git a/ipa-core/src/protocol/context/validator.rs b/ipa-core/src/protocol/context/validator.rs index 74353e250..ca67c1b16 100644 --- a/ipa-core/src/protocol/context/validator.rs +++ b/ipa-core/src/protocol/context/validator.rs @@ -10,7 +10,7 @@ use crate::{ error::Error, ff::Field, protocol::{ - context::{Base, SemiHonestContext, UpgradableContext, UpgradedSemiHonestContext}, + context::{Base, UpgradableContext, UpgradedSemiHonestContext}, prss::SharedRandomness, RecordId, }, @@ -19,6 +19,7 @@ use crate::{ semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing, }, + sharding::ShardBinding, sync::{Mutex, Weak}, }; #[cfg(feature = "descriptive-gate")] @@ -37,13 +38,13 @@ pub trait Validator { async fn validate(self, values: D) -> Result; } -pub struct SemiHonest<'a, F: ExtendableField> { - context: UpgradedSemiHonestContext<'a, F>, +pub struct SemiHonest<'a, B: ShardBinding, F: ExtendableField> { + context: UpgradedSemiHonestContext<'a, B, F>, _f: PhantomData, } -impl<'a, F: ExtendableField> SemiHonest<'a, F> { - pub(super) fn new(inner: Base<'a>) -> Self { +impl<'a, B: ShardBinding, F: ExtendableField> SemiHonest<'a, B, F> { + pub(super) fn new(inner: Base<'a, B>) -> Self { Self { context: UpgradedSemiHonestContext::new(inner), _f: PhantomData, @@ -52,8 +53,10 @@ impl<'a, F: ExtendableField> SemiHonest<'a, F> { } #[async_trait] -impl<'a, F: ExtendableField> Validator, F> for SemiHonest<'a, F> { - fn context(&self) -> UpgradedSemiHonestContext<'a, F> { +impl<'a, B: ShardBinding, F: ExtendableField> Validator, F> + for SemiHonest<'a, B, F> +{ + fn context(&self) -> UpgradedSemiHonestContext<'a, B, F> { self.context.clone() } @@ -63,9 +66,14 @@ impl<'a, F: ExtendableField> Validator, F> for SemiHonest< } } -impl Debug for SemiHonest<'_, F> { +impl Debug for SemiHonest<'_, B, F> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "SemiHonestValidator<{:?}>", type_name::()) + write!( + f, + "SemiHonestValidator<{:?}, {:?}>", + type_name::(), + type_name::() + ) } } diff --git a/ipa-core/src/query/processor.rs b/ipa-core/src/query/processor.rs index 5e96a0140..fb01aa8ac 100644 --- a/ipa-core/src/query/processor.rs +++ b/ipa-core/src/query/processor.rs @@ -322,7 +322,7 @@ mod tests { ff::FieldType, helpers::{ query::{PrepareQuery, QueryConfig, QueryType::TestMultiply}, - HelperIdentity, InMemoryNetwork, PrepareQueryCallback, RoleAssignment, Transport, + HelperIdentity, InMemoryMpcNetwork, PrepareQueryCallback, RoleAssignment, Transport, TransportCallbacks, }, protocol::QueryId, @@ -368,7 +368,7 @@ mod tests { }), ..Default::default() }; - let network = InMemoryNetwork::new([TransportCallbacks::default(), cb2, cb3]); + let network = InMemoryMpcNetwork::new([TransportCallbacks::default(), cb2, cb3]); let [t0, _, _] = network.transports(); let p0 = Processor::default(); let request = test_multiply_config(); @@ -406,7 +406,7 @@ mod tests { prepare_query: prepare_query_callback(|_, _| async { Ok(()) }), ..Default::default() }); - let network = InMemoryNetwork::new(cb); + let network = InMemoryMpcNetwork::new(cb); let [t0, _, _] = network.transports(); let p0 = Processor::default(); let request = test_multiply_config(); @@ -433,7 +433,7 @@ mod tests { }), ..Default::default() }; - let network = InMemoryNetwork::new([TransportCallbacks::default(), cb2, cb3]); + let network = InMemoryMpcNetwork::new([TransportCallbacks::default(), cb2, cb3]); let [t0, _, _] = network.transports(); let p0 = Processor::default(); let request = test_multiply_config(); @@ -456,7 +456,7 @@ mod tests { }), ..Default::default() }; - let network = InMemoryNetwork::new([TransportCallbacks::default(), cb2, cb3]); + let network = InMemoryMpcNetwork::new([TransportCallbacks::default(), cb2, cb3]); let [t0, _, _] = network.transports(); let p0 = Processor::default(); let request = test_multiply_config(); @@ -482,7 +482,7 @@ mod tests { #[tokio::test] async fn happy_case() { - let network = InMemoryNetwork::default(); + let network = InMemoryMpcNetwork::default(); let identities = HelperIdentity::make_three(); let req = prepare_query(identities); let transport = network.transport(identities[1]); @@ -501,7 +501,7 @@ mod tests { #[tokio::test] async fn rejects_if_coordinator() { - let network = InMemoryNetwork::default(); + let network = InMemoryMpcNetwork::default(); let identities = HelperIdentity::make_three(); let req = prepare_query(identities); let transport = network.transport(identities[0]); @@ -515,7 +515,7 @@ mod tests { #[tokio::test] async fn rejects_if_query_exists() { - let network = InMemoryNetwork::default(); + let network = InMemoryMpcNetwork::default(); let identities = HelperIdentity::make_three(); let req = prepare_query(identities); let transport = network.transport(identities[1]); diff --git a/ipa-core/src/sharding.rs b/ipa-core/src/sharding.rs index 564d9cd6f..a42595a74 100644 --- a/ipa-core/src/sharding.rs +++ b/ipa-core/src/sharding.rs @@ -1,9 +1,28 @@ -use std::fmt::{Display, Formatter}; +use std::{ + fmt::{Debug, Display, Formatter}, + num::TryFromIntError, +}; /// A unique zero-based index of the helper shard. #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct ShardIndex(u32); +#[derive(Debug, Copy, Clone)] +pub struct Sharded { + pub shard_id: ShardIndex, + pub shard_count: ShardIndex, +} + +impl ShardConfiguration for Sharded { + fn shard_id(&self) -> ShardIndex { + self.shard_id + } + + fn shard_count(&self) -> ShardIndex { + self.shard_count + } +} + impl Display for ShardIndex { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { Display::fmt(&self.0, f) @@ -37,6 +56,14 @@ pub trait ShardConfiguration { } } +pub trait ShardBinding: Debug + Send + Sync + Clone {} + +#[derive(Debug, Copy, Clone)] +pub struct NotSharded; + +impl ShardBinding for NotSharded {} +impl ShardBinding for Sharded {} + impl ShardIndex { pub const FIRST: Self = Self(0); @@ -52,6 +79,12 @@ impl From for ShardIndex { } } +impl From for u64 { + fn from(value: ShardIndex) -> Self { + u64::from(value.0) + } +} + #[cfg(target_pointer_width = "64")] impl From for usize { fn from(value: ShardIndex) -> Self { @@ -59,6 +92,14 @@ impl From for usize { } } +impl TryFrom for ShardIndex { + type Error = TryFromIntError; + + fn try_from(value: usize) -> Result { + u32::try_from(value).map(Self) + } +} + #[cfg(all(test, unit_test))] mod tests { use std::iter::empty; diff --git a/ipa-core/src/test_fixture/app.rs b/ipa-core/src/test_fixture/app.rs index d32ce0b23..6fda9c056 100644 --- a/ipa-core/src/test_fixture/app.rs +++ b/ipa-core/src/test_fixture/app.rs @@ -8,7 +8,7 @@ use crate::{ ff::Serializable, helpers::{ query::{QueryConfig, QueryInput}, - HelperIdentity, InMemoryNetwork, + InMemoryMpcNetwork, }, protocol::QueryId, query::QueryStatus, @@ -50,7 +50,7 @@ where /// [`TestWorld`]: crate::test_fixture::TestWorld pub struct TestApp { drivers: [HelperApp; 3], - network: InMemoryNetwork, + network: InMemoryMpcNetwork, } fn unzip_tuple_array(input: [(T, U); 3]) -> ([T; 3], [U; 3]) { @@ -63,7 +63,7 @@ impl Default for TestApp { let (setup, callbacks) = unzip_tuple_array([AppSetup::new(), AppSetup::new(), AppSetup::new()]); - let network = InMemoryNetwork::new(callbacks); + let network = InMemoryMpcNetwork::new(callbacks); let drivers = network .transports() .iter() diff --git a/ipa-core/src/test_fixture/sharing.rs b/ipa-core/src/test_fixture/sharing.rs index f1559e123..0ce02e922 100644 --- a/ipa-core/src/test_fixture/sharing.rs +++ b/ipa-core/src/test_fixture/sharing.rs @@ -152,6 +152,10 @@ where } } +impl Reconstruct<()> for [(); 3] { + fn reconstruct(&self) {} +} + #[cfg(feature = "descriptive-gate")] impl Reconstruct for [crate::protocol::boolean::RandomBitsShare; 3] where diff --git a/ipa-core/src/test_fixture/world.rs b/ipa-core/src/test_fixture/world.rs index 0f9cb4159..3cd252fae 100644 --- a/ipa-core/src/test_fixture/world.rs +++ b/ipa-core/src/test_fixture/world.rs @@ -1,31 +1,33 @@ -use std::{fmt::Debug, io::stdout, iter::zip}; +use std::{array::from_fn, borrow::Borrow, fmt::Debug, io::stdout, iter::zip, marker::PhantomData}; use async_trait::async_trait; use futures::{future::join_all, Future}; +use futures_util::{stream::FuturesOrdered, StreamExt}; use ipa_macros::Step; -use rand::{distributions::Standard, prelude::Distribution, rngs::StdRng}; +use rand::{distributions::Standard, prelude::Distribution, rngs::StdRng, thread_rng}; use rand_core::{RngCore, SeedableRng}; use tracing::{Instrument, Level, Span}; use crate::{ - helpers::{Gateway, GatewayConfig, HelperIdentity, InMemoryNetwork, Role, RoleAssignment}, + helpers::{ + Gateway, GatewayConfig, HelperIdentity, InMemoryMpcNetwork, InMemoryShardNetwork, + InMemoryTransport, Role, RoleAssignment, + }, protocol::{ context::{ - Context, MaliciousContext, SemiHonestContext, UpgradableContext, UpgradeContext, - UpgradeToMalicious, UpgradedContext, UpgradedMaliciousContext, Validator, + Context, MaliciousContext, SemiHonestContext, ShardedSemiHonestContext, + UpgradableContext, UpgradeContext, UpgradeToMalicious, UpgradedContext, + UpgradedMaliciousContext, Validator, }, prss::Endpoint as PrssEndpoint, QueryId, }, - rand::thread_rng, secret_sharing::{ replicated::malicious::{DowngradeMalicious, ExtendableField}, IntoShares, }, - sync::{ - atomic::{AtomicUsize, Ordering}, - Arc, - }, + sharding::{NotSharded, ShardBinding, ShardIndex, Sharded}, + sync::atomic::{AtomicUsize, Ordering}, telemetry::{stats::Metrics, StepStatsCsvExporter}, test_fixture::{ logging, make_participants, metrics::MetricsHandle, sharing::ValidateMalicious, Reconstruct, @@ -40,16 +42,45 @@ pub enum TestExecutionStep { Iter(usize), } +pub trait ShardingScheme { + type Container; + /// This type reflects how this scheme binds to [`ShardBinding`] interface used in [`Context`]. + /// Single shard systems do not use sharding capabilities, so the point of shard index is moot + /// Multi-shard system must inform MPC circuits about shard they operate on and total number + /// of shards within the system. + /// + /// See [`NotSharded`], [`WithShards`] and [`ShardBinding`] + type ShardBinding: ShardBinding; + /// Number of shards used inside the test world. + const SHARDS: usize; + + /// Creates a binding for the given shard id. For non-sharded systems, this is a no-op. + fn bind_shard(shard_id: ShardIndex) -> Self::ShardBinding; +} + +/// Helper trait to parametrize [`Runner`] trait based on the sharding scheme chosen. The whole +/// purpose of it is to be able to say for sharded runs, the input must be in a form of a [`Vec`] +pub trait RunnerInput: Send { + fn share(self) -> [S::Container; 3]; +} + +/// This indicates how many shards need to be created in test environment. +pub struct WithShards; + /// Test environment for protocols to run tests that require communication between helpers. /// For now the messages sent through it never leave the test infra memory perimeter, so /// there is no need to associate each of them with `QueryId`, but this API makes it possible /// to do if we need it. -pub struct TestWorld { - gateways: [Gateway; 3], - participants: [PrssEndpoint; 3], - executions: AtomicUsize, +/// +/// Test environment is parametrized by [`S`] that indicates the sharding scheme used. By default, +/// there is no sharding involved and the system operates as a single MPC circuit. +/// +/// To construct a sharded environment, use [`TestWorld::::with_shards`] method. +pub struct TestWorld { + shards: Box<[ShardWorld]>, metrics_handle: MetricsHandle, - _network: InMemoryNetwork, + _shard_network: InMemoryShardNetwork, + _phantom: PhantomData, } #[derive(Clone)] @@ -65,31 +96,57 @@ pub struct TestWorldConfig { pub seed: u64, } -impl Default for TestWorldConfig { - fn default() -> Self { - Self { - // Only keep a small amount of active work on hand. - gateway_config: GatewayConfig::new(16), - // Disable metrics by default because `logging` only enables `Level::INFO` spans. - // Can be overridden by setting `RUST_LOG` environment variable to match this level. - metrics_level: Level::DEBUG, - role_assignment: None, - seed: thread_rng().next_u64(), - } +impl ShardingScheme for NotSharded { + /// For single-sharded worlds, there is no need to have the ability to distribute data across + /// shards. Any MPC circuit can take even a single share as input and produce meaningful outcome. + type Container = A; + type ShardBinding = Self; + const SHARDS: usize = 1; + + fn bind_shard(shard_id: ShardIndex) -> Self::ShardBinding { + assert_eq!( + ShardIndex::FIRST, + shard_id, + "Only one shard is allowed for non-sharded MPC" + ); + + Self } } -impl TestWorldConfig { - #[must_use] - pub fn enable_metrics(mut self) -> Self { - self.metrics_level = Level::INFO; - self +impl ShardingScheme for WithShards { + /// The easiest way to distribute data across shards is to take a collection with a known size + /// as input. + type Container = Vec; + type ShardBinding = Sharded; + const SHARDS: usize = N; + + fn bind_shard(shard_id: ShardIndex) -> Self::ShardBinding { + let shard_count = ShardIndex::try_from(N).unwrap(); + assert!( + shard_id < shard_count, + "Maximum {N} shards is allowed, {shard_id} is greater than this number" + ); + + Self::ShardBinding { + shard_id, + shard_count, + } } +} - #[must_use] - pub fn with_seed(mut self, seed: u64) -> Self { - self.seed = seed; - self +impl WithShards { + /// Partitions the input vector into a smaller vectors where each vector holds the input + /// for a single shard. + /// + /// It uses Round-robin strategy to distribute [`A`] across [`SHARDS`] + pub fn shard(input: Vec) -> [Vec; SHARDS] { + let mut r: [_; SHARDS] = from_fn(|_| Vec::new()); + for (i, share) in input.into_iter().enumerate() { + r[i % SHARDS].push(share); + } + + r } } @@ -99,43 +156,33 @@ impl Default for TestWorld { } } -impl TestWorld { +impl TestWorld> { + /// For backward compatibility, this method must have a different name than [`non_sharded`] method. + /// + /// [`non_sharded`]: TestWorld::::new_with + #[must_use] + pub fn with_shards>(config: B) -> Self { + Self::with_config(config.borrow()) + } + + fn shards(&self) -> [&ShardWorld; SHARDS] { + self.shards + .iter() + .collect::>() + .try_into() + .ok() + .unwrap() + } +} + +/// Backward-compatible API for tests that don't use sharding. +impl TestWorld { /// Creates a new `TestWorld` instance using the provided `config`. /// # Panics /// Never. #[must_use] - pub fn new_with(config: TestWorldConfig) -> Self { - logging::setup(); - - let metrics_handle = MetricsHandle::new(config.metrics_level); - let participants = make_participants(&mut StdRng::seed_from_u64(config.seed)); - let network = InMemoryNetwork::default(); - let role_assignment = config - .role_assignment - .unwrap_or_else(|| RoleAssignment::new(network.identities())); - - let mut gateways = [None, None, None]; - for i in 0..3 { - let transport = &network.transports[i]; - let role_assignment = role_assignment.clone(); - let gateway = Gateway::new( - QueryId, - config.gateway_config, - role_assignment, - Arc::downgrade(transport), - ); - let role = gateway.role(); - gateways[role] = Some(gateway); - } - let gateways = gateways.map(Option::unwrap); - - TestWorld { - gateways, - participants, - executions: AtomicUsize::new(0), - metrics_handle, - _network: network, - } + pub fn new_with>(config: B) -> Self { + Self::with_config(config.borrow()) } /// Creates protocol contexts for 3 helpers @@ -144,15 +191,7 @@ impl TestWorld { /// Panics if world has more or less than 3 gateways/participants #[must_use] pub fn contexts(&self) -> [SemiHonestContext<'_>; 3] { - let execution = self.executions.fetch_add(1, Ordering::Relaxed); - zip(&self.participants, &self.gateways) - .map(|(participant, gateway)| { - SemiHonestContext::new(participant, gateway) - .narrow(&TestExecutionStep::Iter(execution)) - }) - .collect::>() - .try_into() - .unwrap() + self.shards[0].contexts() } /// Creates malicious protocol contexts for 3 helpers @@ -161,15 +200,7 @@ impl TestWorld { /// Panics if world has more or less than 3 gateways/participants #[must_use] pub fn malicious_contexts(&self) -> [MaliciousContext<'_>; 3] { - let execution = self.executions.fetch_add(1, Ordering::Relaxed); - zip(&self.participants, &self.gateways) - .map(|(participant, gateway)| { - MaliciousContext::new(participant, gateway) - .narrow(&TestExecutionStep::Iter(execution)) - }) - .collect::>() - .try_into() - .unwrap() + self.shards[0].malicious_contexts() } #[must_use] @@ -177,38 +208,13 @@ impl TestWorld { self.metrics_handle.snapshot() } + #[must_use] pub fn gateway(&self, role: Role) -> &Gateway { - &self.gateways[role] - } - - /// See `Runner` below. - async fn run_either<'a, C, I, A, O, H, R>( - contexts: [C; 3], - span: Span, - input: I, - helper_fn: H, - ) -> [O; 3] - where - C: UpgradableContext, - I: IntoShares + Send + 'static, - A: Send, - O: Send + Debug, - H: Fn(C, A) -> R + Send + Sync, - R: Future + Send, - { - let input_shares = input.share_with(&mut thread_rng()); - #[allow(clippy::disallowed_methods)] // It's just 3 items. - let output = join_all(zip(contexts, input_shares).map(|(ctx, shares)| { - let role = ctx.role(); - helper_fn(ctx, shares).instrument(tracing::trace_span!("", role = ?role)) - })) - .instrument(span) - .await; - <[_; 3]>::try_from(output).unwrap() + &self.shards[0].gateways[role] } } -impl Drop for TestWorld { +impl Drop for TestWorld { fn drop(&mut self) { if tracing::span_enabled!(Level::DEBUG) { let metrics = self.metrics_handle.snapshot(); @@ -217,15 +223,111 @@ impl Drop for TestWorld { } } +impl TestWorld { + /// Creates a new environment with the number of shards specified inside [`S`]. + /// + /// ## Panics + /// If more than [`std::u32::MAX`] shards are requested. + #[must_use] + pub fn with_config(config: &TestWorldConfig) -> Self { + logging::setup(); + println!("Using seed {seed}", seed = config.seed); + + let shard_count = ShardIndex::try_from(S::SHARDS).unwrap(); + let shard_network = InMemoryShardNetwork::with_shards(shard_count); + + let shards = shard_count + .iter() + .map(|shard| { + ShardWorld::new( + S::bind_shard(shard), + config, + u64::from(shard), + shard_network.shard_transports(shard), + ) + }) + .collect::>() + .into_boxed_slice(); + + Self { + shards, + metrics_handle: MetricsHandle::new(config.metrics_level), + _shard_network: shard_network, + _phantom: PhantomData, + } + } +} + +impl Default for TestWorldConfig { + fn default() -> Self { + Self { + // Only keep a small amount of active work on hand. + gateway_config: GatewayConfig::new(16), + // Disable metrics by default because `logging` only enables `Level::INFO` spans. + // Can be overridden by setting `RUST_LOG` environment variable to match this level. + metrics_level: Level::DEBUG, + role_assignment: None, + seed: thread_rng().next_u64(), + } + } +} + +impl TestWorldConfig { + #[must_use] + pub fn enable_metrics(mut self) -> Self { + self.metrics_level = Level::INFO; + self + } + + #[must_use] + pub fn with_seed(mut self, seed: u64) -> Self { + self.seed = seed; + self + } + + #[must_use] + pub fn role_assignment(&self) -> &RoleAssignment { + const DEFAULT_ASSIGNMENT: RoleAssignment = RoleAssignment::new([ + HelperIdentity::ONE, + HelperIdentity::TWO, + HelperIdentity::THREE, + ]); + self.role_assignment.as_ref().unwrap_or(&DEFAULT_ASSIGNMENT) + } +} + +impl + Send, A: Send> RunnerInput for I { + fn share(self) -> [A; 3] { + I::share(self) + } +} + +impl RunnerInput, A> for I +where + I: IntoShares> + Send, + A: Send, +{ + fn share(self) -> [Vec; 3] { + I::share(self) + } +} + #[async_trait] -pub trait Runner { +pub trait Runner { + /// This could be also derived from [`S`], but maybe that's too much for that trait. + type SemiHonestContext<'ctx>: Context; + /// Run with a context that can be upgraded, but is only good for semi-honest. - async fn semi_honest<'a, I, A, O, H, R>(&'a self, input: I, helper_fn: H) -> [O; 3] + async fn semi_honest<'a, I, A, O, H, R>( + &'a self, + input: I, + helper_fn: H, + ) -> S::Container<[O; 3]> where - I: IntoShares + Send + 'static, + I: RunnerInput, A: Send, O: Send + Debug, - H: Fn(SemiHonestContext<'a>, A) -> R + Send + Sync, + H: Fn(Self::SemiHonestContext<'a>, S::Container) -> R + Send + Sync, R: Future + Send; /// Run with a context that can be upgraded to malicious. @@ -266,19 +368,91 @@ fn split_array_of_tuples(v: [(T, U, V); 3]) -> ([T; 3], [U; 3], [V; 3]) } #[async_trait] -impl Runner for TestWorld { - async fn semi_honest<'a, I, A, O, H, R>(&'a self, input: I, helper_fn: H) -> [O; 3] +impl Runner> for TestWorld> { + type SemiHonestContext<'ctx> = ShardedSemiHonestContext<'ctx>; + async fn semi_honest<'a, I, A, O, H, R>(&'a self, input: I, helper_fn: H) -> Vec<[O; 3]> + where + I: RunnerInput, A>, + A: Send, + O: Send + Debug, + H: Fn( + Self::SemiHonestContext<'a>, + as ShardingScheme>::Container, + ) -> R + + Send + + Sync, + R: Future + Send, + { + let shards = self.shards(); + let [h1, h2, h3] = input.share().map(WithShards::::shard); + + // No clippy, you're wrong, it is not redundant, it allows shard_fn to be `Copy` + #[allow(clippy::redundant_closure)] + let shard_fn = |ctx, input| helper_fn(ctx, input); + zip(shards.into_iter(), zip(zip(h1, h2), h3)) + .map(|(shard, ((h1, h2), h3))| { + ShardWorld::::run_either( + shard.contexts(), + self.metrics_handle.span(), + [h1, h2, h3], + shard_fn, + ) + }) + .collect::>() + .collect::>() + .await + } + + async fn malicious<'a, I, A, O, H, R>(&'a self, _input: I, _helper_fn: H) -> [O; 3] + where + I: IntoShares + Send + 'static, + A: Send, + O: Send + Debug, + H: Fn(MaliciousContext<'a>, A) -> R + Send + Sync, + R: Future + Send, + { + unimplemented!() + } + + async fn upgraded_malicious<'a, F, I, A, M, O, H, R, P>( + &'a self, + _input: I, + _helper_fn: H, + ) -> [O; 3] where + F: ExtendableField, I: IntoShares + Send + 'static, + A: Send + 'static, + for<'u> UpgradeContext<'u, UpgradedMaliciousContext<'a, F>, F>: + UpgradeToMalicious<'u, A, M>, + O: Send + Debug, + M: Send + 'static, + H: Fn(UpgradedMaliciousContext<'a, F>, M) -> R + Send + Sync, + R: Future + Send, + P: DowngradeMalicious + Clone + Send + Debug, + [P; 3]: ValidateMalicious, + Standard: Distribution, + { + unimplemented!() + } +} + +#[async_trait] +impl Runner for TestWorld { + type SemiHonestContext<'ctx> = SemiHonestContext<'ctx>; + + async fn semi_honest<'a, I, A, O, H, R>(&'a self, input: I, helper_fn: H) -> [O; 3] + where + I: RunnerInput, A: Send, O: Send + Debug, - H: Fn(SemiHonestContext<'a>, A) -> R + Send + Sync, + H: Fn(Self::SemiHonestContext<'a>, A) -> R + Send + Sync, R: Future + Send, { - Self::run_either( + ShardWorld::::run_either( self.contexts(), self.metrics_handle.span(), - input, + input.share(), helper_fn, ) .await @@ -292,10 +466,10 @@ impl Runner for TestWorld { H: Fn(MaliciousContext<'a>, A) -> R + Send + Sync, R: Future + Send, { - Self::run_either( + ShardWorld::::run_either( self.malicious_contexts(), self.metrics_handle.span(), - input, + input.share(), helper_fn, ) .await @@ -342,3 +516,182 @@ impl Runner for TestWorld { output } } + +struct ShardWorld { + shard_info: B, + gateways: [Gateway; 3], + participants: [PrssEndpoint; 3], + executions: AtomicUsize, + // It will be used once Gateway knows how to route shard traffic + _shard_connections: [InMemoryTransport; 3], + _mpc_network: InMemoryMpcNetwork, + _phantom: PhantomData, +} + +impl ShardWorld { + pub fn new( + shard_info: B, + config: &TestWorldConfig, + shard_seed: u64, + transports: [InMemoryTransport; 3], + ) -> Self { + // todo: B -> seed + let participants = make_participants(&mut StdRng::seed_from_u64(config.seed + shard_seed)); + let network = InMemoryMpcNetwork::default(); + + let mut gateways = network.transports().map(|t| { + Gateway::new( + QueryId, + config.gateway_config, + config.role_assignment().clone(), + t, + ) + }); + + // The name for `g` is too complicated and depends on features enabled + #[allow(clippy::redundant_closure_for_method_calls)] + gateways.sort_by_key(|g| g.role()); + + ShardWorld { + shard_info, + gateways, + participants, + executions: AtomicUsize::default(), + _shard_connections: transports, + _mpc_network: network, + _phantom: PhantomData, + } + } + + /// See `Runner` above. + async fn run_either<'a, C, A, O, H, R>( + contexts: [C; 3], + span: Span, + input_shares: [A; 3], + helper_fn: H, + ) -> [O; 3] + where + C: UpgradableContext, + A: Send, + O: Send + Debug, + H: Fn(C, A) -> R + Send + Sync, + R: Future + Send, + { + #[allow(clippy::disallowed_methods)] // It's just 3 items. + let output = join_all(zip(contexts, input_shares).map(|(ctx, shares)| { + let role = ctx.role(); + helper_fn(ctx, shares).instrument(tracing::trace_span!("", role = ?role)) + })) + .instrument(span) + .await; + <[_; 3]>::try_from(output).unwrap() + } + + /// Creates protocol contexts for 3 helpers + /// + /// # Panics + /// Panics if world has more or less than 3 gateways/participants + #[must_use] + pub fn contexts(&self) -> [SemiHonestContext<'_, B>; 3] { + let step = TestExecutionStep::Iter(self.executions.fetch_add(1, Ordering::Relaxed)); + zip(&self.participants, &self.gateways) + .map(|(participant, gateway)| { + SemiHonestContext::new_complete(participant, gateway, self.shard_info.clone()) + .narrow(&step) + }) + .collect::>() + .try_into() + .unwrap() + } + + /// Creates malicious protocol contexts for 3 helpers + /// + /// # Panics + /// Panics if world has more or less than 3 gateways/participants + #[must_use] + pub fn malicious_contexts(&self) -> [MaliciousContext<'_>; 3] { + let execution = self.executions.fetch_add(1, Ordering::Relaxed); + zip(&self.participants, &self.gateways) + .map(|(participant, gateway)| { + MaliciousContext::new(participant, gateway) + .narrow(&TestExecutionStep::Iter(execution)) + }) + .collect::>() + .try_into() + .unwrap() + } +} + +#[cfg(all(test, unit_test))] +mod tests { + use std::{ + collections::{HashMap, HashSet}, + sync::{Arc, Mutex}, + }; + + use crate::{ + ff::{boolean_array::BA3, U128Conversions}, + protocol::{context::Context, prss::SharedRandomness}, + sharding::ShardConfiguration, + test_executor::run, + test_fixture::{world::WithShards, Reconstruct, Runner, TestWorld, TestWorldConfig}, + }; + + #[test] + fn two_shards() { + run(|| async { + let world: TestWorld> = + TestWorld::with_shards(TestWorldConfig::default()); + let input = vec![BA3::truncate_from(0_u32), BA3::truncate_from(1_u32)]; + let r = world + .semi_honest(input.clone().into_iter(), |ctx, input| async move { + assert_eq!(2_usize, usize::from(ctx.shard_count())); + input + }) + .await + .into_iter() + .flat_map(|v| v.reconstruct()) + .collect::>(); + + assert_eq!(input, r); + }); + } + + #[test] + fn small_input_size() { + run(|| async { + let world: TestWorld> = + TestWorld::with_shards(TestWorldConfig::default()); + let input = vec![BA3::truncate_from(0_u32), BA3::truncate_from(1_u32)]; + let r = world + .semi_honest(input.clone().into_iter(), |_, input| async move { input }) + .await + .into_iter() + .flat_map(|v| v.reconstruct()) + .collect::>(); + + assert_eq!(input, r); + }); + } + + #[test] + fn unique_prss_per_shard() { + run(|| async { + let world: TestWorld> = + TestWorld::with_shards(TestWorldConfig::default()); + let input = vec![(), (), ()]; + let duplicates = Arc::new(Mutex::new(HashMap::new())); + let _ = world + .semi_honest(input.into_iter(), |ctx, _| { + let duplicates = Arc::clone(&duplicates); + async move { + let (l, r): (u128, u128) = ctx.prss().generate(0_u32); + let mut duplicates = duplicates.lock().unwrap(); + let e = duplicates.entry(ctx.role()).or_insert_with(HashSet::new); + assert!(e.insert(l) & e.insert(r), "{:?}: duplicate values generated on shard {}: {l}/{r}: previously generated: {e:?}", ctx.role(), ctx.shard_id()); + } + }) + .await.into_iter().map(|v| v.reconstruct()).collect::>(); + }); + } +} From c6bc01c36b30273eb2f5f37d90d539b67297a17c Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 21 Mar 2024 14:57:48 -0700 Subject: [PATCH 093/135] Remove RecordBinding type parameter from Reshare --- ipa-core/src/protocol/basics/mod.rs | 4 +-- ipa-core/src/protocol/basics/reshare.rs | 38 ++++--------------------- 2 files changed, 7 insertions(+), 35 deletions(-) diff --git a/ipa-core/src/protocol/basics/mod.rs b/ipa-core/src/protocol/basics/mod.rs index 7e0ba176f..7314af874 100644 --- a/ipa-core/src/protocol/basics/mod.rs +++ b/ipa-core/src/protocol/basics/mod.rs @@ -19,7 +19,7 @@ pub use sum_of_product::SumOfProducts; use crate::{ ff::Field, - protocol::{context::Context, RecordId}, + protocol::context::Context, secret_sharing::{ replicated::semi_honest::AdditiveShare, SecretSharing, SharedValue, Vectorizable, }, @@ -34,7 +34,7 @@ use crate::{ pub trait BasicProtocols, const N: usize = 1>: SecretSharing - + Reshare + + Reshare + Reveal>::Array> + SecureMul + ShareKnownValue diff --git a/ipa-core/src/protocol/basics/reshare.rs b/ipa-core/src/protocol/basics/reshare.rs index e2bdec483..1a26b9ad0 100644 --- a/ipa-core/src/protocol/basics/reshare.rs +++ b/ipa-core/src/protocol/basics/reshare.rs @@ -1,5 +1,3 @@ -use std::iter::{repeat, zip}; - use async_trait::async_trait; use embed_doc_image::embed_doc_image; @@ -7,7 +5,7 @@ use crate::{ error::Error, ff::Field, helpers::{Direction, Role}, - protocol::{context::Context, prss::SharedRandomness, NoRecord, RecordBinding, RecordId}, + protocol::{context::Context, prss::SharedRandomness, RecordId}, secret_sharing::replicated::{ semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing, }, @@ -39,11 +37,11 @@ use crate::{ /// `to_helper` = (`rand_left`, `rand_right`) = (r0, r1) /// `to_helper.right` = (`rand_right`, part1 + part2) = (r0, part1 + part2) #[async_trait] -pub trait Reshare: Sized + 'static { +pub trait Reshare: Sized + 'static { async fn reshare<'fut>( &self, ctx: C, - record_binding: B, + record_id: RecordId, to_helper: Role, ) -> Result where @@ -55,7 +53,7 @@ pub trait Reshare: Sized + 'static { /// This implements semi-honest reshare algorithm of "Efficient Secure Three-Party Sorting Protocol with an Honest Majority" at communication cost of 2R. /// Input: Pi-1 and Pi+1 know their secret shares /// Output: At the end of the protocol, all 3 helpers receive their shares of a new, random secret sharing of the secret value -impl Reshare for Replicated { +impl Reshare for Replicated { async fn reshare<'fut>( &self, ctx: C, @@ -108,9 +106,7 @@ impl Reshare for Replicated { /// For malicious reshare, we run semi honest reshare protocol twice, once for x and another for rx and return the results /// # Errors /// If either of reshares fails -impl<'a, F: ExtendableField> Reshare, RecordId> - for MaliciousReplicated -{ +impl<'a, F: ExtendableField> Reshare> for MaliciousReplicated { async fn reshare<'fut>( &self, ctx: UpgradedMaliciousContext<'a, F>, @@ -137,30 +133,6 @@ impl<'a, F: ExtendableField> Reshare, RecordId> } } -#[async_trait] -impl Reshare for Vec -where - S: Reshare + Send + Sync, -{ - #[tracing::instrument(name = "reshare", skip_all, fields(to = ?to_helper))] - async fn reshare<'fut>( - &self, - ctx: C, - _record_binding: NoRecord, - to_helper: Role, - ) -> Result, Error> - where - C: 'fut, - { - ctx.try_join( - zip(repeat(ctx.set_total_records(self.len())), self.iter()) - .enumerate() - .map(|(i, (c, x))| async move { x.reshare(c, RecordId::from(i), to_helper).await }), - ) - .await - } -} - #[cfg(all(test, unit_test))] mod tests { mod semi_honest { From 0466821f9228de4e31e7373e1f59023e0e56e77f Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 21 Mar 2024 15:18:08 -0700 Subject: [PATCH 094/135] Fix new lints in 1.77 --- ipa-core/src/bin/report_collector.rs | 6 ++---- ipa-core/src/net/server/mod.rs | 4 +--- ipa-core/src/protocol/modulus_conversion/convert_shares.rs | 4 +--- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/ipa-core/src/bin/report_collector.rs b/ipa-core/src/bin/report_collector.rs index 69f72cdea..d0e7deb13 100644 --- a/ipa-core/src/bin/report_collector.rs +++ b/ipa-core/src/bin/report_collector.rs @@ -182,16 +182,14 @@ impl KeyRegistries { network: &NetworkConfig, ) -> Option<(KeyIdentifier, [&KeyRegistry; 3])> { // Get the configs, if all three peers have one - let Some(configs) = network.peers().iter().try_fold(Vec::new(), |acc, peer| { + let configs = network.peers().iter().try_fold(Vec::new(), |acc, peer| { if let (mut vec, Some(hpke_config)) = (acc, peer.hpke_config.as_ref()) { vec.push(hpke_config); Some(vec) } else { None } - }) else { - return None; - }; + })?; // Create key registries self.0 = configs diff --git a/ipa-core/src/net/server/mod.rs b/ipa-core/src/net/server/mod.rs index 6d86ad96b..1bbbdfaa3 100644 --- a/ipa-core/src/net/server/mod.rs +++ b/ipa-core/src/net/server/mod.rs @@ -351,9 +351,7 @@ impl ClientCertRecognizingAcceptor { network_config: &NetworkConfig, cert_option: Option<&Certificate>, ) -> Option { - let Some(cert) = cert_option else { - return None; - }; + let cert = cert_option?; // We currently require an exact match with the peer cert (i.e. we don't support verifying // the certificate against a truststore and identifying the peer by the certificate // subject). This could be changed if the need arises. diff --git a/ipa-core/src/protocol/modulus_conversion/convert_shares.rs b/ipa-core/src/protocol/modulus_conversion/convert_shares.rs index 0ab10aba3..829c8410b 100644 --- a/ipa-core/src/protocol/modulus_conversion/convert_shares.rs +++ b/ipa-core/src/protocol/modulus_conversion/convert_shares.rs @@ -365,9 +365,7 @@ where let stream = unfold( (ctx, locally_converted, first_record), |(ctx, mut locally_converted, record_id)| async move { - let Some((triple, residual)) = locally_converted.next().await else { - return None; - }; + let (triple, residual) = locally_converted.next().await?; let bit_contexts = (0..).map(|i| ctx.narrow(&ConvertSharesStep::ConvertBit(i))); let converted = ctx.parallel_join(zip(bit_contexts, triple).map(|(ctx, triple)| async move { From 9314153172e076986e4eb11c782c4d5e7eaeb486 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Wed, 27 Mar 2024 13:19:12 +0800 Subject: [PATCH 095/135] Hashing functionality needed to support Fiat-Shamir --- .../ipa_prf/malicious_security/hashing.rs | 142 ++++++++++++++++++ .../ipa_prf/malicious_security/mod.rs | 1 + 2 files changed, 143 insertions(+) create mode 100644 ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs new file mode 100644 index 000000000..bd7fcf7a5 --- /dev/null +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs @@ -0,0 +1,142 @@ +use std::convert::Infallible; + +use generic_array::GenericArray; +use sha2::{Digest, Sha256}; +use typenum::U32; + +use crate::{ + ff::{Field, Serializable}, helpers::Message, protocol::prss::FromRandomU128 +}; + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct Hash(pub(crate) GenericArray); + +impl Serializable for Hash { + type Size = U32; + type DeserializationError = Infallible; + + fn serialize(&self, buf: &mut GenericArray) { + *buf = self.0; + } + + fn deserialize(buf: &GenericArray) -> Result { + Ok(Hash(*buf)) + } +} + +impl Message for Hash {} + +/// This function allows to compute a hash of a slice of shared values. +/// The output is a single `Hash` struct that can be sent over the network channel to other helper parties. +pub fn compute_hash<'a, I, S>(input: I) -> Hash +where + I: IntoIterator, + S: Serializable + 'a, +{ + // set up hash + let mut sha = Sha256::new(); + // set state + for x in input { + let mut buf = GenericArray::default(); + x.serialize(&mut buf); + sha.update(buf); + } + // compute hash + Hash(*GenericArray::::from_slice(&sha.finalize()[0..32])) +} + +/// This function allows to hash a vector of field elements into a single field element +/// # Panics +/// does not panic +pub fn hash_to_field(left: Hash, right: Hash) -> F +where + F: Field + FromRandomU128, +{ + // set up hash + let mut sha = Sha256::new(); + + // set state + let mut buf = GenericArray::default(); + left.serialize(&mut buf); + sha.update(buf); + right.serialize(&mut buf); + sha.update(buf); + + // compute hash as a field element + // ideally we would generate `hash` as a `[u8;F::Size]` and `deserialize` it to generate `r` + // however, deserialize might fail for some fields so we use `from_random_128` instead + // this results in at most 128 bits of security/collision probability rather than 256 bits as offered by `Sha256` + // for field elements of size less than 129 bits, this does not make a difference + F::from_random_u128(u128::from_le_bytes( + sha.finalize()[0..16].try_into().unwrap(), + )) +} + +#[cfg(all(test, unit_test))] +mod test { + use rand::{thread_rng, Rng}; + + use crate::{ff::{Fp31, Fp32BitPrime}, protocol::ipa_prf::malicious_security::hashing::hash_to_field}; + + use super::compute_hash; + + #[test] + fn hash_changes() { + const LIST_LENGTH: usize = 5; + + let mut rng = thread_rng(); + + let mut list: Vec = Vec::with_capacity(LIST_LENGTH); + for _ in 0..LIST_LENGTH { + list.push(rng.gen::()); + } + let hash_1 = compute_hash(&list); + + // modify one, randomly selected element in the list + let random_index = rng.gen::() % LIST_LENGTH; + let mut different_field_element = list[random_index]; + while different_field_element == list[random_index] { + different_field_element = rng.gen::(); + } + list[random_index] = different_field_element; + + let hash_2 = compute_hash(&list); + + assert_ne!(hash_1, hash_2, "The hash should change if the input is different"); + } + + #[test] + fn field_element_changes() { + const LIST_LENGTH: usize = 5; + + let mut rng = thread_rng(); + + let mut left = Vec::with_capacity(LIST_LENGTH); + let mut right = Vec::with_capacity(LIST_LENGTH); + for _ in 0..LIST_LENGTH { + left.push(rng.gen::()); + right.push(rng.gen::()); + } + let r1: Fp32BitPrime = hash_to_field( + compute_hash(&left), + compute_hash(&right), + ); + + // modify one, randomly selected element in the list + let random_index = rng.gen::() % LIST_LENGTH; + // There is a 1 in 2^32 chance that we generate exactly the same value and the test fails. + let modified_value = rng.gen::(); + if rng.gen::() { + left[random_index] = modified_value; + } else { + right[random_index] = modified_value; + } + + let r2: Fp32BitPrime = hash_to_field( + compute_hash(&left), + compute_hash(&right), + ); + + assert_ne!(r1, r2, "any modification to either list should change the hashed field element"); + } +} diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs index 607827b1a..89c576a22 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs @@ -1,3 +1,4 @@ +pub mod hashing; pub mod lagrange; pub mod prover; pub mod verifier; From b6b037abcd894c39a3d8fe0ea2c211817efc1870 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Wed, 27 Mar 2024 18:16:41 +0800 Subject: [PATCH 096/135] Adding proof only --- .../ipa_prf/malicious_security/hashing.rs | 35 +++-- .../ipa_prf/malicious_security/prover.rs | 133 ++++++++++++++++++ 2 files changed, 153 insertions(+), 15 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs index bd7fcf7a5..0b82df05a 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs @@ -5,7 +5,9 @@ use sha2::{Digest, Sha256}; use typenum::U32; use crate::{ - ff::{Field, Serializable}, helpers::Message, protocol::prss::FromRandomU128 + ff::{Field, Serializable}, + helpers::Message, + protocol::prss::FromRandomU128, }; #[derive(Clone, Copy, Debug, PartialEq)] @@ -54,7 +56,7 @@ where { // set up hash let mut sha = Sha256::new(); - + // set state let mut buf = GenericArray::default(); left.serialize(&mut buf); @@ -76,7 +78,10 @@ where mod test { use rand::{thread_rng, Rng}; - use crate::{ff::{Fp31, Fp32BitPrime}, protocol::ipa_prf::malicious_security::hashing::hash_to_field}; + use crate::{ + ff::{Fp31, Fp32BitPrime}, + protocol::ipa_prf::malicious_security::hashing::hash_to_field, + }; use super::compute_hash; @@ -85,7 +90,7 @@ mod test { const LIST_LENGTH: usize = 5; let mut rng = thread_rng(); - + let mut list: Vec = Vec::with_capacity(LIST_LENGTH); for _ in 0..LIST_LENGTH { list.push(rng.gen::()); @@ -102,7 +107,10 @@ mod test { let hash_2 = compute_hash(&list); - assert_ne!(hash_1, hash_2, "The hash should change if the input is different"); + assert_ne!( + hash_1, hash_2, + "The hash should change if the input is different" + ); } #[test] @@ -110,17 +118,14 @@ mod test { const LIST_LENGTH: usize = 5; let mut rng = thread_rng(); - + let mut left = Vec::with_capacity(LIST_LENGTH); let mut right = Vec::with_capacity(LIST_LENGTH); for _ in 0..LIST_LENGTH { left.push(rng.gen::()); right.push(rng.gen::()); } - let r1: Fp32BitPrime = hash_to_field( - compute_hash(&left), - compute_hash(&right), - ); + let r1: Fp32BitPrime = hash_to_field(compute_hash(&left), compute_hash(&right)); // modify one, randomly selected element in the list let random_index = rng.gen::() % LIST_LENGTH; @@ -132,11 +137,11 @@ mod test { right[random_index] = modified_value; } - let r2: Fp32BitPrime = hash_to_field( - compute_hash(&left), - compute_hash(&right), - ); + let r2: Fp32BitPrime = hash_to_field(compute_hash(&left), compute_hash(&right)); - assert_ne!(r1, r2, "any modification to either list should change the hashed field element"); + assert_ne!( + r1, r2, + "any modification to either list should change the hashed field element" + ); } } diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index 90000181e..bc7be2a16 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -107,6 +107,57 @@ where (proof, next_proof_generator) } + pub fn compute_proof_only<λ: ArrayLength, I, J>( + u: I, + v: J, + ) -> ZeroKnowledgeProof> + where + λ: ArrayLength + Add + Sub, + <λ as Add>::Output: Sub, + <<λ as Add>::Output as Sub>::Output: ArrayLength, + <λ as Sub>::Output: ArrayLength, + I: IntoIterator, + J: IntoIterator, + I::IntoIter: ExactSizeIterator, + J::IntoIter: ExactSizeIterator, + { + let mut u = u.into_iter(); + let mut v = v.into_iter(); + + debug_assert_eq!(u.len() % λ::USIZE, 0); // We should pad with zeroes eventually + + let s = u.len() / λ::USIZE; + + assert!( + s > 1, + "When the output is this small, you should call `compute_final_proof`" + ); + + let denominator = CanonicalLagrangeDenominator::::new(); + let lagrange_table = LagrangeTable::>::Output>::from(denominator); + let mut p = GenericArray::::generate(|_| F::ZERO); + let mut q = GenericArray::::generate(|_| F::ZERO); + let mut proof: GenericArray> = GenericArray::generate(|_| F::ZERO); + for _ in 0..s { + for i in 0..λ::USIZE { + let x = u.next().unwrap_or(F::ZERO); + let y = v.next().unwrap_or(F::ZERO); + p[i] = x; + q[i] = y; + proof[i] += x * y; + } + let p_extrapolated = lagrange_table.eval(&p); + let q_extrapolated = lagrange_table.eval(&q); + + for (i, (x, y)) in + zip(p_extrapolated.into_iter(), q_extrapolated.into_iter()).enumerate() + { + proof[λ::USIZE + i] += x * y; + } + } + ZeroKnowledgeProof::new(proof) + } + pub fn compute_final_proof<λ: ArrayLength>( &self, p_0: F, @@ -139,6 +190,56 @@ where .map(|(a, b)| a * b), ) } + + pub fn compute_final_proof_only<λ: ArrayLength, I, J>( + u: I, + v: J, + p_0: F, + q_0: F, + ) -> ZeroKnowledgeProof> + where + λ: ArrayLength + Add + Add, + <λ as Add>::Output: Add, + <<λ as Add>::Output as Add>::Output: ArrayLength, + <λ as Add>::Output: ArrayLength, + I: IntoIterator, + J: IntoIterator, + I::IntoIter: ExactSizeIterator, + J::IntoIter: ExactSizeIterator, + { + let mut u = u.into_iter(); + let mut v = v.into_iter(); + + assert_eq!(u.len(), λ::USIZE); // We should pad with zeroes eventually + assert_eq!(v.len(), λ::USIZE); // We should pad with zeroes eventually + + // We need a table of size `λ + 1` since we add a random point at x=0 + let denominator = CanonicalLagrangeDenominator::>::new(); + let lagrange_table = LagrangeTable::, λ>::from(denominator); + + let mut p = GenericArray::>::generate(|_| F::ZERO); + let mut q = GenericArray::>::generate(|_| F::ZERO); + let mut proof: GenericArray> = GenericArray::generate(|_| F::ZERO); + p[0] = p_0; + q[0] = q_0; + proof[0] = p_0 * q_0; + + for i in 0..λ::USIZE { + let x = u.next().unwrap_or(F::ZERO); + let y = v.next().unwrap_or(F::ZERO); + p[i + 1] = x; + q[i + 1] = y; + proof[i + 1] += x * y; + } + let p_extrapolated = lagrange_table.eval(&p); + let q_extrapolated = lagrange_table.eval(&q); + + for (i, (x, y)) in zip(p_extrapolated.into_iter(), q_extrapolated.into_iter()).enumerate() { + proof[λ::USIZE + 1 + i] += x * y; + } + + ZeroKnowledgeProof::new(proof) + } } impl PartialEq<(&[u128], &[u128])> for ProofGenerator @@ -209,6 +310,16 @@ mod test { ); assert_eq!(pg_2, (&U_2[..], &V_2[..])); + // test proof only fn + let just_proof_1 = ProofGenerator::::compute_proof_only::( + U_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), + V_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), + ); + assert_eq!( + just_proof_1.g.iter().map(Fp31::as_u128).collect::>(), + EXPECTED_1, + ); + // next iteration let (proof_2, pg_3) = pg_2.compute_proof::(Fp31::try_from(R_2).unwrap()); assert_eq!( @@ -217,6 +328,16 @@ mod test { ); assert_eq!(pg_3, (&U_3[..], &V_3[..])); + // test proof only fn + let just_proof_2 = ProofGenerator::::compute_proof_only::( + U_2.into_iter().map(|x| Fp31::try_from(x).unwrap()), + V_2.into_iter().map(|x| Fp31::try_from(x).unwrap()), + ); + assert_eq!( + just_proof_2.g.iter().map(Fp31::as_u128).collect::>(), + EXPECTED_2, + ); + // final iteration let proof_3 = pg_3.compute_final_proof::( Fp31::try_from(P_RANDOM_WEIGHT).unwrap(), @@ -226,5 +347,17 @@ mod test { proof_3.g.iter().map(Fp31::as_u128).collect::>(), EXPECTED_3, ); + + // test proof only fn + let just_proof_3 = ProofGenerator::::compute_final_proof_only::( + U_3.into_iter().map(|x| Fp31::try_from(x).unwrap()), + V_3.into_iter().map(|x| Fp31::try_from(x).unwrap()), + Fp31::try_from(P_RANDOM_WEIGHT).unwrap(), + Fp31::try_from(Q_RANDOM_WEIGHT).unwrap(), + ); + assert_eq!( + just_proof_3.g.iter().map(Fp31::as_u128).collect::>(), + EXPECTED_3, + ); } } From e9b57a62caf15cff89496c14c95275fd6f931826 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Wed, 27 Mar 2024 19:33:43 +0800 Subject: [PATCH 097/135] Prover operates in two passes with fiat-shamir --- .../ipa_prf/malicious_security/prover.rs | 201 +++++++----------- 1 file changed, 81 insertions(+), 120 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index bc7be2a16..ef84742ea 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -6,6 +6,7 @@ use std::{ use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; use typenum::{Diff, Sum, U1}; +use super::hashing::{compute_hash, hash_to_field}; use crate::{ ff::PrimeField, protocol::ipa_prf::malicious_security::lagrange::{ @@ -55,59 +56,56 @@ where Self { u, v } } - pub fn compute_proof<λ: ArrayLength>( - &self, - r: F, - ) -> (ZeroKnowledgeProof>, ProofGenerator) + pub fn gen_challenge_and_recurse<λ: ArrayLength, I, J>( + proof_left: GenericArray>, + proof_right: GenericArray>, + u: I, + v: J, + ) -> ProofGenerator where λ: ArrayLength + Add + Sub, <λ as Add>::Output: Sub, <<λ as Add>::Output as Sub>::Output: ArrayLength, <λ as Sub>::Output: ArrayLength, + I: IntoIterator, + J: IntoIterator, + I::IntoIter: ExactSizeIterator, + J::IntoIter: ExactSizeIterator, { - debug_assert_eq!(self.u.len() % λ::USIZE, 0); // We should pad with zeroes eventually + let mut u = u.into_iter(); + let mut v = v.into_iter(); - let s = self.u.len() / λ::USIZE; + debug_assert_eq!(u.len() % λ::USIZE, 0); // We should pad with zeroes eventually + + let s = u.len() / λ::USIZE; assert!( s > 1, - "When the output is this small, you should call `compute_final_proof`" + "When the output is this small, you should validate the proof with a more straightforward reveal" ); - let mut next_proof_generator = ProofGenerator { - u: Vec::::with_capacity(s), - v: Vec::::with_capacity(s), - }; - + let r: F = hash_to_field(compute_hash(&proof_left), compute_hash(&proof_right)); + let mut p = GenericArray::::generate(|_| F::ZERO); + let mut q = GenericArray::::generate(|_| F::ZERO); let denominator = CanonicalLagrangeDenominator::::new(); let lagrange_table_r = LagrangeTable::::new(&denominator, &r); - let lagrange_table = LagrangeTable::>::Output>::from(denominator); - let extrapolated_points = (0..s).map(|i| { - let start = i * λ::USIZE; - let end = start + λ::USIZE; - let p = &self.u[start..end]; - let q = &self.v[start..end]; - let p_extrapolated = lagrange_table.eval(p); - let q_extrapolated = lagrange_table.eval(q); - let p_r = lagrange_table_r.eval(p)[0]; - let q_r = lagrange_table_r.eval(q)[0]; - next_proof_generator.u.push(p_r); - next_proof_generator.v.push(q_r); - // p.into_iter() has elements that are &F - // p_extrapolated.into_iter() has elements that are F - // So these iterators cannot be chained. - zip(p, q) - .map(|(a, b)| *a * *b) - .chain(zip(p_extrapolated, q_extrapolated).map(|(a, b)| a * b)) + + let pairs = (0..s).map(|_| { + for i in 0..λ::USIZE { + let x = u.next().unwrap_or(F::ZERO); + let y = v.next().unwrap_or(F::ZERO); + p[i] = x; + q[i] = y; + } + let p_r = lagrange_table_r.eval(&p)[0]; + let q_r = lagrange_table_r.eval(&q)[0]; + (p_r, q_r) }); - let proof = ZeroKnowledgeProof::new(extrapolated_points.fold( - GenericArray::>::generate(|_| F::ZERO), - |acc, pts| zip(acc, pts).map(|(a, b)| a + b).collect(), - )); - (proof, next_proof_generator) + let (u, v) = pairs.unzip(); + ProofGenerator::new(u, v) } - pub fn compute_proof_only<λ: ArrayLength, I, J>( + pub fn compute_proof<λ: ArrayLength, I, J>( u: I, v: J, ) -> ZeroKnowledgeProof> @@ -158,40 +156,7 @@ where ZeroKnowledgeProof::new(proof) } - pub fn compute_final_proof<λ: ArrayLength>( - &self, - p_0: F, - q_0: F, - ) -> ZeroKnowledgeProof> - where - λ: ArrayLength + Add + Add, - <λ as Add>::Output: Add, - <<λ as Add>::Output as Add>::Output: ArrayLength, - <λ as Add>::Output: ArrayLength, - { - assert_eq!(self.u.len(), λ::USIZE); // We should pad with zeroes eventually - - // We need a table of size `λ + 1` since we add a random point at x=0 - let denominator = CanonicalLagrangeDenominator::>::new(); - let lagrange_table = LagrangeTable::, λ>::from(denominator); - - let mut p = vec![p_0]; - p.extend_from_slice(&self.u); - let mut q = vec![q_0]; - q.extend_from_slice(&self.v); - let p_extrapolated = lagrange_table.eval(&p); - let q_extrapolated = lagrange_table.eval(&q); - - ZeroKnowledgeProof::new( - zip( - p.into_iter().chain(p_extrapolated), - q.into_iter().chain(q_extrapolated), - ) - .map(|(a, b)| a * b), - ) - } - - pub fn compute_final_proof_only<λ: ArrayLength, I, J>( + pub fn compute_final_proof<λ: ArrayLength, I, J>( u: I, v: J, p_0: F, @@ -264,7 +229,8 @@ where #[cfg(all(test, unit_test))] mod test { - use typenum::{U2, U4}; + use generic_array::{sequence::GenericSequence, GenericArray}; + use typenum::{U2, U4, U7}; use super::ProofGenerator; use crate::ff::{Fp31, U128Conversions}; @@ -279,85 +245,80 @@ mod test { 0, 0, 0, 30, 0, 0, 0, 1, 30, 30, 30, 30, 0, 0, 30, 30, 0, 30, 0, 30, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, ]; - const EXPECTED_1: [u128; 7] = [0, 30, 29, 30, 5, 28, 13]; - const R_1: u128 = 22; + const PROOF_1: [u128; 7] = [0, 30, 29, 30, 5, 28, 13]; + const PROOF_LEFT_1: [u128; 7] = [1, 4, 10, 15, 12, 15, 29]; const U_2: [u128; 8] = [0, 0, 26, 0, 7, 18, 24, 13]; const V_2: [u128; 8] = [10, 21, 30, 28, 15, 21, 3, 3]; - const EXPECTED_2: [u128; 7] = [12, 6, 15, 8, 29, 30, 6]; - const R_2: u128 = 17; + const PROOF_2: [u128; 7] = [12, 6, 15, 8, 29, 30, 6]; + const PROOF_LEFT_2: [u128; 7] = [30, 28, 10, 25, 12, 23, 29]; const U_3: [u128; 2] = [3, 3]; const V_3: [u128; 2] = [5, 24]; - const EXPECTED_3: [u128; 5] = [12, 15, 10, 14, 17]; + const PROOF_3: [u128; 5] = [12, 15, 10, 14, 17]; const P_RANDOM_WEIGHT: u128 = 12; const Q_RANDOM_WEIGHT: u128 = 1; - let pg: ProofGenerator = ProofGenerator::new( - U_1.into_iter() - .map(|x| Fp31::try_from(x).unwrap()) - .collect(), - V_1.into_iter() - .map(|x| Fp31::try_from(x).unwrap()) - .collect(), - ); - // first iteration - let (proof, pg_2) = pg.compute_proof::(Fp31::try_from(R_1).unwrap()); - assert_eq!( - proof.g.iter().map(Fp31::as_u128).collect::>(), - EXPECTED_1, - ); - assert_eq!(pg_2, (&U_2[..], &V_2[..])); - - // test proof only fn - let just_proof_1 = ProofGenerator::::compute_proof_only::( + let proof_1 = ProofGenerator::::compute_proof::( U_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), V_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), ); assert_eq!( - just_proof_1.g.iter().map(Fp31::as_u128).collect::>(), - EXPECTED_1, + proof_1.g.iter().map(Fp31::as_u128).collect::>(), + PROOF_1, ); - // next iteration - let (proof_2, pg_3) = pg_2.compute_proof::(Fp31::try_from(R_2).unwrap()); - assert_eq!( - proof_2.g.iter().map(Fp31::as_u128).collect::>(), - EXPECTED_2, + // ZKP is secret-shared into two pieces + // proof_left comes from PRSS + let proof_left_1 = + GenericArray::::generate(|i| Fp31::try_from(PROOF_LEFT_1[i]).unwrap()); + let proof_right_1 = GenericArray::::generate(|i| proof_1.g[i] - proof_left_1[i]); + + // fiat-shamir + let pg_2 = ProofGenerator::gen_challenge_and_recurse::( + proof_left_1, + proof_right_1, + U_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), + V_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), ); - assert_eq!(pg_3, (&U_3[..], &V_3[..])); + assert_eq!(pg_2, (&U_2[..], &V_2[..])); - // test proof only fn - let just_proof_2 = ProofGenerator::::compute_proof_only::( + // next iteration + let proof_2 = ProofGenerator::::compute_proof::( U_2.into_iter().map(|x| Fp31::try_from(x).unwrap()), V_2.into_iter().map(|x| Fp31::try_from(x).unwrap()), ); assert_eq!( - just_proof_2.g.iter().map(Fp31::as_u128).collect::>(), - EXPECTED_2, + proof_2.g.iter().map(Fp31::as_u128).collect::>(), + PROOF_2, ); - // final iteration - let proof_3 = pg_3.compute_final_proof::( - Fp31::try_from(P_RANDOM_WEIGHT).unwrap(), - Fp31::try_from(Q_RANDOM_WEIGHT).unwrap(), - ); - assert_eq!( - proof_3.g.iter().map(Fp31::as_u128).collect::>(), - EXPECTED_3, + // ZKP is secret-shared into two pieces + // proof_left comes from PRSS + let proof_left_2 = + GenericArray::::generate(|i| Fp31::try_from(PROOF_LEFT_2[i]).unwrap()); + let proof_right_2 = GenericArray::::generate(|i| proof_2.g[i] - proof_left_2[i]); + + // fiat-shamir + let pg_3 = ProofGenerator::gen_challenge_and_recurse::( + proof_left_2, + proof_right_2, + pg_2.u, + pg_2.v, ); + assert_eq!(pg_3, (&U_3[..], &V_3[..])); - // test proof only fn - let just_proof_3 = ProofGenerator::::compute_final_proof_only::( - U_3.into_iter().map(|x| Fp31::try_from(x).unwrap()), - V_3.into_iter().map(|x| Fp31::try_from(x).unwrap()), + // final iteration + let proof_3 = ProofGenerator::::compute_final_proof::( + pg_3.u, + pg_3.v, Fp31::try_from(P_RANDOM_WEIGHT).unwrap(), Fp31::try_from(Q_RANDOM_WEIGHT).unwrap(), ); assert_eq!( - just_proof_3.g.iter().map(Fp31::as_u128).collect::>(), - EXPECTED_3, + proof_3.g.iter().map(Fp31::as_u128).collect::>(), + PROOF_3, ); } } From 0a9b29bc86a8d5e08e7014cb52d4457bec906ebd Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Thu, 28 Mar 2024 13:05:34 +0800 Subject: [PATCH 098/135] Alex's comments --- ipa-core/src/protocol/ipa_prf/.DS_Store | Bin 0 -> 6148 bytes .../ipa_prf/malicious_security/hashing.rs | 56 +-- .../ipa_prf/malicious_security/mod.rs | 2 +- .../ipa_prf/malicious_security/prover copy.rs | 324 ++++++++++++++++++ .../ipa_prf/malicious_security/prover.rs | 2 +- 5 files changed, 361 insertions(+), 23 deletions(-) create mode 100644 ipa-core/src/protocol/ipa_prf/.DS_Store create mode 100644 ipa-core/src/protocol/ipa_prf/malicious_security/prover copy.rs diff --git a/ipa-core/src/protocol/ipa_prf/.DS_Store b/ipa-core/src/protocol/ipa_prf/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a6fc5d4cf9032c0299ed902d4fd779aeb8b51c5f GIT binary patch literal 6148 zcmeHKOG*P#5UkcL0&apUm+uPRU=uR=XU1(|Azj<{C`Z+P6|kYf2Dv;7R$w)uT;Ht^m5*78~v8< uH6L_0u7ko5?U)$tm>X}$S5cI8&DVV16%L6(XFlje{S3G+GAZ!a3VZ?$PZ=2i literal 0 HcmV?d00001 diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs index 0b82df05a..f91c881ac 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs @@ -1,35 +1,33 @@ use std::convert::Infallible; use generic_array::GenericArray; -use sha2::{Digest, Sha256}; -use typenum::U32; +use sha2::{ + digest::{Output, OutputSizeUser}, + Digest, Sha256, +}; use crate::{ ff::{Field, Serializable}, - helpers::Message, protocol::prss::FromRandomU128, }; -#[derive(Clone, Copy, Debug, PartialEq)] -pub struct Hash(pub(crate) GenericArray); +#[derive(Debug, PartialEq)] +pub struct Hash(Output); impl Serializable for Hash { - type Size = U32; + type Size = ::OutputSize; + type DeserializationError = Infallible; fn serialize(&self, buf: &mut GenericArray) { - *buf = self.0; + buf.copy_from_slice(&self.0); } fn deserialize(buf: &GenericArray) -> Result { - Ok(Hash(*buf)) + Ok(Hash(*Output::::from_slice(buf))) } } -impl Message for Hash {} - -/// This function allows to compute a hash of a slice of shared values. -/// The output is a single `Hash` struct that can be sent over the network channel to other helper parties. pub fn compute_hash<'a, I, S>(input: I) -> Hash where I: IntoIterator, @@ -37,20 +35,25 @@ where { // set up hash let mut sha = Sha256::new(); + let mut buf = GenericArray::default(); + let mut is_empty = true; + // set state for x in input { - let mut buf = GenericArray::default(); + is_empty = false; x.serialize(&mut buf); - sha.update(buf); + sha.update(&buf); } + + assert!(!is_empty, "must not provide an empty iterator"); // compute hash - Hash(*GenericArray::::from_slice(&sha.finalize()[0..32])) + Hash(sha.finalize()) } -/// This function allows to hash a vector of field elements into a single field element +/// This function takes two hash a vector of field elements into a single field element /// # Panics /// does not panic -pub fn hash_to_field(left: Hash, right: Hash) -> F +pub fn hash_to_field(left: &Hash, right: &Hash) -> F where F: Field + FromRandomU128, { @@ -78,13 +81,12 @@ where mod test { use rand::{thread_rng, Rng}; + use super::compute_hash; use crate::{ ff::{Fp31, Fp32BitPrime}, protocol::ipa_prf::malicious_security::hashing::hash_to_field, }; - use super::compute_hash; - #[test] fn hash_changes() { const LIST_LENGTH: usize = 5; @@ -111,6 +113,18 @@ mod test { hash_1, hash_2, "The hash should change if the input is different" ); + + // swapping two elements should change the hash + let index_1 = rng.gen_range(0..LIST_LENGTH); + let index_2 = (index_1 + rng.gen_range(1..LIST_LENGTH)) % LIST_LENGTH; + list.swap(index_1, index_2); + + let hash_3 = compute_hash(&list); + + assert_ne!( + hash_2, hash_3, + "The hash should change if two elements are swapped" + ); } #[test] @@ -125,7 +139,7 @@ mod test { left.push(rng.gen::()); right.push(rng.gen::()); } - let r1: Fp32BitPrime = hash_to_field(compute_hash(&left), compute_hash(&right)); + let r1: Fp32BitPrime = hash_to_field(&compute_hash(&left), &compute_hash(&right)); // modify one, randomly selected element in the list let random_index = rng.gen::() % LIST_LENGTH; @@ -137,7 +151,7 @@ mod test { right[random_index] = modified_value; } - let r2: Fp32BitPrime = hash_to_field(compute_hash(&left), compute_hash(&right)); + let r2: Fp32BitPrime = hash_to_field(&compute_hash(&left), &compute_hash(&right)); assert_ne!( r1, r2, diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs index 89c576a22..9fd7a8b01 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/mod.rs @@ -1,4 +1,4 @@ -pub mod hashing; +mod hashing; pub mod lagrange; pub mod prover; pub mod verifier; diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover copy.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover copy.rs new file mode 100644 index 000000000..ef84742ea --- /dev/null +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover copy.rs @@ -0,0 +1,324 @@ +use std::{ + iter::zip, + ops::{Add, Sub}, +}; + +use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; +use typenum::{Diff, Sum, U1}; + +use super::hashing::{compute_hash, hash_to_field}; +use crate::{ + ff::PrimeField, + protocol::ipa_prf::malicious_security::lagrange::{ + CanonicalLagrangeDenominator, LagrangeTable, + }, +}; + +pub struct ZeroKnowledgeProof { + pub g: GenericArray, +} + +impl ZeroKnowledgeProof +where + F: PrimeField, + N: ArrayLength, +{ + pub fn new(g: I) -> Self + where + I: IntoIterator, + { + ZeroKnowledgeProof { + g: g.into_iter().collect(), + } + } +} + +#[derive(Debug)] +pub struct ProofGenerator { + u: Vec, + v: Vec, +} + +pub type TwoNMinusOne = Diff, U1>; +pub type TwoNPlusOne = Sum, U1>; + +/// +/// Distributed Zero Knowledge Proofs algorithm drawn from +/// `https://eprint.iacr.org/2023/909.pdf` +/// +#[allow(non_camel_case_types)] +impl ProofGenerator +where + F: PrimeField, +{ + pub fn new(u: Vec, v: Vec) -> Self { + debug_assert_eq!(u.len(), v.len(), "u and v must be of equal length"); + Self { u, v } + } + + pub fn gen_challenge_and_recurse<λ: ArrayLength, I, J>( + proof_left: GenericArray>, + proof_right: GenericArray>, + u: I, + v: J, + ) -> ProofGenerator + where + λ: ArrayLength + Add + Sub, + <λ as Add>::Output: Sub, + <<λ as Add>::Output as Sub>::Output: ArrayLength, + <λ as Sub>::Output: ArrayLength, + I: IntoIterator, + J: IntoIterator, + I::IntoIter: ExactSizeIterator, + J::IntoIter: ExactSizeIterator, + { + let mut u = u.into_iter(); + let mut v = v.into_iter(); + + debug_assert_eq!(u.len() % λ::USIZE, 0); // We should pad with zeroes eventually + + let s = u.len() / λ::USIZE; + + assert!( + s > 1, + "When the output is this small, you should validate the proof with a more straightforward reveal" + ); + + let r: F = hash_to_field(compute_hash(&proof_left), compute_hash(&proof_right)); + let mut p = GenericArray::::generate(|_| F::ZERO); + let mut q = GenericArray::::generate(|_| F::ZERO); + let denominator = CanonicalLagrangeDenominator::::new(); + let lagrange_table_r = LagrangeTable::::new(&denominator, &r); + + let pairs = (0..s).map(|_| { + for i in 0..λ::USIZE { + let x = u.next().unwrap_or(F::ZERO); + let y = v.next().unwrap_or(F::ZERO); + p[i] = x; + q[i] = y; + } + let p_r = lagrange_table_r.eval(&p)[0]; + let q_r = lagrange_table_r.eval(&q)[0]; + (p_r, q_r) + }); + let (u, v) = pairs.unzip(); + ProofGenerator::new(u, v) + } + + pub fn compute_proof<λ: ArrayLength, I, J>( + u: I, + v: J, + ) -> ZeroKnowledgeProof> + where + λ: ArrayLength + Add + Sub, + <λ as Add>::Output: Sub, + <<λ as Add>::Output as Sub>::Output: ArrayLength, + <λ as Sub>::Output: ArrayLength, + I: IntoIterator, + J: IntoIterator, + I::IntoIter: ExactSizeIterator, + J::IntoIter: ExactSizeIterator, + { + let mut u = u.into_iter(); + let mut v = v.into_iter(); + + debug_assert_eq!(u.len() % λ::USIZE, 0); // We should pad with zeroes eventually + + let s = u.len() / λ::USIZE; + + assert!( + s > 1, + "When the output is this small, you should call `compute_final_proof`" + ); + + let denominator = CanonicalLagrangeDenominator::::new(); + let lagrange_table = LagrangeTable::>::Output>::from(denominator); + let mut p = GenericArray::::generate(|_| F::ZERO); + let mut q = GenericArray::::generate(|_| F::ZERO); + let mut proof: GenericArray> = GenericArray::generate(|_| F::ZERO); + for _ in 0..s { + for i in 0..λ::USIZE { + let x = u.next().unwrap_or(F::ZERO); + let y = v.next().unwrap_or(F::ZERO); + p[i] = x; + q[i] = y; + proof[i] += x * y; + } + let p_extrapolated = lagrange_table.eval(&p); + let q_extrapolated = lagrange_table.eval(&q); + + for (i, (x, y)) in + zip(p_extrapolated.into_iter(), q_extrapolated.into_iter()).enumerate() + { + proof[λ::USIZE + i] += x * y; + } + } + ZeroKnowledgeProof::new(proof) + } + + pub fn compute_final_proof<λ: ArrayLength, I, J>( + u: I, + v: J, + p_0: F, + q_0: F, + ) -> ZeroKnowledgeProof> + where + λ: ArrayLength + Add + Add, + <λ as Add>::Output: Add, + <<λ as Add>::Output as Add>::Output: ArrayLength, + <λ as Add>::Output: ArrayLength, + I: IntoIterator, + J: IntoIterator, + I::IntoIter: ExactSizeIterator, + J::IntoIter: ExactSizeIterator, + { + let mut u = u.into_iter(); + let mut v = v.into_iter(); + + assert_eq!(u.len(), λ::USIZE); // We should pad with zeroes eventually + assert_eq!(v.len(), λ::USIZE); // We should pad with zeroes eventually + + // We need a table of size `λ + 1` since we add a random point at x=0 + let denominator = CanonicalLagrangeDenominator::>::new(); + let lagrange_table = LagrangeTable::, λ>::from(denominator); + + let mut p = GenericArray::>::generate(|_| F::ZERO); + let mut q = GenericArray::>::generate(|_| F::ZERO); + let mut proof: GenericArray> = GenericArray::generate(|_| F::ZERO); + p[0] = p_0; + q[0] = q_0; + proof[0] = p_0 * q_0; + + for i in 0..λ::USIZE { + let x = u.next().unwrap_or(F::ZERO); + let y = v.next().unwrap_or(F::ZERO); + p[i + 1] = x; + q[i + 1] = y; + proof[i + 1] += x * y; + } + let p_extrapolated = lagrange_table.eval(&p); + let q_extrapolated = lagrange_table.eval(&q); + + for (i, (x, y)) in zip(p_extrapolated.into_iter(), q_extrapolated.into_iter()).enumerate() { + proof[λ::USIZE + 1 + i] += x * y; + } + + ZeroKnowledgeProof::new(proof) + } +} + +impl PartialEq<(&[u128], &[u128])> for ProofGenerator +where + F: PrimeField + std::cmp::PartialEq, +{ + fn eq(&self, other: &(&[u128], &[u128])) -> bool { + let (cmp_a, cmp_b) = other; + for (i, elem) in cmp_a.iter().enumerate() { + if !self.u[i].eq(elem) { + return false; + } + } + for (i, elem) in cmp_b.iter().enumerate() { + if !self.v[i].eq(elem) { + return false; + } + } + true + } +} + +#[cfg(all(test, unit_test))] +mod test { + use generic_array::{sequence::GenericSequence, GenericArray}; + use typenum::{U2, U4, U7}; + + use super::ProofGenerator; + use crate::ff::{Fp31, U128Conversions}; + + #[test] + fn sample_proof() { + const U_1: [u128; 32] = [ + 0, 30, 0, 16, 0, 1, 0, 15, 0, 0, 0, 16, 0, 30, 0, 16, 29, 1, 1, 15, 0, 0, 1, 15, 2, 30, + 30, 16, 0, 0, 30, 16, + ]; + const V_1: [u128; 32] = [ + 0, 0, 0, 30, 0, 0, 0, 1, 30, 30, 30, 30, 0, 0, 30, 30, 0, 30, 0, 30, 0, 0, 0, 1, 0, 0, + 1, 1, 0, 0, 1, 1, + ]; + const PROOF_1: [u128; 7] = [0, 30, 29, 30, 5, 28, 13]; + const PROOF_LEFT_1: [u128; 7] = [1, 4, 10, 15, 12, 15, 29]; + const U_2: [u128; 8] = [0, 0, 26, 0, 7, 18, 24, 13]; + const V_2: [u128; 8] = [10, 21, 30, 28, 15, 21, 3, 3]; + + const PROOF_2: [u128; 7] = [12, 6, 15, 8, 29, 30, 6]; + const PROOF_LEFT_2: [u128; 7] = [30, 28, 10, 25, 12, 23, 29]; + const U_3: [u128; 2] = [3, 3]; + const V_3: [u128; 2] = [5, 24]; + + const PROOF_3: [u128; 5] = [12, 15, 10, 14, 17]; + const P_RANDOM_WEIGHT: u128 = 12; + const Q_RANDOM_WEIGHT: u128 = 1; + + // first iteration + let proof_1 = ProofGenerator::::compute_proof::( + U_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), + V_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), + ); + assert_eq!( + proof_1.g.iter().map(Fp31::as_u128).collect::>(), + PROOF_1, + ); + + // ZKP is secret-shared into two pieces + // proof_left comes from PRSS + let proof_left_1 = + GenericArray::::generate(|i| Fp31::try_from(PROOF_LEFT_1[i]).unwrap()); + let proof_right_1 = GenericArray::::generate(|i| proof_1.g[i] - proof_left_1[i]); + + // fiat-shamir + let pg_2 = ProofGenerator::gen_challenge_and_recurse::( + proof_left_1, + proof_right_1, + U_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), + V_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), + ); + assert_eq!(pg_2, (&U_2[..], &V_2[..])); + + // next iteration + let proof_2 = ProofGenerator::::compute_proof::( + U_2.into_iter().map(|x| Fp31::try_from(x).unwrap()), + V_2.into_iter().map(|x| Fp31::try_from(x).unwrap()), + ); + assert_eq!( + proof_2.g.iter().map(Fp31::as_u128).collect::>(), + PROOF_2, + ); + + // ZKP is secret-shared into two pieces + // proof_left comes from PRSS + let proof_left_2 = + GenericArray::::generate(|i| Fp31::try_from(PROOF_LEFT_2[i]).unwrap()); + let proof_right_2 = GenericArray::::generate(|i| proof_2.g[i] - proof_left_2[i]); + + // fiat-shamir + let pg_3 = ProofGenerator::gen_challenge_and_recurse::( + proof_left_2, + proof_right_2, + pg_2.u, + pg_2.v, + ); + assert_eq!(pg_3, (&U_3[..], &V_3[..])); + + // final iteration + let proof_3 = ProofGenerator::::compute_final_proof::( + pg_3.u, + pg_3.v, + Fp31::try_from(P_RANDOM_WEIGHT).unwrap(), + Fp31::try_from(Q_RANDOM_WEIGHT).unwrap(), + ); + assert_eq!( + proof_3.g.iter().map(Fp31::as_u128).collect::>(), + PROOF_3, + ); + } +} diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index ef84742ea..b8c566bbb 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -84,7 +84,7 @@ where "When the output is this small, you should validate the proof with a more straightforward reveal" ); - let r: F = hash_to_field(compute_hash(&proof_left), compute_hash(&proof_right)); + let r: F = hash_to_field(&compute_hash(&proof_left), &compute_hash(&proof_right)); let mut p = GenericArray::::generate(|_| F::ZERO); let mut q = GenericArray::::generate(|_| F::ZERO); let denominator = CanonicalLagrangeDenominator::::new(); From 3f82ce9c6dcb6b90050bf2522712771deb0545f8 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Thu, 28 Mar 2024 13:06:33 +0800 Subject: [PATCH 099/135] whoops --- ipa-core/src/protocol/ipa_prf/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ipa-core/src/protocol/ipa_prf/.DS_Store diff --git a/ipa-core/src/protocol/ipa_prf/.DS_Store b/ipa-core/src/protocol/ipa_prf/.DS_Store deleted file mode 100644 index a6fc5d4cf9032c0299ed902d4fd779aeb8b51c5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKOG*P#5UkcL0&apUm+uPRU=uR=XU1(|Azj<{C`Z+P6|kYf2Dv;7R$w)uT;Ht^m5*78~v8< uH6L_0u7ko5?U)$tm>X}$S5cI8&DVV16%L6(XFlje{S3G+GAZ!a3VZ?$PZ=2i From 73ef0f8c0871c16f71d6f3e40fb3402a47585615 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Thu, 28 Mar 2024 13:19:06 +0800 Subject: [PATCH 100/135] clippy --- .../ipa_prf/malicious_security/hashing.rs | 14 ++++++++++++-- .../ipa_prf/malicious_security/prover.rs | 16 ++++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs index f91c881ac..4d490f318 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs @@ -115,8 +115,18 @@ mod test { ); // swapping two elements should change the hash - let index_1 = rng.gen_range(0..LIST_LENGTH); - let index_2 = (index_1 + rng.gen_range(1..LIST_LENGTH)) % LIST_LENGTH; + let mut index_1 = 0; + let mut index_2 = 0; + // There is a 1 in 31 chance that these two elements are the exact same value. + // To make sure this doesn't become a flaky test, let's just pick two different + // elements to swap when that happens. + // This will be an infinite loop if all elements are the same. The chances of that + // are (1 / 31) ^ (LIST_LENGTH - 1) + // which is 1 in 923,521 when LIST_LENGTH is 5. I'm OK with that. + while list[index_1] == list[index_2] { + index_1 = rng.gen_range(0..LIST_LENGTH); + index_2 = (index_1 + rng.gen_range(1..LIST_LENGTH)) % LIST_LENGTH; + } list.swap(index_1, index_2); let hash_3 = compute_hash(&list); diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index b8c566bbb..175b3d977 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -46,7 +46,7 @@ pub type TwoNPlusOne = Sum, U1>; /// Distributed Zero Knowledge Proofs algorithm drawn from /// `https://eprint.iacr.org/2023/909.pdf` /// -#[allow(non_camel_case_types)] +#[allow(non_camel_case_types, clippy::many_single_char_names)] impl ProofGenerator where F: PrimeField, @@ -57,8 +57,8 @@ where } pub fn gen_challenge_and_recurse<λ: ArrayLength, I, J>( - proof_left: GenericArray>, - proof_right: GenericArray>, + proof_left: &GenericArray>, + proof_right: &GenericArray>, u: I, v: J, ) -> ProofGenerator @@ -84,7 +84,7 @@ where "When the output is this small, you should validate the proof with a more straightforward reveal" ); - let r: F = hash_to_field(&compute_hash(&proof_left), &compute_hash(&proof_right)); + let r: F = hash_to_field(&compute_hash(proof_left), &compute_hash(proof_right)); let mut p = GenericArray::::generate(|_| F::ZERO); let mut q = GenericArray::::generate(|_| F::ZERO); let denominator = CanonicalLagrangeDenominator::::new(); @@ -277,8 +277,8 @@ mod test { // fiat-shamir let pg_2 = ProofGenerator::gen_challenge_and_recurse::( - proof_left_1, - proof_right_1, + &proof_left_1, + &proof_right_1, U_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), V_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), ); @@ -302,8 +302,8 @@ mod test { // fiat-shamir let pg_3 = ProofGenerator::gen_challenge_and_recurse::( - proof_left_2, - proof_right_2, + &proof_left_2, + &proof_right_2, pg_2.u, pg_2.v, ); From 2f73715a01a2356af11a8cc89e77c8e08342768c Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Thu, 28 Mar 2024 13:20:17 +0800 Subject: [PATCH 101/135] whoops --- .../ipa_prf/malicious_security/prover copy.rs | 324 ------------------ 1 file changed, 324 deletions(-) delete mode 100644 ipa-core/src/protocol/ipa_prf/malicious_security/prover copy.rs diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover copy.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover copy.rs deleted file mode 100644 index ef84742ea..000000000 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover copy.rs +++ /dev/null @@ -1,324 +0,0 @@ -use std::{ - iter::zip, - ops::{Add, Sub}, -}; - -use generic_array::{sequence::GenericSequence, ArrayLength, GenericArray}; -use typenum::{Diff, Sum, U1}; - -use super::hashing::{compute_hash, hash_to_field}; -use crate::{ - ff::PrimeField, - protocol::ipa_prf::malicious_security::lagrange::{ - CanonicalLagrangeDenominator, LagrangeTable, - }, -}; - -pub struct ZeroKnowledgeProof { - pub g: GenericArray, -} - -impl ZeroKnowledgeProof -where - F: PrimeField, - N: ArrayLength, -{ - pub fn new(g: I) -> Self - where - I: IntoIterator, - { - ZeroKnowledgeProof { - g: g.into_iter().collect(), - } - } -} - -#[derive(Debug)] -pub struct ProofGenerator { - u: Vec, - v: Vec, -} - -pub type TwoNMinusOne = Diff, U1>; -pub type TwoNPlusOne = Sum, U1>; - -/// -/// Distributed Zero Knowledge Proofs algorithm drawn from -/// `https://eprint.iacr.org/2023/909.pdf` -/// -#[allow(non_camel_case_types)] -impl ProofGenerator -where - F: PrimeField, -{ - pub fn new(u: Vec, v: Vec) -> Self { - debug_assert_eq!(u.len(), v.len(), "u and v must be of equal length"); - Self { u, v } - } - - pub fn gen_challenge_and_recurse<λ: ArrayLength, I, J>( - proof_left: GenericArray>, - proof_right: GenericArray>, - u: I, - v: J, - ) -> ProofGenerator - where - λ: ArrayLength + Add + Sub, - <λ as Add>::Output: Sub, - <<λ as Add>::Output as Sub>::Output: ArrayLength, - <λ as Sub>::Output: ArrayLength, - I: IntoIterator, - J: IntoIterator, - I::IntoIter: ExactSizeIterator, - J::IntoIter: ExactSizeIterator, - { - let mut u = u.into_iter(); - let mut v = v.into_iter(); - - debug_assert_eq!(u.len() % λ::USIZE, 0); // We should pad with zeroes eventually - - let s = u.len() / λ::USIZE; - - assert!( - s > 1, - "When the output is this small, you should validate the proof with a more straightforward reveal" - ); - - let r: F = hash_to_field(compute_hash(&proof_left), compute_hash(&proof_right)); - let mut p = GenericArray::::generate(|_| F::ZERO); - let mut q = GenericArray::::generate(|_| F::ZERO); - let denominator = CanonicalLagrangeDenominator::::new(); - let lagrange_table_r = LagrangeTable::::new(&denominator, &r); - - let pairs = (0..s).map(|_| { - for i in 0..λ::USIZE { - let x = u.next().unwrap_or(F::ZERO); - let y = v.next().unwrap_or(F::ZERO); - p[i] = x; - q[i] = y; - } - let p_r = lagrange_table_r.eval(&p)[0]; - let q_r = lagrange_table_r.eval(&q)[0]; - (p_r, q_r) - }); - let (u, v) = pairs.unzip(); - ProofGenerator::new(u, v) - } - - pub fn compute_proof<λ: ArrayLength, I, J>( - u: I, - v: J, - ) -> ZeroKnowledgeProof> - where - λ: ArrayLength + Add + Sub, - <λ as Add>::Output: Sub, - <<λ as Add>::Output as Sub>::Output: ArrayLength, - <λ as Sub>::Output: ArrayLength, - I: IntoIterator, - J: IntoIterator, - I::IntoIter: ExactSizeIterator, - J::IntoIter: ExactSizeIterator, - { - let mut u = u.into_iter(); - let mut v = v.into_iter(); - - debug_assert_eq!(u.len() % λ::USIZE, 0); // We should pad with zeroes eventually - - let s = u.len() / λ::USIZE; - - assert!( - s > 1, - "When the output is this small, you should call `compute_final_proof`" - ); - - let denominator = CanonicalLagrangeDenominator::::new(); - let lagrange_table = LagrangeTable::>::Output>::from(denominator); - let mut p = GenericArray::::generate(|_| F::ZERO); - let mut q = GenericArray::::generate(|_| F::ZERO); - let mut proof: GenericArray> = GenericArray::generate(|_| F::ZERO); - for _ in 0..s { - for i in 0..λ::USIZE { - let x = u.next().unwrap_or(F::ZERO); - let y = v.next().unwrap_or(F::ZERO); - p[i] = x; - q[i] = y; - proof[i] += x * y; - } - let p_extrapolated = lagrange_table.eval(&p); - let q_extrapolated = lagrange_table.eval(&q); - - for (i, (x, y)) in - zip(p_extrapolated.into_iter(), q_extrapolated.into_iter()).enumerate() - { - proof[λ::USIZE + i] += x * y; - } - } - ZeroKnowledgeProof::new(proof) - } - - pub fn compute_final_proof<λ: ArrayLength, I, J>( - u: I, - v: J, - p_0: F, - q_0: F, - ) -> ZeroKnowledgeProof> - where - λ: ArrayLength + Add + Add, - <λ as Add>::Output: Add, - <<λ as Add>::Output as Add>::Output: ArrayLength, - <λ as Add>::Output: ArrayLength, - I: IntoIterator, - J: IntoIterator, - I::IntoIter: ExactSizeIterator, - J::IntoIter: ExactSizeIterator, - { - let mut u = u.into_iter(); - let mut v = v.into_iter(); - - assert_eq!(u.len(), λ::USIZE); // We should pad with zeroes eventually - assert_eq!(v.len(), λ::USIZE); // We should pad with zeroes eventually - - // We need a table of size `λ + 1` since we add a random point at x=0 - let denominator = CanonicalLagrangeDenominator::>::new(); - let lagrange_table = LagrangeTable::, λ>::from(denominator); - - let mut p = GenericArray::>::generate(|_| F::ZERO); - let mut q = GenericArray::>::generate(|_| F::ZERO); - let mut proof: GenericArray> = GenericArray::generate(|_| F::ZERO); - p[0] = p_0; - q[0] = q_0; - proof[0] = p_0 * q_0; - - for i in 0..λ::USIZE { - let x = u.next().unwrap_or(F::ZERO); - let y = v.next().unwrap_or(F::ZERO); - p[i + 1] = x; - q[i + 1] = y; - proof[i + 1] += x * y; - } - let p_extrapolated = lagrange_table.eval(&p); - let q_extrapolated = lagrange_table.eval(&q); - - for (i, (x, y)) in zip(p_extrapolated.into_iter(), q_extrapolated.into_iter()).enumerate() { - proof[λ::USIZE + 1 + i] += x * y; - } - - ZeroKnowledgeProof::new(proof) - } -} - -impl PartialEq<(&[u128], &[u128])> for ProofGenerator -where - F: PrimeField + std::cmp::PartialEq, -{ - fn eq(&self, other: &(&[u128], &[u128])) -> bool { - let (cmp_a, cmp_b) = other; - for (i, elem) in cmp_a.iter().enumerate() { - if !self.u[i].eq(elem) { - return false; - } - } - for (i, elem) in cmp_b.iter().enumerate() { - if !self.v[i].eq(elem) { - return false; - } - } - true - } -} - -#[cfg(all(test, unit_test))] -mod test { - use generic_array::{sequence::GenericSequence, GenericArray}; - use typenum::{U2, U4, U7}; - - use super::ProofGenerator; - use crate::ff::{Fp31, U128Conversions}; - - #[test] - fn sample_proof() { - const U_1: [u128; 32] = [ - 0, 30, 0, 16, 0, 1, 0, 15, 0, 0, 0, 16, 0, 30, 0, 16, 29, 1, 1, 15, 0, 0, 1, 15, 2, 30, - 30, 16, 0, 0, 30, 16, - ]; - const V_1: [u128; 32] = [ - 0, 0, 0, 30, 0, 0, 0, 1, 30, 30, 30, 30, 0, 0, 30, 30, 0, 30, 0, 30, 0, 0, 0, 1, 0, 0, - 1, 1, 0, 0, 1, 1, - ]; - const PROOF_1: [u128; 7] = [0, 30, 29, 30, 5, 28, 13]; - const PROOF_LEFT_1: [u128; 7] = [1, 4, 10, 15, 12, 15, 29]; - const U_2: [u128; 8] = [0, 0, 26, 0, 7, 18, 24, 13]; - const V_2: [u128; 8] = [10, 21, 30, 28, 15, 21, 3, 3]; - - const PROOF_2: [u128; 7] = [12, 6, 15, 8, 29, 30, 6]; - const PROOF_LEFT_2: [u128; 7] = [30, 28, 10, 25, 12, 23, 29]; - const U_3: [u128; 2] = [3, 3]; - const V_3: [u128; 2] = [5, 24]; - - const PROOF_3: [u128; 5] = [12, 15, 10, 14, 17]; - const P_RANDOM_WEIGHT: u128 = 12; - const Q_RANDOM_WEIGHT: u128 = 1; - - // first iteration - let proof_1 = ProofGenerator::::compute_proof::( - U_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), - V_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), - ); - assert_eq!( - proof_1.g.iter().map(Fp31::as_u128).collect::>(), - PROOF_1, - ); - - // ZKP is secret-shared into two pieces - // proof_left comes from PRSS - let proof_left_1 = - GenericArray::::generate(|i| Fp31::try_from(PROOF_LEFT_1[i]).unwrap()); - let proof_right_1 = GenericArray::::generate(|i| proof_1.g[i] - proof_left_1[i]); - - // fiat-shamir - let pg_2 = ProofGenerator::gen_challenge_and_recurse::( - proof_left_1, - proof_right_1, - U_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), - V_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), - ); - assert_eq!(pg_2, (&U_2[..], &V_2[..])); - - // next iteration - let proof_2 = ProofGenerator::::compute_proof::( - U_2.into_iter().map(|x| Fp31::try_from(x).unwrap()), - V_2.into_iter().map(|x| Fp31::try_from(x).unwrap()), - ); - assert_eq!( - proof_2.g.iter().map(Fp31::as_u128).collect::>(), - PROOF_2, - ); - - // ZKP is secret-shared into two pieces - // proof_left comes from PRSS - let proof_left_2 = - GenericArray::::generate(|i| Fp31::try_from(PROOF_LEFT_2[i]).unwrap()); - let proof_right_2 = GenericArray::::generate(|i| proof_2.g[i] - proof_left_2[i]); - - // fiat-shamir - let pg_3 = ProofGenerator::gen_challenge_and_recurse::( - proof_left_2, - proof_right_2, - pg_2.u, - pg_2.v, - ); - assert_eq!(pg_3, (&U_3[..], &V_3[..])); - - // final iteration - let proof_3 = ProofGenerator::::compute_final_proof::( - pg_3.u, - pg_3.v, - Fp31::try_from(P_RANDOM_WEIGHT).unwrap(), - Fp31::try_from(Q_RANDOM_WEIGHT).unwrap(), - ); - assert_eq!( - proof_3.g.iter().map(Fp31::as_u128).collect::>(), - PROOF_3, - ); - } -} From b6abe9f79ed005b3af8c5cdd6b1f54e17bfea7f7 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Thu, 28 Mar 2024 13:22:44 +0800 Subject: [PATCH 102/135] trying to make the git-diff format nicer --- .../ipa_prf/malicious_security/prover.rs | 98 +++++++++---------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index 175b3d977..a8ab9688f 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -56,55 +56,6 @@ where Self { u, v } } - pub fn gen_challenge_and_recurse<λ: ArrayLength, I, J>( - proof_left: &GenericArray>, - proof_right: &GenericArray>, - u: I, - v: J, - ) -> ProofGenerator - where - λ: ArrayLength + Add + Sub, - <λ as Add>::Output: Sub, - <<λ as Add>::Output as Sub>::Output: ArrayLength, - <λ as Sub>::Output: ArrayLength, - I: IntoIterator, - J: IntoIterator, - I::IntoIter: ExactSizeIterator, - J::IntoIter: ExactSizeIterator, - { - let mut u = u.into_iter(); - let mut v = v.into_iter(); - - debug_assert_eq!(u.len() % λ::USIZE, 0); // We should pad with zeroes eventually - - let s = u.len() / λ::USIZE; - - assert!( - s > 1, - "When the output is this small, you should validate the proof with a more straightforward reveal" - ); - - let r: F = hash_to_field(&compute_hash(proof_left), &compute_hash(proof_right)); - let mut p = GenericArray::::generate(|_| F::ZERO); - let mut q = GenericArray::::generate(|_| F::ZERO); - let denominator = CanonicalLagrangeDenominator::::new(); - let lagrange_table_r = LagrangeTable::::new(&denominator, &r); - - let pairs = (0..s).map(|_| { - for i in 0..λ::USIZE { - let x = u.next().unwrap_or(F::ZERO); - let y = v.next().unwrap_or(F::ZERO); - p[i] = x; - q[i] = y; - } - let p_r = lagrange_table_r.eval(&p)[0]; - let q_r = lagrange_table_r.eval(&q)[0]; - (p_r, q_r) - }); - let (u, v) = pairs.unzip(); - ProofGenerator::new(u, v) - } - pub fn compute_proof<λ: ArrayLength, I, J>( u: I, v: J, @@ -205,6 +156,55 @@ where ZeroKnowledgeProof::new(proof) } + + pub fn gen_challenge_and_recurse<λ: ArrayLength, I, J>( + proof_left: &GenericArray>, + proof_right: &GenericArray>, + u: I, + v: J, + ) -> ProofGenerator + where + λ: ArrayLength + Add + Sub, + <λ as Add>::Output: Sub, + <<λ as Add>::Output as Sub>::Output: ArrayLength, + <λ as Sub>::Output: ArrayLength, + I: IntoIterator, + J: IntoIterator, + I::IntoIter: ExactSizeIterator, + J::IntoIter: ExactSizeIterator, + { + let mut u = u.into_iter(); + let mut v = v.into_iter(); + + debug_assert_eq!(u.len() % λ::USIZE, 0); // We should pad with zeroes eventually + + let s = u.len() / λ::USIZE; + + assert!( + s > 1, + "When the output is this small, you should validate the proof with a more straightforward reveal" + ); + + let r: F = hash_to_field(&compute_hash(proof_left), &compute_hash(proof_right)); + let mut p = GenericArray::::generate(|_| F::ZERO); + let mut q = GenericArray::::generate(|_| F::ZERO); + let denominator = CanonicalLagrangeDenominator::::new(); + let lagrange_table_r = LagrangeTable::::new(&denominator, &r); + + let pairs = (0..s).map(|_| { + for i in 0..λ::USIZE { + let x = u.next().unwrap_or(F::ZERO); + let y = v.next().unwrap_or(F::ZERO); + p[i] = x; + q[i] = y; + } + let p_r = lagrange_table_r.eval(&p)[0]; + let q_r = lagrange_table_r.eval(&q)[0]; + (p_r, q_r) + }); + let (u, v) = pairs.unzip(); + ProofGenerator::new(u, v) + } } impl PartialEq<(&[u128], &[u128])> for ProofGenerator From 17c6a95cecda2aaa1874c6a868813c8deaf87d43 Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Tue, 2 Apr 2024 11:38:51 +0800 Subject: [PATCH 103/135] Adding test for serialize and deserialize for Hash --- .../ipa_prf/malicious_security/hashing.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs index 4d490f318..db2b8fe85 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs @@ -79,14 +79,28 @@ where #[cfg(all(test, unit_test))] mod test { + use generic_array::{sequence::GenericSequence, GenericArray}; use rand::{thread_rng, Rng}; + use typenum::{U64, U8}; - use super::compute_hash; + use super::{compute_hash, Hash}; use crate::{ - ff::{Fp31, Fp32BitPrime}, + ff::{Fp31, Fp32BitPrime, Serializable}, protocol::ipa_prf::malicious_security::hashing::hash_to_field, }; + #[test] + fn can_serialize_and_deserialize() { + let mut rng = thread_rng(); + let list: GenericArray = + GenericArray::generate(|_| rng.gen::()); + let hash: Hash = compute_hash(&list); + let mut buf: GenericArray = GenericArray::default(); + hash.serialize(&mut buf); + let deserialized_hash = Hash::deserialize(&buf); + assert_eq!(hash, deserialized_hash.unwrap()); + } + #[test] fn hash_changes() { const LIST_LENGTH: usize = 5; From b0165b7494c0a23e09f71c1a98996c077e4852bb Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Tue, 2 Apr 2024 11:40:34 +0800 Subject: [PATCH 104/135] removing unused import --- ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs index db2b8fe85..25263d670 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/hashing.rs @@ -81,7 +81,7 @@ where mod test { use generic_array::{sequence::GenericSequence, GenericArray}; use rand::{thread_rng, Rng}; - use typenum::{U64, U8}; + use typenum::U8; use super::{compute_hash, Hash}; use crate::{ From 578eb2c0acd9412a01b56f5d1be4c96966c0cb1c Mon Sep 17 00:00:00 2001 From: Ben Savage Date: Tue, 2 Apr 2024 13:16:11 +0800 Subject: [PATCH 105/135] Pass in reference to Lagrange Table --- .../ipa_prf/malicious_security/prover.rs | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs index a8ab9688f..fcb966f0e 100644 --- a/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs +++ b/ipa-core/src/protocol/ipa_prf/malicious_security/prover.rs @@ -59,6 +59,7 @@ where pub fn compute_proof<λ: ArrayLength, I, J>( u: I, v: J, + lagrange_table: &LagrangeTable>::Output>, ) -> ZeroKnowledgeProof> where λ: ArrayLength + Add + Sub, @@ -82,8 +83,6 @@ where "When the output is this small, you should call `compute_final_proof`" ); - let denominator = CanonicalLagrangeDenominator::::new(); - let lagrange_table = LagrangeTable::>::Output>::from(denominator); let mut p = GenericArray::::generate(|_| F::ZERO); let mut q = GenericArray::::generate(|_| F::ZERO); let mut proof: GenericArray> = GenericArray::generate(|_| F::ZERO); @@ -112,6 +111,7 @@ where v: J, p_0: F, q_0: F, + lagrange_table: &LagrangeTable, λ>, ) -> ZeroKnowledgeProof> where λ: ArrayLength + Add + Add, @@ -129,10 +129,6 @@ where assert_eq!(u.len(), λ::USIZE); // We should pad with zeroes eventually assert_eq!(v.len(), λ::USIZE); // We should pad with zeroes eventually - // We need a table of size `λ + 1` since we add a random point at x=0 - let denominator = CanonicalLagrangeDenominator::>::new(); - let lagrange_table = LagrangeTable::, λ>::from(denominator); - let mut p = GenericArray::>::generate(|_| F::ZERO); let mut q = GenericArray::>::generate(|_| F::ZERO); let mut proof: GenericArray> = GenericArray::generate(|_| F::ZERO); @@ -147,6 +143,7 @@ where q[i + 1] = y; proof[i + 1] += x * y; } + // We need a table of size `λ + 1` since we add a random point at x=0 let p_extrapolated = lagrange_table.eval(&p); let q_extrapolated = lagrange_table.eval(&q); @@ -230,10 +227,15 @@ where #[cfg(all(test, unit_test))] mod test { use generic_array::{sequence::GenericSequence, GenericArray}; - use typenum::{U2, U4, U7}; + use typenum::{U2, U3, U4, U7}; use super::ProofGenerator; - use crate::ff::{Fp31, U128Conversions}; + use crate::{ + ff::{Fp31, U128Conversions}, + protocol::ipa_prf::malicious_security::lagrange::{ + CanonicalLagrangeDenominator, LagrangeTable, + }, + }; #[test] fn sample_proof() { @@ -259,10 +261,14 @@ mod test { const P_RANDOM_WEIGHT: u128 = 12; const Q_RANDOM_WEIGHT: u128 = 1; + let denominator = CanonicalLagrangeDenominator::::new(); + let lagrange_table = LagrangeTable::::from(denominator); + // first iteration let proof_1 = ProofGenerator::::compute_proof::( U_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), V_1.into_iter().map(|x| Fp31::try_from(x).unwrap()), + &lagrange_table, ); assert_eq!( proof_1.g.iter().map(Fp31::as_u128).collect::>(), @@ -288,6 +294,7 @@ mod test { let proof_2 = ProofGenerator::::compute_proof::( U_2.into_iter().map(|x| Fp31::try_from(x).unwrap()), V_2.into_iter().map(|x| Fp31::try_from(x).unwrap()), + &lagrange_table, ); assert_eq!( proof_2.g.iter().map(Fp31::as_u128).collect::>(), @@ -310,11 +317,14 @@ mod test { assert_eq!(pg_3, (&U_3[..], &V_3[..])); // final iteration + let denominator = CanonicalLagrangeDenominator::::new(); + let lagrange_table = LagrangeTable::::from(denominator); let proof_3 = ProofGenerator::::compute_final_proof::( pg_3.u, pg_3.v, Fp31::try_from(P_RANDOM_WEIGHT).unwrap(), Fp31::try_from(Q_RANDOM_WEIGHT).unwrap(), + &lagrange_table, ); assert_eq!( proof_3.g.iter().map(Fp31::as_u128).collect::>(), From b0b700ac1f89f4b1de19ea6dd67749eb05ebb1b9 Mon Sep 17 00:00:00 2001 From: Christian Berkhoff Date: Thu, 4 Apr 2024 08:51:20 -0700 Subject: [PATCH 106/135] Serde is now a non-optional dependency (#996) * Serde is now a non-optional dependency Removed the "enable-serde" flag and made Serde a non-optional dependency. Removed the cfg attributes that depended on the feature since now the library is included by default. * Fixed formatting * Fixed build issues * Removed unused structures to help with coverage * fixing format --- ipa-core/Cargo.toml | 10 +- ipa-core/src/bin/ipa_bench/config.rs | 2 - ipa-core/src/bin/ipa_bench/models.rs | 126 ++---------------- ipa-core/src/cli/ipa_output.rs | 5 +- ipa-core/src/cli/mod.rs | 1 - ipa-core/src/cli/noise.rs | 9 +- ipa-core/src/error.rs | 1 - ipa-core/src/ff/field.rs | 4 +- ipa-core/src/helpers/mod.rs | 30 ++--- ipa-core/src/helpers/transport/query/mod.rs | 46 +------ .../helpers/transport/query/oprf_shuffle.rs | 5 - ipa-core/src/lib.rs | 3 +- ipa-core/src/net/http_serde.rs | 15 ++- ipa-core/src/protocol/mod.rs | 12 +- ipa-core/src/protocol/step/compact.rs | 9 +- ipa-core/src/protocol/step/descriptive.rs | 10 +- 16 files changed, 57 insertions(+), 231 deletions(-) delete mode 100644 ipa-core/src/helpers/transport/query/oprf_shuffle.rs diff --git a/ipa-core/Cargo.toml b/ipa-core/Cargo.toml index 2eca7d8e7..8bf015974 100644 --- a/ipa-core/Cargo.toml +++ b/ipa-core/Cargo.toml @@ -18,7 +18,6 @@ default = [ "ipa-prf", ] cli = ["comfy-table", "clap"] -enable-serde = ["serde", "serde_json"] disable-metrics = [] # TODO move web-app to a separate crate. It adds a lot of build time to people who mostly write protocols # TODO Consider moving out benches as well @@ -28,7 +27,6 @@ web-app = [ "base64", "clap", "comfy-table", - "enable-serde", "hyper", "hyper-rustls", "rcgen", @@ -40,7 +38,7 @@ web-app = [ "tower", "tower-http", ] -test-fixture = ["enable-serde", "weak-field"] +test-fixture = ["weak-field"] # Include observability instruments that detect lack of progress inside MPC. If there is a bug that leads to helper # miscommunication, this feature helps to detect it. Turning it on has some cost. # If "shuttle" feature is enabled, turning this on has no effect. @@ -134,8 +132,8 @@ rustls-pemfile = { version = "1", optional = true } # we can remove pinning rustls-webpki = "^0.101.4" # TODO consider using zerocopy or serde_bytes or in-house serialization -serde = { version = "1.0", optional = true, features = ["derive"] } -serde_json = { version = "1.0", optional = true } +serde = { version = "1.0", features = ["derive"] } +serde_json = { version = "1.0" } sha2 = "0.10" shuttle-crate = { package = "shuttle", version = "0.6.1", optional = true } thiserror = "1.0" @@ -179,7 +177,7 @@ bench = false [[bin]] name = "ipa_bench" path = "src/bin/ipa_bench/ipa_bench.rs" -required-features = ["cli", "enable-serde"] +required-features = ["cli"] bench = false [[bin]] diff --git a/ipa-core/src/bin/ipa_bench/config.rs b/ipa-core/src/bin/ipa_bench/config.rs index 21bc41fa1..128577f9d 100644 --- a/ipa-core/src/bin/ipa_bench/config.rs +++ b/ipa-core/src/bin/ipa_bench/config.rs @@ -2,14 +2,12 @@ use std::ops::Range; use serde::{Deserialize, Serialize}; -#[cfg(feature = "enable-serde")] #[derive(Serialize, Deserialize, Debug)] pub struct WeightedIndex { pub index: T, pub weight: f64, } -#[cfg(feature = "enable-serde")] #[derive(Serialize, Deserialize, Debug)] pub struct Config { pub devices_per_user: Vec>, diff --git a/ipa-core/src/bin/ipa_bench/models.rs b/ipa-core/src/bin/ipa_bench/models.rs index cade92aaa..a1a70ad73 100644 --- a/ipa-core/src/bin/ipa_bench/models.rs +++ b/ipa-core/src/bin/ipa_bench/models.rs @@ -1,15 +1,12 @@ use std::{ fmt::{Debug, Formatter}, - io::{Error as IoError, ErrorKind as IoErrorKind}, ops::Range, }; -use rand::{CryptoRng, Rng, RngCore}; use serde::{Deserialize, Serialize}; // Type aliases to indicate whether the parameter should be encrypted, secret shared, etc. // Underlying types are temporalily assigned for PoC. -pub type CipherText = Vec; type PlainText = String; pub type MatchKey = u64; pub type Number = u32; @@ -20,107 +17,7 @@ pub type Epoch = u8; /// An offset in seconds into a given epoch. Using an 32-bit value > 20-bit > 604,800 seconds. pub type Offset = u32; -#[derive(Debug, Clone)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] -pub struct SecretShare { - ss: [CipherText; 3], -} - -impl SecretShare { - fn combine(&self) -> Vec { - let mut result = Vec::new(); - - assert!(self.ss[0].len() == self.ss[1].len()); - assert!(self.ss[0].len() == self.ss[2].len()); - - for i in 0..self.ss[0].len() { - result.push(self.ss[0][i] ^ self.ss[1][i] ^ self.ss[2][i]); - } - - result - } - - // TODO: Add Shamir's SS - - fn xor(data: &[u8], rng: &mut R) -> Self { - let mut ss = [Vec::new(), Vec::new(), Vec::new()]; - - for x in data { - let ss1 = rng.gen::(); - let ss2 = rng.gen::(); - let ss3 = ss1 ^ ss2 ^ x; - - ss[0].push(ss1); - ss[1].push(ss2); - ss[2].push(ss3); - } - - SecretShare { ss } - } -} - -pub trait SecretSharable { - /// Splits the number into secret shares - fn xor_split(&self, rng: &mut R) -> SecretShare; - - /// Combines the given secret shares back to [Self] - /// # Errors - /// if the combined data overflows [Self] - fn combine(data: &SecretShare) -> Result - where - Self: Sized; -} - -impl SecretSharable for u32 { - fn xor_split(&self, rng: &mut R) -> SecretShare { - SecretShare::xor(&self.to_be_bytes(), rng) - } - - fn combine(data: &SecretShare) -> Result { - let ss = data.combine(); - - let mut high = ss[0..ss.len() - 4].to_vec(); - high.retain(|x| *x != 0); - - if ss.len() > 4 && !high.is_empty() { - return Err(IoError::from(IoErrorKind::InvalidData)); - } - - let mut bytes = [0u8; 4]; - for (i, v) in ss[ss.len() - 4..].iter().enumerate() { - bytes[i] = *v; - } - - Ok(u32::from_be_bytes(bytes)) - } -} - -impl SecretSharable for u64 { - fn xor_split(&self, rng: &mut R) -> SecretShare { - SecretShare::xor(&self.to_be_bytes(), rng) - } - - fn combine(data: &SecretShare) -> Result { - let ss = data.combine(); - - let mut high = ss[0..ss.len() - 8].to_vec(); - high.retain(|x| *x != 0); - - if ss.len() > 8 && !high.is_empty() { - return Err(IoError::from(IoErrorKind::InvalidData)); - } - - let mut bytes = [0u8; 8]; - for (i, v) in ss[ss.len() - 8..].iter().enumerate() { - bytes[i] = *v; - } - - Ok(u64::from_be_bytes(bytes)) - } -} - -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] /// A timestamp of a source/trigger report represented by epoch and offset. /// /// Internally, the time is stored in `u32`, but the value is capped at `(Epoch::MAX + 1) * SECONDS_IN_EPOCH - 1`. @@ -206,8 +103,7 @@ impl From for u32 { } } -#[derive(Clone, Copy, Debug)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub struct Event { // An identifier, set in the user agent, which identifies an individual person. This must never be released (beyond /// the match key provider) to any party in unencrypted form. For the purpose of this tool, however, the value is in @@ -222,8 +118,7 @@ pub struct Event { pub timestamp: EventTimestamp, } -#[derive(Clone, Copy, Debug)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum GenericReport { /// An event produced on websites/apps when a user interacts with an ad (i.e. impression, click). Source { @@ -242,22 +137,20 @@ pub enum GenericReport { }, } -// TODO(taiki): Implement Serialize/Deserialize - -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] enum QueryType { SourceFanout, TriggerFanout, } -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] enum Node { Helper1, Helper2, Helper3, } -#[cfg_attr(feature = "enable-serde", derive(Serialize))] +#[derive(Serialize)] struct IPAQuery { /// Caller authentication token. auth_token: PlainText, @@ -278,7 +171,7 @@ struct IPAQuery { reports: Vec, } -#[cfg_attr(feature = "enable-serde", derive(Serialize))] +#[derive(Serialize)] struct SourceFanoutQuery { query: IPAQuery, @@ -299,7 +192,7 @@ impl Debug for SourceFanoutQuery { } } -#[cfg_attr(feature = "enable-serde", derive(Serialize))] +#[derive(Serialize)] struct TriggerFanoutQuery { query: IPAQuery, @@ -319,8 +212,7 @@ impl Debug for TriggerFanoutQuery { #[cfg(all(test, unit_test))] mod tests { - use super::EventTimestamp; - use crate::models::Epoch; + use super::{Epoch, EventTimestamp}; #[test] fn event_timestamp_new() { diff --git a/ipa-core/src/cli/ipa_output.rs b/ipa-core/src/cli/ipa_output.rs index 466d324d0..b0a266f8c 100644 --- a/ipa-core/src/cli/ipa_output.rs +++ b/ipa-core/src/cli/ipa_output.rs @@ -1,9 +1,10 @@ use std::time::Duration; +use serde::{Deserialize, Serialize}; + use crate::helpers::query::{IpaQueryConfig, QuerySize}; -#[derive(Debug)] -#[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Serialize, Deserialize)] pub struct QueryResult { pub input_size: QuerySize, pub config: IpaQueryConfig, diff --git a/ipa-core/src/cli/mod.rs b/ipa-core/src/cli/mod.rs index 231202d53..4bfacdf6b 100644 --- a/ipa-core/src/cli/mod.rs +++ b/ipa-core/src/cli/mod.rs @@ -13,7 +13,6 @@ pub mod playbook; #[cfg(feature = "web-app")] mod test_setup; mod verbosity; - #[cfg(feature = "web-app")] pub use clientconf::{setup as client_config_setup, ConfGenArgs}; pub use csv::Serializer as CsvSerializer; diff --git a/ipa-core/src/cli/noise.rs b/ipa-core/src/cli/noise.rs index b4cbb0af0..3b59c4d87 100644 --- a/ipa-core/src/cli/noise.rs +++ b/ipa-core/src/cli/noise.rs @@ -7,6 +7,7 @@ use std::{ use clap::Args; use rand::rngs::StdRng; use rand_core::SeedableRng; +use serde::{Deserialize, Serialize, Serializer}; use crate::protocol::dp::InsecureDiscreteDp; @@ -30,8 +31,7 @@ pub struct ApplyDpArgs { cap: u32, } -#[derive(Debug)] -#[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Serialize, Deserialize)] pub struct NoisyOutput { /// Aggregated breakdowns with noise applied. It is important to use unsigned values here /// to avoid bias/mean skew @@ -45,11 +45,10 @@ pub struct NoisyOutput { #[derive(Debug, Copy, Clone)] pub struct EpsilonBits(f64); -#[cfg(feature = "enable-serde")] -impl serde::Serialize for EpsilonBits { +impl Serialize for EpsilonBits { fn serialize(&self, serializer: S) -> Result where - S: serde::Serializer, + S: Serializer, { serializer.serialize_str(&self.0.to_string()) } diff --git a/ipa-core/src/error.rs b/ipa-core/src/error.rs index 0bd38cda2..b509d42ef 100644 --- a/ipa-core/src/error.rs +++ b/ipa-core/src/error.rs @@ -50,7 +50,6 @@ pub enum Error { #[error("runtime error")] RuntimeError(JoinError), #[error("failed to parse json: {0}")] - #[cfg(feature = "enable-serde")] Serde(#[from] serde_json::Error), #[error("MPC Infrastructure error: {0}")] MpcInfraError(#[from] crate::helpers::Error), diff --git a/ipa-core/src/ff/field.rs b/ipa-core/src/ff/field.rs index a7e9932ff..62f4b3ebf 100644 --- a/ipa-core/src/ff/field.rs +++ b/ipa-core/src/ff/field.rs @@ -3,6 +3,7 @@ use std::{ ops::{Mul, MulAssign}, }; +use serde::{Deserialize, Serialize}; use typenum::{U1, U4}; use crate::{ @@ -37,8 +38,7 @@ pub trait Field: const ONE: Self; } -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] #[cfg_attr(feature = "clap", derive(clap::ValueEnum))] pub enum FieldType { #[cfg(any(test, feature = "weak-field"))] diff --git a/ipa-core/src/helpers/mod.rs b/ipa-core/src/helpers/mod.rs index 1b4e287f8..e39a094cb 100644 --- a/ipa-core/src/helpers/mod.rs +++ b/ipa-core/src/helpers/mod.rs @@ -13,7 +13,6 @@ mod gateway; pub(crate) mod prss_protocol; pub mod stream; mod transport; - use std::ops::{Index, IndexMut}; /// to validate that transport can actually send streams of this type @@ -21,6 +20,7 @@ use std::ops::{Index, IndexMut}; pub use buffers::OrderingSender; pub use error::Error; pub use futures::MaybeFuture; +use serde::{Deserialize, Serialize, Serializer}; #[cfg(feature = "stall-detection")] mod gateway_exports { @@ -81,22 +81,18 @@ pub const MESSAGE_PAYLOAD_SIZE_BYTES: usize = MessagePayloadArrayLen::USIZE; /// represents a helper's role within an MPC protocol, which may be different per protocol. /// `HelperIdentity` will be established at startup and then never change. Components that want to /// resolve this identifier into something (Uri, encryption keys, etc) must consult configuration -#[derive(Copy, Clone, Eq, PartialEq, Hash)] -#[cfg_attr( - feature = "enable-serde", - derive(serde::Deserialize), - serde(try_from = "usize") -)] +#[derive(Copy, Clone, Eq, PartialEq, Hash, Deserialize)] +#[serde(try_from = "usize")] pub struct HelperIdentity { id: u8, } // Serialize as `serde(transparent)` would. Don't see how to enable that // for only one of (de)serialization. -impl serde::Serialize for HelperIdentity { +impl Serialize for HelperIdentity { fn serialize(&self, serializer: S) -> std::result::Result where - S: serde::Serializer, + S: Serializer, { self.id.serialize(serializer) } @@ -219,26 +215,18 @@ impl IndexMut for Vec { /// may be `H2` or `H3`. /// Each helper instance must be able to take any role, but once the role is assigned, it cannot /// be changed for the remainder of the query. -#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] #[cfg_attr(feature = "cli", derive(clap::ValueEnum))] -#[cfg_attr( - feature = "enable-serde", - derive(serde::Serialize, serde::Deserialize), - serde(into = "&'static str", try_from = "&str") -)] +#[serde(into = "&'static str", try_from = "&str")] pub enum Role { H1 = 0, H2 = 1, H3 = 2, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr(test, derive(PartialEq, Eq))] -#[cfg_attr( - feature = "enable-serde", - derive(serde::Serialize, serde::Deserialize), - serde(transparent) -)] +#[serde(transparent)] pub struct RoleAssignment { helper_roles: [HelperIdentity; 3], } diff --git a/ipa-core/src/helpers/transport/query/mod.rs b/ipa-core/src/helpers/transport/query/mod.rs index 5cbaa7aaf..4d0df9df5 100644 --- a/ipa-core/src/helpers/transport/query/mod.rs +++ b/ipa-core/src/helpers/transport/query/mod.rs @@ -1,5 +1,3 @@ -pub mod oprf_shuffle; - use std::{ fmt::{Debug, Display, Formatter}, num::NonZeroU32, @@ -16,15 +14,13 @@ use crate::{ protocol::{step::Step, QueryId}, }; -#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq)] -#[cfg_attr(feature = "enable-serde", derive(Serialize))] +#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Serialize)] pub struct QuerySize(u32); impl QuerySize { pub const MAX: u32 = 1_000_000_000; } -#[cfg(feature = "enable-serde")] impl<'de> Deserialize<'de> for QuerySize { fn deserialize(deserializer: D) -> Result where @@ -84,9 +80,8 @@ impl From for usize { } } -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize)] #[cfg_attr(test, derive(PartialEq, Eq))] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] pub struct QueryConfig { pub size: QuerySize, pub field_type: FieldType, @@ -99,9 +94,8 @@ pub enum QueryConfigError { BadQuerySize(#[from] BadQuerySizeError), } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr(test, derive(PartialEq, Eq))] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] pub struct PrepareQuery { pub query_id: QueryId, pub config: QueryConfig, @@ -123,15 +117,9 @@ impl RouteParams for &QueryConfig { NoStep } - #[cfg(feature = "enable-serde")] fn extra(&self) -> Self::Params { serde_json::to_string(self).unwrap() } - - #[cfg(not(feature = "enable-serde"))] - fn extra(&self) -> Self::Params { - unimplemented!() - } } impl From<&QueryConfig> for GatewayConfig { @@ -177,15 +165,9 @@ impl RouteParams for &PrepareQuery { NoStep } - #[cfg(feature = "enable-serde")] fn extra(&self) -> Self::Params { serde_json::to_string(self).unwrap() } - - #[cfg(not(feature = "enable-serde"))] - fn extra(&self) -> Self::Params { - unimplemented!() - } } pub struct QueryInput { @@ -199,8 +181,7 @@ impl Debug for QueryInput { } } -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] pub enum QueryType { #[cfg(any(test, feature = "test-fixture", feature = "cli"))] TestMultiply, @@ -225,8 +206,7 @@ impl AsRef for QueryType { impl Step for QueryType {} -#[derive(Debug, Copy, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] #[cfg_attr(feature = "clap", derive(clap::Args))] pub struct IpaQueryConfig { #[cfg_attr(feature = "clap", arg(long, default_value = "8"))] @@ -330,19 +310,3 @@ impl std::fmt::Display for ContributionBits { write!(f, "{}", self.0) } } - -#[derive(Debug, Copy, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] -pub struct SparseAggregateQueryConfig { - pub contribution_bits: ContributionBits, - pub num_contributions: u32, -} - -impl Default for SparseAggregateQueryConfig { - fn default() -> Self { - Self { - contribution_bits: ContributionBits::default(), - num_contributions: 8, - } - } -} diff --git a/ipa-core/src/helpers/transport/query/oprf_shuffle.rs b/ipa-core/src/helpers/transport/query/oprf_shuffle.rs deleted file mode 100644 index c39242902..000000000 --- a/ipa-core/src/helpers/transport/query/oprf_shuffle.rs +++ /dev/null @@ -1,5 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] -pub struct QueryConfig {} diff --git a/ipa-core/src/lib.rs b/ipa-core/src/lib.rs index e9db2d679..784313c85 100644 --- a/ipa-core/src/lib.rs +++ b/ipa-core/src/lib.rs @@ -9,7 +9,7 @@ #[cfg(any(feature = "cli", feature = "web-app"))] pub mod cli; -#[cfg(all(feature = "enable-serde", feature = "web-app"))] +#[cfg(feature = "web-app")] pub mod config; pub mod error; pub mod ff; @@ -29,7 +29,6 @@ pub mod test_fixture; mod app; mod seq_join; -#[cfg(feature = "enable-serde")] mod serde; mod sharding; diff --git a/ipa-core/src/net/http_serde.rs b/ipa-core/src/net/http_serde.rs index 72ad9ceb2..0606687d2 100644 --- a/ipa-core/src/net/http_serde.rs +++ b/ipa-core/src/net/http_serde.rs @@ -9,11 +9,11 @@ pub mod echo { use async_trait::async_trait; use axum::extract::{FromRequest, Query, RequestParts}; use hyper::http::uri; + use serde::{Deserialize, Serialize}; use crate::net::Error; - #[derive(Debug, Default, Clone, PartialEq, Eq)] - #[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct Request { pub query_params: HashMap, pub headers: HashMap, @@ -54,7 +54,6 @@ pub mod echo { } } - #[cfg(feature = "enable-serde")] #[async_trait] impl FromRequest for Request { type Rejection = Error; @@ -84,6 +83,7 @@ pub mod query { use async_trait::async_trait; use axum::extract::{FromRequest, Query, RequestParts}; + use serde::Deserialize; use crate::{ ff::FieldType, @@ -108,7 +108,7 @@ pub mod query { type Rejection = Error; async fn from_request(req: &mut RequestParts) -> Result { - #[derive(serde::Deserialize)] + #[derive(Deserialize)] struct QueryTypeParam { size: QuerySize, field_type: FieldType, @@ -173,9 +173,11 @@ pub mod query { pub const BASE_AXUM_PATH: &str = "/query"; pub mod create { + use async_trait::async_trait; use axum::extract::{FromRequest, RequestParts}; use hyper::http::uri; + use serde::{Deserialize, Serialize}; use crate::{ helpers::query::QueryConfig, @@ -224,7 +226,7 @@ pub mod query { } } - #[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Serialize, Deserialize)] pub struct ResponseBody { pub query_id: QueryId, } @@ -240,6 +242,7 @@ pub mod query { Json, }; use hyper::header::CONTENT_TYPE; + use serde::{Deserialize, Serialize}; use crate::{ helpers::{query::PrepareQuery, RoleAssignment}, @@ -303,7 +306,7 @@ pub mod query { } } - #[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Serialize, Deserialize)] struct RequestBody { roles: RoleAssignment, } diff --git a/ipa-core/src/protocol/mod.rs b/ipa-core/src/protocol/mod.rs index 3d973ae8f..ea6f5f5d7 100644 --- a/ipa-core/src/protocol/mod.rs +++ b/ipa-core/src/protocol/mod.rs @@ -14,6 +14,7 @@ use std::{ }; pub use basics::BasicProtocols; +use serde::{Deserialize, Serialize}; use crate::{ error::Error, @@ -30,12 +31,8 @@ pub type Timestamp = Gf20Bit; /// them collaborating on constructing this unique id. These details haven't been flushed out yet, /// so for now it is just an empty struct. Once we know more about it, we will make necessary /// amendments to it -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] -#[cfg_attr( - feature = "serde", - derive(serde::Serialize, serde::Deserialize), - serde(into = "&'static str", try_from = "&str") -)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[serde(into = "&'static str", try_from = "&str")] pub struct QueryId; impl Display for QueryId { @@ -78,8 +75,7 @@ impl TryFrom<&str> for QueryId { /// Unique identifier of the record inside the query. Support up to `$2^32$` max records because /// of the assumption that the maximum input is 1B records per query. -#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] -#[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct RecordId(u32); impl Display for RecordId { diff --git a/ipa-core/src/protocol/step/compact.rs b/ipa-core/src/protocol/step/compact.rs index 985954b55..d04b41e84 100644 --- a/ipa-core/src/protocol/step/compact.rs +++ b/ipa-core/src/protocol/step/compact.rs @@ -1,16 +1,13 @@ use std::fmt::{Debug, Display, Formatter}; use ipa_macros::Gate; +use serde::Deserialize; use super::StepNarrow; use crate::helpers::{prss_protocol::PrssExchangeStep, query::QueryType}; -#[derive(Gate, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Default)] -#[cfg_attr( - feature = "enable-serde", - derive(serde::Deserialize), - serde(from = "&str") -)] +#[derive(Gate, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Default, Deserialize)] +#[serde(from = "&str")] pub struct Compact(pub u16); // serde::Deserialize requires From<&str> implementation diff --git a/ipa-core/src/protocol/step/descriptive.rs b/ipa-core/src/protocol/step/descriptive.rs index dc13e40a1..b887913c6 100644 --- a/ipa-core/src/protocol/step/descriptive.rs +++ b/ipa-core/src/protocol/step/descriptive.rs @@ -1,5 +1,7 @@ use std::fmt::{Debug, Display, Formatter}; +use serde::Deserialize; + use super::{Step, StepNarrow}; #[cfg(feature = "step-trace")] use crate::telemetry::{labels::STEP, metrics::STEP_NARROWED}; @@ -22,12 +24,8 @@ use crate::telemetry::{labels::STEP, metrics::STEP_NARROWED}; /// Step "a" would be executed with a context identifier of "protocol/a", which it /// would `narrow()` into "protocol/a/x" and "protocol/a/y" to produce a final set /// of identifiers: ".../a/x", ".../a/y", ".../b", and ".../c". -#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr( - feature = "enable-serde", - derive(serde::Deserialize), - serde(from = "&str") -)] +#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Deserialize)] +#[serde(from = "&str")] pub struct Descriptive { id: String, } From 75cf812e0f5088a5ff91f5401616cab19653eed7 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Tue, 19 Mar 2024 11:43:45 -0700 Subject: [PATCH 107/135] Vectorized Fp25519 share conversion --- ipa-core/src/ff/curve_points.rs | 12 + ipa-core/src/ff/ec_prime_field.rs | 72 +++- ipa-core/src/protocol/basics/mod.rs | 2 +- ipa-core/src/protocol/basics/reveal.rs | 18 +- ipa-core/src/protocol/context/prss.rs | 34 +- ipa-core/src/protocol/context/validator.rs | 14 +- .../boolean_ops/addition_sequential.rs | 95 +++-- .../comparison_and_subtraction_sequential.rs | 18 +- .../boolean_ops/share_conversion_aby.rs | 368 ++++++++++++++---- ipa-core/src/protocol/ipa_prf/mod.rs | 106 +++-- ipa-core/src/protocol/ipa_prf/prf_eval.rs | 66 +++- ipa-core/src/protocol/prss/crypto.rs | 90 ++++- ipa-core/src/protocol/prss/mod.rs | 47 ++- ipa-core/src/secret_sharing/decomposed.rs | 31 +- ipa-core/src/secret_sharing/mod.rs | 4 +- .../replicated/semi_honest/additive_share.rs | 25 ++ ipa-core/src/secret_sharing/vector/array.rs | 40 +- ipa-core/src/secret_sharing/vector/impls.rs | 43 +- ipa-core/src/secret_sharing/vector/mod.rs | 1 + ipa-core/src/secret_sharing/vector/traits.rs | 3 +- .../src/secret_sharing/vector/transpose.rs | 170 ++++++++ 21 files changed, 1032 insertions(+), 227 deletions(-) diff --git a/ipa-core/src/ff/curve_points.rs b/ipa-core/src/ff/curve_points.rs index c5789e420..451994360 100644 --- a/ipa-core/src/ff/curve_points.rs +++ b/ipa-core/src/ff/curve_points.rs @@ -42,6 +42,18 @@ impl Vectorizable<1> for RP25519 { type Array = StdArray; } +impl Vectorizable<16> for RP25519 { + type Array = StdArray; +} + +impl Vectorizable<64> for RP25519 { + type Array = StdArray; +} + +impl Vectorizable<256> for RP25519 { + type Array = StdArray; +} + #[derive(thiserror::Error, Debug)] #[error("{0:?} is not the canonical encoding of a Ristretto point.")] pub struct NonCanonicalEncoding(CompressedRistretto); diff --git a/ipa-core/src/ff/ec_prime_field.rs b/ipa-core/src/ff/ec_prime_field.rs index dad5ca0f4..9f85b949a 100644 --- a/ipa-core/src/ff/ec_prime_field.rs +++ b/ipa-core/src/ff/ec_prime_field.rs @@ -5,10 +5,13 @@ use generic_array::GenericArray; use typenum::{U2, U32}; use crate::{ - ff::{boolean_array::BA256, Field, Serializable}, + ff::{boolean_array::BA256, Expand, Field, Serializable}, impl_shared_value_common, - protocol::prss::FromRandom, - secret_sharing::{Block, FieldVectorizable, SharedValue, StdArray, Vectorizable}, + protocol::prss::{FromPrss, FromRandom, PrssIndex, SharedRandomness}, + secret_sharing::{ + replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, + Block, FieldVectorizable, SharedValue, StdArray, Vectorizable, + }, }; impl Block for Scalar { @@ -125,6 +128,20 @@ impl std::ops::MulAssign for Fp25519 { } } +impl Expand for AdditiveShare +where + Fp25519: Vectorizable, +{ + type Input = AdditiveShare; + + fn expand(v: &Self::Input) -> Self { + AdditiveShare::new_arr( + >::Array::expand(&v.left()), + >::Array::expand(&v.right()), + ) + } +} + impl From for Fp25519 { fn from(s: Scalar) -> Self { Fp25519(s) @@ -185,6 +202,30 @@ impl FieldVectorizable<1> for Fp25519 { type ArrayAlias = StdArray; } +impl Vectorizable<16> for Fp25519 { + type Array = StdArray; +} + +impl FieldVectorizable<16> for Fp25519 { + type ArrayAlias = StdArray; +} + +impl Vectorizable<64> for Fp25519 { + type Array = StdArray; +} + +impl FieldVectorizable<64> for Fp25519 { + type ArrayAlias = StdArray; +} + +impl Vectorizable<256> for Fp25519 { + type Array = StdArray; +} + +impl FieldVectorizable<256> for Fp25519 { + type ArrayAlias = StdArray; +} + impl Field for Fp25519 { const NAME: &'static str = "Fp25519"; @@ -203,6 +244,31 @@ impl FromRandom for Fp25519 { } } +macro_rules! impl_share_from_random { + ($width:expr) => { + impl FromPrss for AdditiveShare { + fn from_prss_with>( + prss: &P, + index: I, + _params: (), + ) -> AdditiveShare { + let (l_arr, r_arr) = StdArray::from_tuple_iter( + prss.generate_chunks_iter::<_, U2>(index) + .map(|(l_rand, r_rand)| { + (Fp25519::from_random(l_rand), Fp25519::from_random(r_rand)) + }) + .take($width), + ); + AdditiveShare::new_arr(l_arr, r_arr) + } + } + }; +} + +impl_share_from_random!(16); +impl_share_from_random!(64); +impl_share_from_random!(256); + #[cfg(all(test, unit_test))] mod test { use curve25519_dalek::scalar::Scalar; diff --git a/ipa-core/src/protocol/basics/mod.rs b/ipa-core/src/protocol/basics/mod.rs index 7314af874..f7536d606 100644 --- a/ipa-core/src/protocol/basics/mod.rs +++ b/ipa-core/src/protocol/basics/mod.rs @@ -13,7 +13,7 @@ pub use check_zero::check_zero; pub use if_else::{if_else, select}; pub use mul::{BooleanArrayMul, MultiplyZeroPositions, SecureMul, ZeroPositions}; pub use reshare::Reshare; -pub use reveal::{reveal, Reveal}; +pub use reveal::{partial_reveal, reveal, Reveal}; pub use share_known_value::ShareKnownValue; pub use sum_of_product::SumOfProducts; diff --git a/ipa-core/src/protocol/basics/reveal.rs b/ipa-core/src/protocol/basics/reveal.rs index 4b9c21da5..42849ff6a 100644 --- a/ipa-core/src/protocol/basics/reveal.rs +++ b/ipa-core/src/protocol/basics/reveal.rs @@ -176,8 +176,9 @@ impl<'a, F: ExtendableField> Reveal, 1> for Mali } } -// Workaround for https://github.com/rust-lang/rust/issues/100013. Calling this wrapper function -// instead of `Reveal::reveal` seems to hide the `impl Future` GAT. +// Workaround for https://github.com/rust-lang/rust/issues/100013. Calling these wrapper functions +// instead of the trait methods seems to hide the `impl Future` GAT. + pub fn reveal<'fut, C, S>( ctx: C, record_id: RecordId, @@ -190,6 +191,19 @@ where S::reveal(v, ctx, record_id) } +pub fn partial_reveal<'fut, C, S, const N: usize>( + ctx: C, + record_id: RecordId, + excluded: Role, + v: &'fut S, +) -> impl Future, Error>> + Send + 'fut +where + C: Context + 'fut, + S: Reveal, +{ + S::partial_reveal(v, ctx, record_id, excluded) +} + #[cfg(all(test, unit_test))] mod tests { use std::iter::zip; diff --git a/ipa-core/src/protocol/context/prss.rs b/ipa-core/src/protocol/context/prss.rs index 5ff5d3cd2..cc1f7756c 100644 --- a/ipa-core/src/protocol/context/prss.rs +++ b/ipa-core/src/protocol/context/prss.rs @@ -1,6 +1,6 @@ //! Metric-aware PRSS decorators -use generic_array::{ArrayLength, GenericArray}; +use generic_array::ArrayLength; use rand_core::{Error, RngCore}; use crate::{ @@ -35,16 +35,38 @@ impl<'a> InstrumentedIndexedSharedRandomness<'a> { } impl SharedRandomness for InstrumentedIndexedSharedRandomness<'_> { - fn generate_arrays, N: ArrayLength>( + type ChunksIter<'a, Z: ArrayLength> = InstrumentedChunksIter< + 'a, + ::ChunksIter<'a, Z>, + > + where Self: 'a; + + fn generate_chunks_iter, Z: ArrayLength>( &self, index: I, - ) -> (GenericArray, GenericArray) { - let step = self.step.as_ref().to_string(); + ) -> Self::ChunksIter<'_, Z> { + InstrumentedChunksIter { + instrumented: self, + inner: self.inner.generate_chunks_iter(index), + } + } +} + +pub struct InstrumentedChunksIter<'a, I: Iterator> { + instrumented: &'a InstrumentedIndexedSharedRandomness<'a>, + inner: I, +} + +impl<'a, I: Iterator> Iterator for InstrumentedChunksIter<'a, I> { + type Item = ::Item; + + fn next(&mut self) -> Option { + let step = self.instrumented.step.as_ref().to_string(); // TODO: what we really want here is a gauge indicating the maximum index used to generate // PRSS. Gauge infrastructure is not supported yet, `Metrics` struct needs to be able to // handle gauges - metrics::increment_counter!(INDEXED_PRSS_GENERATED, STEP => step, ROLE => self.role.as_static_str()); - self.inner.generate_arrays(index) + metrics::increment_counter!(INDEXED_PRSS_GENERATED, STEP => step, ROLE => self.instrumented.role.as_static_str()); + self.inner.next() } } diff --git a/ipa-core/src/protocol/context/validator.rs b/ipa-core/src/protocol/context/validator.rs index ca67c1b16..2a3ab6a73 100644 --- a/ipa-core/src/protocol/context/validator.rs +++ b/ipa-core/src/protocol/context/validator.rs @@ -14,10 +14,15 @@ use crate::{ prss::SharedRandomness, RecordId, }, - secret_sharing::replicated::{ - malicious::{AdditiveShare as MaliciousReplicated, DowngradeMalicious, ExtendableField}, - semi_honest::AdditiveShare as Replicated, - ReplicatedSecretSharing, + secret_sharing::{ + replicated::{ + malicious::{ + AdditiveShare as MaliciousReplicated, DowngradeMalicious, ExtendableField, + }, + semi_honest::AdditiveShare as Replicated, + ReplicatedSecretSharing, + }, + SharedValue, }, sharding::ShardBinding, sync::{Mutex, Weak}, @@ -28,7 +33,6 @@ use crate::{ protocol::basics::Reveal, protocol::context::Context, protocol::context::{MaliciousContext, UpgradedMaliciousContext}, - secret_sharing::SharedValue, sync::Arc, }; diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs index dc27e6ef7..b4dc09bce 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs @@ -1,13 +1,18 @@ +use std::{borrow::Borrow, iter::repeat, ops::Not}; + #[cfg(all(test, unit_test))] use ipa_macros::Step; -#[cfg(all(test, unit_test))] -use crate::secret_sharing::{FieldSimd, FieldVectorizable}; use crate::{ error::Error, - ff::{ArrayAccess, CustomArray, Field}, + ff::{ArrayAccessRef, ArrayBuild, ArrayBuilder, Field}, protocol::{basics::SecureMul, context::Context, step::BitOpStep, RecordId}, - secret_sharing::{replicated::semi_honest::AdditiveShare, SharedValue}, + secret_sharing::{replicated::semi_honest::AdditiveShare, FieldSimd}, +}; +#[cfg(all(test, unit_test))] +use crate::{ + ff::CustomArray, + secret_sharing::{FieldVectorizable, SharedValue}, }; #[cfg(all(test, unit_test))] @@ -25,19 +30,20 @@ pub(crate) enum Step { /// /// # Errors /// propagates errors from multiply -pub async fn integer_add( +pub async fn integer_add( ctx: C, record_id: RecordId, - x: &AdditiveShare, - y: &AdditiveShare, -) -> Result<(AdditiveShare, AdditiveShare), Error> + x: &XS, + y: &YS, +) -> Result<(XS, AdditiveShare), Error> where C: Context, - YS: SharedValue + CustomArray, - XS: SharedValue + CustomArray, - XS::Element: Field, + F: Field + FieldSimd, + XS: ArrayAccessRef> + ArrayBuild>, + YS: ArrayAccessRef>, + AdditiveShare: SecureMul + Not>, { - let mut carry = AdditiveShare::::ZERO; + let mut carry = AdditiveShare::::ZERO; let sum = addition_circuit(ctx, record_id, x, y, &mut carry).await?; Ok((sum, carry)) } @@ -59,6 +65,7 @@ where C: Context, S: SharedValue + CustomArray, AdditiveShare: From> + Into>, + AdditiveShare: Not>, { use crate::{ff::Expand, protocol::basics::if_else}; let mut carry = AdditiveShare::::ZERO; @@ -95,35 +102,41 @@ where /// propagates errors from multiply /// /// -async fn addition_circuit( +async fn addition_circuit( ctx: C, record_id: RecordId, - x: &AdditiveShare, - y: &AdditiveShare, - carry: &mut AdditiveShare, -) -> Result, Error> + x: &XS, + y: &YS, + carry: &mut AdditiveShare, +) -> Result where C: Context, - XS: SharedValue + CustomArray, - YS: SharedValue + CustomArray, - XS::Element: Field, + F: Field + FieldSimd, + XS: ArrayAccessRef> + ArrayBuild>, + YS: ArrayAccessRef>, + AdditiveShare: SecureMul + Not>, { - let mut result = AdditiveShare::::ZERO; - for (i, v) in x.iter().enumerate() { - result.set( - i, + let x = x.iter(); + let y = y.iter(); + + let mut result = XS::builder().with_capacity(x.len()); + for (i, (xb, yb)) in x + .zip(y.chain(repeat(YS::make_ref(&AdditiveShare::::ZERO)))) + .enumerate() + { + result.push( bit_adder( ctx.narrow(&BitOpStep::from(i)), record_id, - &v, - y.get(i).as_ref(), + xb.borrow(), + yb.borrow(), carry, ) .await?, ); } - Ok(result) + Ok(result.build()) } /// @@ -145,26 +158,23 @@ where /// /// # Errors /// propagates errors from multiply -async fn bit_adder( +async fn bit_adder( ctx: C, record_id: RecordId, - x: &AdditiveShare, - y: Option<&AdditiveShare>, - carry: &mut AdditiveShare, -) -> Result, Error> + x: &AdditiveShare, + y: &AdditiveShare, + carry: &mut AdditiveShare, +) -> Result, Error> where C: Context, - S: Field, + F: Field + FieldSimd, + AdditiveShare: SecureMul + Not>, { - let output = x + y.unwrap_or(&AdditiveShare::::ZERO) + &*carry; + let output = x + y + &*carry; *carry = &*carry + (x + &*carry) - .multiply( - &(y.unwrap_or(&AdditiveShare::::ZERO) + &*carry), - ctx, - record_id, - ) + .multiply(&(y + &*carry), ctx, record_id) .await?; Ok(output) @@ -185,6 +195,7 @@ mod test { ipa_prf::boolean_ops::addition_sequential::{integer_add, integer_sat_add}, }, rand::thread_rng, + secret_sharing::replicated::semi_honest::AdditiveShare, test_executor::run, test_fixture::{Reconstruct, Runner, TestWorld}, }; @@ -207,7 +218,7 @@ mod test { let (result, carry) = world .semi_honest((x_ba64, y_ba64), |ctx, x_y| async move { - integer_add::<_, BA64, BA64>( + integer_add::<_, _, AdditiveShare, AdditiveShare, 1>( ctx.set_total_records(1), protocol::RecordId(0), &x_y.0, @@ -275,7 +286,7 @@ mod test { let (result, carry) = world .semi_honest((x_ba64, y_ba32), |ctx, x_y| async move { - integer_add::<_, BA64, BA32>( + integer_add::<_, _, AdditiveShare, AdditiveShare, 1>( ctx.set_total_records(1), protocol::RecordId(0), &x_y.0, @@ -296,7 +307,7 @@ mod test { let expected_carry = (x + y) >> 32 & 1; let (result, carry) = world .semi_honest((y_ba32, x_ba64), |ctx, x_y| async move { - integer_add::<_, BA32, BA64>( + integer_add::<_, _, AdditiveShare, AdditiveShare, 1>( ctx.set_total_records(1), protocol::RecordId(0), &x_y.0, diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs index 21b86aed5..cee540964 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs @@ -238,7 +238,6 @@ mod test { use std::{ array, iter::{repeat, repeat_with, zip}, - time::Instant, }; use futures::stream::iter as stream_iter; @@ -419,9 +418,10 @@ mod test { let result = world .semi_honest((x.clone().into_iter(), y), |ctx, (x, y)| async move { - let begin = Instant::now(); + #[cfg(not(debug_assertions))] + let begin = std::time::Instant::now(); let ctx = ctx.set_total_records(x.len()); - let res = seq_join( + let res: Vec> = seq_join( ctx.active_work(), stream_iter(x.into_iter().zip(repeat((ctx, y))).enumerate().map( |(i, (x, (ctx, y)))| async move { @@ -429,9 +429,10 @@ mod test { }, )), ) - .try_collect::>>() + .try_collect() .await .unwrap(); + #[cfg(not(debug_assertions))] tracing::info!("Execution time: {:?}", begin.elapsed()); res }) @@ -494,10 +495,10 @@ mod test { let xa_iter = xa.clone().into_iter(); let result = world .semi_honest((xa_iter, ya.clone()), |ctx, (x, y)| async move { - println!("Processing {} records", x.len()); - let begin = Instant::now(); + #[cfg(not(debug_assertions))] + let begin = std::time::Instant::now(); let ctx = ctx.set_total_records(x.len()); - let res = seq_join( + let res: Vec> = seq_join( ctx.active_work(), stream_iter(x.into_iter().zip(repeat((ctx, y))).enumerate().map( |(i, (x, (ctx, y)))| async move { @@ -505,9 +506,10 @@ mod test { }, )), ) - .try_collect::>>() + .try_collect() .await .unwrap(); + #[cfg(not(debug_assertions))] tracing::info!("Execution time: {:?}", begin.elapsed()); res }) diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs index 8f8ae7ee2..e31698870 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs @@ -1,21 +1,28 @@ -use std::ops::Neg; +use std::{ + borrow::Borrow, + convert::Infallible, + ops::{Neg, Not}, +}; use ipa_macros::Step; use crate::{ - error::Error, + error::{Error, UnwrapInfallible}, ff::{ - boolean::Boolean, boolean_array::BA256, ec_prime_field::Fp25519, ArrayAccess, CustomArray, - Expand, + boolean::Boolean, boolean_array::BA256, ec_prime_field::Fp25519, ArrayAccess, + ArrayAccessRef, ArrayBuild, ArrayBuilder, CustomArray, Expand, }, helpers::Role, protocol::{ - basics::Reveal, context::Context, ipa_prf::boolean_ops::addition_sequential::integer_add, - prss::SharedRandomness, RecordId, + basics::{partial_reveal, Reveal, SecureMul}, + context::Context, + ipa_prf::boolean_ops::addition_sequential::integer_add, + prss::{FromPrss, SharedRandomness}, + RecordId, }, secret_sharing::{ replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, - SharedValue, + FieldSimd, FieldVectorizable, SharedValue, SharedValueArray, TransposeFrom, Vectorizable, }, }; @@ -24,7 +31,8 @@ pub(crate) enum Step { GenerateSecretSharing, IntegerAddBetweenMasks, IntegerAddMaskToX, - RevealY, + #[dynamic(256)] + RevealY(usize), } /// share conversion @@ -90,56 +98,50 @@ pub(crate) enum Step { /// However, these terms are only non-zero when all `rs_{k}` terms are non-zero /// this happens with probability `1/(2^(256-m))` which is negligible for a sufficiently small `m` /// +/// The implementation uses two type parameters to support vectorization. The type `XS` holds match +/// keys. In the unvectorized case, `XS` is `AdditiveShare`. In the vectorized case, `XS` is +/// `BitDecomposed>`. The type `YS` holds bitwise Fp25519 intermediates. In the +/// unvectorized case, `YS` is `AdditiveShare`. In the vectorized case, `YS` is +/// `BitDecomposed>`. +/// /// # Errors /// Propagates Errors from Integer Subtraction and Partial Reveal -pub async fn convert_to_fp25519( +pub async fn convert_to_fp25519( ctx: C, record_id: RecordId, - x: &AdditiveShare, -) -> Result, Error> + x: XS, +) -> Result, Error> where C: Context, - B: SharedValue + CustomArray, + Fp25519: Vectorizable, + Boolean: FieldSimd, + XS: ArrayAccessRef>, + YS: ArrayAccessRef> + + ArrayBuild> + + FromPrss, + AdditiveShare: SecureMul + + Reveal>::ArrayAlias> + + Not>, + Vec>: for<'a> TransposeFrom<&'a YS>, + Vec: + for<'a> TransposeFrom<&'a [>::Array; 256], Error = Infallible>, { + // `BITS` is the number of bits in the memory representation of Fp25519 field elements. It does + // not vary with vectorization. Where the type `BA256` appears literally in the source of this + // function, it is referring to this constant. (It is also possible for `BA256` to be used to + // hold width-256 vectorizations, but when it serves that purpose, it does not appear literally + // in the source of this function -- it is behind the XS and YS parameters.) + const BITS: usize = 256; + // generate sh_r = (0, 0, sh_r) and sh_s = (sh_s, 0, 0) // the two highest bits are set to 0 to allow carries for two additions - let (sh_r, sh_s) = { - // this closure generates sh_r, sh_r from PRSS randomness r - - // we generate random values r = (r1,r2,r3) using PRSS - // r: H1: (r1,r2), H2: (r2,r3), H3: (r3, r1) - let mut r: AdditiveShare = ctx - .narrow(&Step::GenerateSecretSharing) - .prss() - .generate(record_id); - - // set 2 highest order bits of r1, r2, r3 to 0 - r.set(255, AdditiveShare::::ZERO); - r.set(254, AdditiveShare::::ZERO); - - // generate sh_r, sh_s - // sh_r: H1: (0,0), H2: (0,r3), H3: (r3, 0) - // sh_s: H1: (r1,0), H2: (0,0), H3: (0, r1) - match ctx.role() { - Role::H1 => ( - AdditiveShare::new(::ZERO, ::ZERO), - AdditiveShare::new(r.left(), ::ZERO), - ), - Role::H2 => ( - AdditiveShare::new(::ZERO, r.right()), - AdditiveShare::new(::ZERO, ::ZERO), - ), - Role::H3 => ( - AdditiveShare::new(r.left(), ::ZERO), - AdditiveShare::new(::ZERO, r.right()), - ), - } - }; + let (sh_r, sh_s) = + gen_sh_r_and_sh_s::<_, _, BITS, N>(&ctx.narrow(&Step::GenerateSecretSharing), record_id); // addition r+s might cause carry, // this is no problem since we have set bit 254 of sh_r and sh_s to 0 let sh_rs = { - let (mut rs_with_higherorderbits, _) = integer_add::<_, BA256, BA256>( + let (mut rs_with_higherorderbits, _) = integer_add::<_, _, YS, YS, N>( ctx.narrow(&Step::IntegerAddBetweenMasks), record_id, &sh_r, @@ -149,7 +151,7 @@ where // PRSS/Multiply masks added random highest order bit, // remove them to not cause overflow in second addition (which is mod 256): - rs_with_higherorderbits.set(255, AdditiveShare::::ZERO); + rs_with_higherorderbits.set(BITS - 1, YS::make_ref(&AdditiveShare::::ZERO)); // return rs rs_with_higherorderbits @@ -158,30 +160,127 @@ where // addition x+rs, where rs=r+s might cause carry // this is not a problem since bit 255 of rs is set to 0 let (sh_y, _) = - integer_add::<_, BA256, B>(ctx.narrow(&Step::IntegerAddMaskToX), record_id, &sh_rs, x) + integer_add::<_, _, YS, XS, N>(ctx.narrow(&Step::IntegerAddMaskToX), record_id, &sh_rs, &x) .await?; // this leaks information, but with negligible probability - let y = AdditiveShare::::new(sh_y.left(), sh_y.right()) - .partial_reveal(ctx.narrow(&Step::RevealY), record_id, Role::H3) + let mut y = (ctx.role() != Role::H3).then(|| Vec::with_capacity(N)); + for i in 0..BITS { + let y_bit = partial_reveal( + ctx.narrow(&Step::RevealY(i)), + record_id, + Role::H3, + sh_y.get(i).unwrap().borrow(), + ) .await?; + match (&mut y, y_bit) { + (Some(y), Some(y_bit)) => y.push(y_bit), + (None, None) => (), + _ => unreachable!("inconsistent partial_reveal behavior"), + } + } + + let y = y.map(|y| { + Vec::::transposed_from(y.as_slice().try_into().unwrap()).unwrap_infallible() + }); + + let sh_r = Vec::>::transposed_from(&sh_r) + .ok() + .expect("sh_r was constructed with the correct number of bits"); + let sh_s = Vec::>::transposed_from(&sh_s) + .ok() + .expect("sh_s was constructed with the correct number of bits"); match ctx.role() { - Role::H1 => Ok(AdditiveShare::::new( - Fp25519::from(sh_s.left()).neg(), - Fp25519::from(BA256::from_array(&y.unwrap())), + Role::H1 => Ok(AdditiveShare::::new_arr( + >::Array::from_fn(|i| { + Fp25519::from(sh_s.get(i).unwrap().left()).neg() + }), + y.unwrap().into_iter().map(Fp25519::from).collect(), )), - Role::H2 => Ok(AdditiveShare::::new( - Fp25519::from(BA256::from_array(&y.unwrap())), - Fp25519::from(sh_r.right()).neg(), + Role::H2 => Ok(AdditiveShare::::new_arr( + y.unwrap().into_iter().map(Fp25519::from).collect(), + >::Array::from_fn(|i| { + Fp25519::from(sh_r.get(i).unwrap().right()).neg() + }), )), - Role::H3 => Ok(AdditiveShare::::new( - Fp25519::from(sh_r.left()).neg(), - Fp25519::from(sh_s.right()).neg(), + Role::H3 => Ok(AdditiveShare::::new_arr( + >::Array::from_fn(|i| { + Fp25519::from(sh_r.get(i).unwrap().left()).neg() + }), + >::Array::from_fn(|i| { + Fp25519::from(sh_s.get(i).unwrap().right()).neg() + }), )), } } +/// Generates `sh_r` and `sh_s` from PRSS randomness (`r`). +fn gen_sh_r_and_sh_s( + ctx: &C, + record_id: RecordId, +) -> (YS, YS) +where + C: Context, + Boolean: FieldSimd, + YS: ArrayAccessRef> + + ArrayBuild> + + FromPrss, +{ + // we generate random values r = (r1,r2,r3) using PRSS + // r: H1: (r1,r2), H2: (r2,r3), H3: (r3, r1) + let mut r: YS = ctx.prss().generate_with(record_id, BITS); + + // set 2 highest order bits of r1, r2, r3 to 0 + r.set(BITS - 1, YS::make_ref(&AdditiveShare::::ZERO)); + r.set(BITS - 2, YS::make_ref(&AdditiveShare::::ZERO)); + + let mut sh_r_builder = YS::builder().with_capacity(BITS); + let mut sh_s_builder = YS::builder().with_capacity(BITS); + // generate sh_r, sh_s + // sh_r: H1: (0,0), H2: (0,r3), H3: (r3, 0) + // sh_s: H1: (r1,0), H2: (0,0), H3: (0, r1) + match ctx.role() { + Role::H1 => { + for i in 0..BITS { + sh_r_builder.push(AdditiveShare::new_arr( + >::Array::ZERO_ARRAY, + >::Array::ZERO_ARRAY, + )); + sh_s_builder.push(AdditiveShare::new_arr( + r.get(i).unwrap().borrow().left_arr().clone(), + >::Array::ZERO_ARRAY, + )); + } + } + Role::H2 => { + for i in 0..BITS { + sh_r_builder.push(AdditiveShare::new_arr( + >::Array::ZERO_ARRAY, + r.get(i).unwrap().borrow().right_arr().clone(), + )); + sh_s_builder.push(AdditiveShare::new_arr( + >::Array::ZERO_ARRAY, + >::Array::ZERO_ARRAY, + )); + } + } + Role::H3 => { + for i in 0..BITS { + sh_r_builder.push(AdditiveShare::new_arr( + r.get(i).unwrap().borrow().left_arr().clone(), + >::Array::ZERO_ARRAY, + )); + sh_s_builder.push(AdditiveShare::new_arr( + >::Array::ZERO_ARRAY, + r.get(i).unwrap().borrow().right_arr().clone(), + )); + } + } + } + (sh_r_builder.build(), sh_s_builder.build()) +} + /// inserts smaller array in the larger array starting from location offset pub fn expand_shared_array_in_place( y: &mut AdditiveShare, @@ -192,9 +291,10 @@ pub fn expand_shared_array_in_place( XS: SharedValue + ArrayAccess + Expand, { for i in 0..XS::BITS as usize { - y.set( + ArrayAccess::set( + y, i + offset, - x.get(i).unwrap_or(AdditiveShare::::ZERO), + ArrayAccess::get(x, i).unwrap_or(AdditiveShare::::ZERO), ); } } @@ -207,9 +307,10 @@ where { let mut x = AdditiveShare::::ZERO; for i in 0..XS::BITS as usize { - x.set( + ArrayAccess::set( + &mut x, i, - y.get(i + offset).unwrap_or(AdditiveShare::::ZERO), + ArrayAccess::get(y, i + offset).unwrap_or(AdditiveShare::::ZERO), ); } x @@ -238,11 +339,15 @@ where #[cfg(all(test, unit_test))] mod tests { + use std::iter::repeat_with; + use curve25519_dalek::Scalar; + use futures::stream::TryStreamExt; use generic_array::GenericArray; use rand::Rng; use typenum::U32; + use super::*; use crate::{ ff::{ boolean::Boolean, @@ -250,48 +355,147 @@ mod tests { ec_prime_field::Fp25519, ArrayAccess, Serializable, }, - protocol, + helpers::stream::{ProcessChunks, TryFlattenItersExt}, protocol::{ context::Context, ipa_prf::boolean_ops::share_conversion_aby::{convert_to_fp25519, expand_array}, }, rand::thread_rng, - secret_sharing::SharedValue, + secret_sharing::{SharedValue, TransposeFrom}, + seq_join::{seq_join, SeqJoin}, test_executor::run, - test_fixture::{Reconstruct, Runner, TestWorld}, + test_fixture::{ReconstructArr, Runner, TestWorld}, + BoolVector, }; - #[test] - fn semi_honest_convert_into_fp25519() { + fn test_semi_honest_convert_into_fp25519() + where + Fp25519: Vectorizable, + Boolean: FieldSimd, + XS: ArrayAccessRef> + + ArrayBuild> + + for<'a> TransposeFrom<&'a [AdditiveShare; CHUNK], Error = Infallible> + + Send + + Sync + + 'static, + YS: ArrayAccessRef> + + ArrayBuild> + + FromPrss + + Send + + Sync + + 'static, + for<'a> ::Ref<'a>: Send, + for<'a> ::Ref<'a>: Send, + AdditiveShare: Not>, + Vec>: for<'a> TransposeFrom<&'a YS>, + Vec: for<'a> TransposeFrom< + &'a [>::Array; 256], + Error = Infallible, + >, + [AdditiveShare; 3]: ReconstructArr<>::Array>, + { run(|| async move { let world = TestWorld::default(); let mut rng = thread_rng(); - let records = rng.gen::(); - - let mut buf: GenericArray = [0u8; 32].into(); - - expand_array::(&records, None).serialize(&mut buf); + let records = repeat_with(|| rng.gen::()) + .take(COUNT) + .collect::>(); - let expected = Fp25519::from(::from_bytes_mod_order(<[u8; 32]>::from(buf))); + let expected = records + .iter() + .map(|record| { + let mut buf: GenericArray = [0u8; 32].into(); + expand_array::(record, None).serialize(&mut buf); + Fp25519::from(::from_bytes_mod_order(<[u8; 32]>::from(buf))) + }) + .collect::>(); - let result = world - .semi_honest(records, |ctx, x| async move { - convert_to_fp25519::<_, BA64>( - ctx.set_total_records(1), - protocol::RecordId(0), - &x, + let [res0, res1, res2] = world + .semi_honest(records.into_iter(), |ctx, records| async move { + #[cfg(not(debug_assertions))] + let begin = std::time::Instant::now(); + let res: Result>, Error> = seq_join( + ctx.active_work(), + records.process_chunks( + |idx, chunk| { + let ctx = ctx.clone(); + async move { + let mut match_keys_builder = XS::builder(); + for _ in 0..CHUNK { + match_keys_builder + .push(AdditiveShare::::ZERO); + } + let mut match_keys = match_keys_builder.build(); + match_keys.transpose_from(&chunk).unwrap_infallible(); + convert_to_fp25519::<_, XS, YS, CHUNK>( + ctx.set_total_records((COUNT + CHUNK - 1) / CHUNK), + RecordId::from(idx), + match_keys, + ) + .await + .map(|shares| { + shares + .into_unpacking_iter() + .collect::>() + .try_into() + .unwrap() + }) + } + }, + || AdditiveShare::::ZERO, + ), ) - .await - .unwrap() + .try_flatten_iters() + .try_collect() + .await; + #[cfg(not(debug_assertions))] + tracing::info!("Execution time: {:?}", begin.elapsed()); + res }) .await - .reconstruct(); + .map(Result::unwrap); + let mut result = Vec::with_capacity(COUNT); + for line in res0.into_iter().zip(res1).zip(res2) { + let ((s0, s1), s2) = line; + result.extend([s0, s1, s2].reconstruct_arr().into_iter()); + } assert_eq!(result, expected); }); } + // The third generic parameter in these calls is the number of conversions. It is set to give + // reasonable runtime for debug builds. These can also be used for benchmarking, in which case + // a size of 4096 is reasonable. + + #[test] + fn semi_honest_convert_into_fp25519_novec() { + test_semi_honest_convert_into_fp25519::(); + } + + #[test] + fn semi_honest_convert_into_fp25519_vec16() { + test_semi_honest_convert_into_fp25519::( + ); + } + + #[test] + fn semi_honest_convert_into_fp25519_vec64() { + test_semi_honest_convert_into_fp25519::( + ); + } + + #[test] + fn semi_honest_convert_into_fp25519_vec256() { + test_semi_honest_convert_into_fp25519::< + BoolVector!(64, 256), + BoolVector!(256, 256), + 512, + 256, + >(); + } + #[test] fn test_expand() { let mut rng = thread_rng(); diff --git a/ipa-core/src/protocol/ipa_prf/mod.rs b/ipa-core/src/protocol/ipa_prf/mod.rs index aab014b52..4147c8e27 100644 --- a/ipa-core/src/protocol/ipa_prf/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/mod.rs @@ -1,5 +1,6 @@ -use std::{num::NonZeroU32, ops::Add}; +use std::{array, num::NonZeroU32, ops::Add}; +use futures_util::TryStreamExt; use generic_array::{ArrayLength, GenericArray}; use ipa_macros::Step; use typenum::{Unsigned, U18}; @@ -8,9 +9,10 @@ use self::{quicksort::quicksort_ranges_by_key_insecure, shuffle::shuffle_inputs} use crate::{ error::{Error, UnwrapInfallible}, ff::{ - boolean::Boolean, boolean_array::BA64, CustomArray, PrimeField, Serializable, - U128Conversions, + boolean::Boolean, boolean_array::BA64, ArrayBuild, ArrayBuilder, CustomArray, PrimeField, + Serializable, U128Conversions, }, + helpers::stream::{ChunkData, ProcessChunks, TryFlattenItersExt}, protocol::{ basics::BooleanArrayMul, context::{UpgradableContext, UpgradedContext}, @@ -25,8 +27,10 @@ use crate::{ }, secret_sharing::{ replicated::{malicious::ExtendableField, semi_honest::AdditiveShare as Replicated}, - SharedValue, + SharedValue, TransposeFrom, }, + seq_join::seq_join, + BoolVector, }; mod boolean_ops; @@ -47,8 +51,8 @@ pub(crate) enum Step { SortByTimestamp, } -#[derive(Debug)] -#[cfg_attr(test, derive(Clone, PartialEq, Eq))] +#[derive(Clone, Debug)] +#[cfg_attr(test, derive(PartialEq, Eq))] pub struct OPRFIPAInputRow { pub match_key: Replicated, pub is_trigger: Replicated, @@ -186,7 +190,7 @@ where { let shuffled = shuffle_inputs(ctx.narrow(&Step::Shuffle), input_rows).await?; let mut prfd_inputs = - compute_prf_for_inputs(ctx.narrow(&Step::ConvertInputRowsToPrf), shuffled).await?; + compute_prf_for_inputs(ctx.narrow(&Step::ConvertInputRowsToPrf), &shuffled).await?; prfd_inputs.sort_by(|a, b| a.prf_of_match_key.cmp(&b.prf_of_match_key)); @@ -212,7 +216,7 @@ where #[tracing::instrument(name = "compute_prf_for_inputs", skip_all)] async fn compute_prf_for_inputs( ctx: C, - input_rows: Vec>, + input_rows: &[OPRFIPAInputRow], ) -> Result>, Error> where C: UpgradableContext, @@ -224,35 +228,77 @@ where F: PrimeField + ExtendableField, Replicated: Serializable, { - let ctx = ctx.set_total_records(input_rows.len()); + const CHUNK: usize = 64; + + let ctx = ctx.set_total_records((input_rows.len() + CHUNK - 1) / CHUNK); let convert_ctx = ctx.narrow(&Step::ConvertFp25519); let eval_ctx = ctx.narrow(&Step::EvalPrf); let prf_key = gen_prf_key(&convert_ctx); - ctx.try_join(input_rows.into_iter().enumerate().map(|(idx, record)| { - let convert_ctx = convert_ctx.clone(); - let eval_ctx = eval_ctx.clone(); - let prf_key = &prf_key; - async move { - let record_id = RecordId::from(idx); - let elliptic_curve_pt = - convert_to_fp25519::<_, BA64>(convert_ctx, record_id, &record.match_key).await?; - let elliptic_curve_pt = - eval_dy_prf(eval_ctx, record_id, prf_key, &elliptic_curve_pt).await?; - - Ok::<_, Error>(PrfShardedIpaInputRow { - prf_of_match_key: elliptic_curve_pt, - is_trigger_bit: record.is_trigger, - breakdown_key: record.breakdown_key, - trigger_value: record.trigger_value, - timestamp: record.timestamp, - sort_key: Replicated::ZERO, - }) - } - })) + seq_join( + ctx.active_work(), + input_rows.process_chunks( + move |idx, records: ChunkData<_, CHUNK>| { + let convert_ctx = convert_ctx.clone(); + let eval_ctx = eval_ctx.clone(); + let prf_key = prf_key.clone(); + + async move { + let record_id = RecordId::from(idx); + let mut match_keys_builder = ::builder(); + for _ in 0..CHUNK { + match_keys_builder.push(Replicated::::ZERO); + } + let mut match_keys = match_keys_builder.build(); + let tmp: &dyn Fn(usize) -> Replicated = + &|i: usize| records[i].match_key.clone(); + match_keys.transpose_from(tmp).unwrap_infallible(); + let curve_pts = convert_to_fp25519::< + _, + BoolVector!(64, CHUNK), + BoolVector!(256, CHUNK), + CHUNK, + >(convert_ctx, record_id, match_keys) + .await?; + + let prf_of_match_keys = + eval_dy_prf::<_, CHUNK>(eval_ctx, record_id, &prf_key, curve_pts).await?; + + Ok(array::from_fn(|i| { + let OPRFIPAInputRow { + match_key: _, + is_trigger, + breakdown_key, + trigger_value, + timestamp, + } = &records[i]; + + PrfShardedIpaInputRow { + prf_of_match_key: prf_of_match_keys[i], + is_trigger_bit: is_trigger.clone(), + breakdown_key: breakdown_key.clone(), + trigger_value: trigger_value.clone(), + timestamp: timestamp.clone(), + sort_key: Replicated::ZERO, + } + })) + } + }, + || OPRFIPAInputRow { + match_key: Replicated::::ZERO, + is_trigger: Replicated::::ZERO, + breakdown_key: Replicated::::ZERO, + trigger_value: Replicated::::ZERO, + timestamp: Replicated::::ZERO, + }, + ), + ) + .try_flatten_iters() + .try_collect() .await } + #[cfg(all(test, any(unit_test, feature = "shuttle")))] pub mod tests { use crate::{ diff --git a/ipa-core/src/protocol/ipa_prf/prf_eval.rs b/ipa-core/src/protocol/ipa_prf/prf_eval.rs index 10bbad630..a10a9a0e2 100644 --- a/ipa-core/src/protocol/ipa_prf/prf_eval.rs +++ b/ipa-core/src/protocol/ipa_prf/prf_eval.rs @@ -1,17 +1,19 @@ +use std::iter::zip; + use ipa_macros::Step; use crate::{ error::Error, - ff::{curve_points::RP25519, ec_prime_field::Fp25519}, + ff::{boolean::Boolean, curve_points::RP25519, ec_prime_field::Fp25519, Expand}, protocol::{ basics::{Reveal, SecureMul}, context::Context, - prss::SharedRandomness, + prss::{FromPrss, SharedRandomness}, RecordId, }, secret_sharing::{ - replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, - SharedValue, + replicated::semi_honest::AdditiveShare, FieldSimd, FieldVectorizable, Sendable, StdArray, + Vectorizable, }, }; @@ -40,15 +42,25 @@ where { let ctx = sh_ctx.set_total_records(input_match_keys.len()); let futures = input_match_keys - .iter() + .into_iter() .enumerate() .map(|(i, x)| eval_dy_prf(ctx.clone(), i.into(), &prf_key, x)); - ctx.try_join(futures).await + Ok(ctx.try_join(futures).await?.into_iter().flatten().collect()) } -impl From> for AdditiveShare { - fn from(s: AdditiveShare) -> Self { - AdditiveShare::new(RP25519::from(s.left()), RP25519::from(s.right())) +impl From> for AdditiveShare +where + Fp25519: Vectorizable, + RP25519: Vectorizable>, + StdArray: Sendable, +{ + fn from(value: AdditiveShare) -> Self { + let (left_arr, right_arr) = + StdArray::::from_tuple_iter(value.into_unpacking_iter().map(|sh| { + let (l, r) = sh.as_tuple(); + (RP25519::from(l), RP25519::from(r)) + })); + Self::new_arr(left_arr, right_arr) } } @@ -67,35 +79,47 @@ where /// outputs a u64 as specified in `protocol/prf_sharding/mod.rs`, all parties learn the output /// # Errors /// Propagates errors from multiplications, reveal and scalar multiplication - -pub async fn eval_dy_prf( +/// # Panics +/// Never as of when this comment was written, but the compiler didn't know that. +pub async fn eval_dy_prf( ctx: C, record_id: RecordId, k: &AdditiveShare, - x: &AdditiveShare, -) -> Result + x: AdditiveShare, +) -> Result<[u64; N], Error> where C: Context, + Fp25519: Vectorizable, + RP25519: Vectorizable>, + Boolean: FieldSimd, + AdditiveShare: Reveal>::ArrayAlias>, + AdditiveShare: SecureMul + FromPrss, + StdArray: Sendable, { - let sh_r: AdditiveShare = ctx.narrow(&Step::GenRandomMask).prss().generate(record_id); - - //compute (g^left, g^right) - let sh_gr = AdditiveShare::::from(sh_r.clone()); + let sh_r: AdditiveShare = + ctx.narrow(&Step::GenRandomMask).prss().generate(record_id); //compute x+k - let mut y = x + k; + let mut y = x + AdditiveShare::::expand(k); //compute y <- r*y y = y .multiply(&sh_r, ctx.narrow(&Step::MultMaskWithPRFInput), record_id) .await?; + //compute (g^left, g^right) + let sh_gr = AdditiveShare::::from(sh_r); + //reconstruct (z,R) - let gr = RP25519::from_array(&sh_gr.reveal(ctx.narrow(&Step::RevealR), record_id).await?); - let z = Fp25519::from_array(&y.reveal(ctx.narrow(&Step::Revealz), record_id).await?); + let gr = sh_gr.reveal(ctx.narrow(&Step::RevealR), record_id).await?; + let z = y.reveal(ctx.narrow(&Step::Revealz), record_id).await?; //compute R^(1/z) to u64 - Ok(u64::from(gr * (z.invert()))) + Ok(zip(gr, z) + .map(|(gr, z)| u64::from(gr * z.invert())) + .collect::>() + .try_into() + .expect("iteration over arrays")) } #[cfg(all(test, unit_test))] diff --git a/ipa-core/src/protocol/prss/crypto.rs b/ipa-core/src/protocol/prss/crypto.rs index a332b9bea..0fa8c9209 100644 --- a/ipa-core/src/protocol/prss/crypto.rs +++ b/ipa-core/src/protocol/prss/crypto.rs @@ -13,7 +13,7 @@ use crate::{ ff::Field, protocol::prss::PrssIndex, secret_sharing::{ - replicated::{semi_honest::AdditiveShare as Replicated, ReplicatedSecretSharing}, + replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, SharedValue, }, }; @@ -69,14 +69,30 @@ impl FromRandom for T { /// /// In the first case, `FromPrss` is implemented for a tuple type, while in the second case, /// `FromPrss` is implemented for a secret-shared type. -pub trait FromPrss: Sized { - fn from_prss>(prss: &P, index: I) -> Self; +pub trait FromPrss +where + Self: Sized, + Params: Default, +{ + fn from_prss_with>( + prss: &P, + index: I, + params: Params, + ) -> Self; + + fn from_prss>(prss: &P, index: I) -> Self { + Self::from_prss_with(prss, index, Default::default()) + } } /// Generate two random values, one that is known to the left helper /// and one that is known to the right helper. impl FromPrss for (T, T) { - fn from_prss>(prss: &P, index: I) -> (T, T) { + fn from_prss_with>( + prss: &P, + index: I, + _params: (), + ) -> (T, T) { let (l, r) = prss.generate_arrays(index); (T::from_random(l), T::from_random(r)) } @@ -88,24 +104,68 @@ impl FromPrss for (T, T) { /// "Efficient Bit-Decomposition and Modulus Conversion Protocols with an Honest Majority" /// by Ryo Kikuchi, Dai Ikarashi, Takahiro Matsuda, Koki Hamada, and Koji Chida /// -impl FromPrss for Replicated { - fn from_prss>( +impl FromPrss for AdditiveShare { + fn from_prss_with>( prss: &P, index: I, - ) -> Replicated { + _params: (), + ) -> AdditiveShare { let (l, r) = <(T, T) as FromPrss>::from_prss(prss, index); - Replicated::new(l, r) + AdditiveShare::new(l, r) + } +} + +/// Generate a replicated secret sharing of a random value, which none +/// of the helpers knows. This is an implementation of the functionality 2.1 `F_rand` +/// described on page 5 of the paper: +/// "Efficient Bit-Decomposition and Modulus Conversion Protocols with an Honest Majority" +/// by Ryo Kikuchi, Dai Ikarashi, Takahiro Matsuda, Koki Hamada, and Koji Chida +/// +impl FromPrss for AdditiveShare { + fn from_prss_with>( + prss: &P, + index: I, + len: usize, + ) -> AdditiveShare { + assert_eq!( + u32::try_from(len).unwrap(), + ::BITS, + "incorrect length {len} for AdditiveShare::FromPrss, expected {}", + ::BITS, + ); + let (l, r) = <(T, T) as FromPrss>::from_prss(prss, index); + AdditiveShare::new(l, r) } } pub trait SharedRandomness { + type ChunksIter<'a, Z: ArrayLength>: Iterator< + Item = (GenericArray, GenericArray), + > + where + Self: 'a; + + /// Return an iterator over chunks of generated randomness. + /// + /// The iterator returns 2-tuples of `GenericArray` chunks, one that is known to the + /// left helper and one that is known to the right helper. + /// + /// This functionality is intended for use generating large vectorized values. + #[must_use] + fn generate_chunks_iter, Z: ArrayLength>( + &self, + index: I, + ) -> Self::ChunksIter<'_, Z>; + /// Generate two random values, one that is known to the left helper /// and one that is known to the right helper. #[must_use] fn generate_arrays, N: ArrayLength>( &self, index: I, - ) -> (GenericArray, GenericArray); + ) -> (GenericArray, GenericArray) { + Self::generate_chunks_iter(self, index).next().unwrap() + } /// Generate two random values, one that is known to the left helper /// and one that is known to the right helper. @@ -133,6 +193,18 @@ pub trait SharedRandomness { T::from_prss(self, index) } + /// Generate something that implements the `FromPrss` trait, passing parameters. + /// + /// Generation by `FromPrss` is described in more detail in the `FromPrss` documentation. + #[must_use] + fn generate_with, I: Into, P: Default>( + &self, + index: I, + params: P, + ) -> T { + T::from_prss_with(self, index, params) + } + /// Generate a non-replicated additive secret sharing of zero. /// /// This is used for the MAC accumulators for malicious security. diff --git a/ipa-core/src/protocol/prss/mod.rs b/ipa-core/src/protocol/prss/mod.rs index 15690fd7e..41db1e7d3 100644 --- a/ipa-core/src/protocol/prss/mod.rs +++ b/ipa-core/src/protocol/prss/mod.rs @@ -4,6 +4,7 @@ use std::collections::HashSet; use std::{ collections::HashMap, fmt::{Debug, Display, Formatter}, + marker::PhantomData, }; pub use crypto::{ @@ -157,20 +158,50 @@ pub struct IndexedSharedRandomness { } impl SharedRandomness for IndexedSharedRandomness { - fn generate_arrays, N: ArrayLength>( + type ChunksIter<'a, Z: ArrayLength> = ChunksIter<'a, Z>; + + fn generate_chunks_iter, Z: ArrayLength>( &self, index: I, - ) -> (GenericArray, GenericArray) { - let index = index.into(); + ) -> Self::ChunksIter<'_, Z> { + ChunksIter { + inner: self, + index: index.into(), + offset: 0, + phantom_data: PhantomData, + } + } +} + +pub struct ChunksIter<'a, Z: ArrayLength> { + inner: &'a IndexedSharedRandomness, + index: PrssIndex, + offset: usize, + phantom_data: PhantomData, +} + +impl<'a, Z: ArrayLength> Iterator for ChunksIter<'a, Z> { + type Item = (GenericArray, GenericArray); + + fn next(&mut self) -> Option { #[cfg(debug_assertions)] { - for i in 0..N::USIZE { - self.used.insert(index.offset(i)); + for i in self.offset..self.offset + Z::USIZE { + self.inner.used.insert(self.index.offset(i)); } } - let l = GenericArray::generate(|i| self.left.generate(index.offset(i).into())); - let r = GenericArray::generate(|i| self.right.generate(index.offset(i).into())); - (l, r) + let l = GenericArray::generate(|i| { + self.inner + .left + .generate(self.index.offset(self.offset + i).into()) + }); + let r = GenericArray::generate(|i| { + self.inner + .right + .generate(self.index.offset(self.offset + i).into()) + }); + self.offset += Z::USIZE; + Some((l, r)) } } diff --git a/ipa-core/src/secret_sharing/decomposed.rs b/ipa-core/src/secret_sharing/decomposed.rs index f15455a87..dc1daed02 100644 --- a/ipa-core/src/secret_sharing/decomposed.rs +++ b/ipa-core/src/secret_sharing/decomposed.rs @@ -6,8 +6,12 @@ use std::{ use crate::{ error::Error, - ff::{ArrayAccessRef, ArrayBuild, ArrayBuilder, PrimeField}, - secret_sharing::{Linear as LinearSecretSharing, LinearRefOps}, + ff::{boolean::Boolean, ArrayAccessRef, ArrayBuild, ArrayBuilder, PrimeField}, + protocol::prss::{FromPrss, FromRandom, PrssIndex, SharedRandomness}, + secret_sharing::{ + replicated::semi_honest::AdditiveShare, Linear as LinearSecretSharing, LinearRefOps, + SharedValue, Vectorizable, + }, }; #[derive(Clone, Debug, PartialEq)] @@ -109,6 +113,29 @@ impl BitDecomposed { } } +impl FromPrss for BitDecomposed> +where + A: SharedValue + FromRandom, + Boolean: Vectorizable, +{ + fn from_prss_with>( + prss: &P, + index: I, + len: usize, + ) -> Self { + let bits = prss + .generate_chunks_iter::<_, ::SourceLength>(index) + .map(|(l_rand, r_rand)| { + let l_val = A::from_random(l_rand); + let r_val = A::from_random(r_rand); + AdditiveShare::new_arr(l_val, r_val) + }) + .take(len) + .collect(); + Self { bits } + } +} + impl TryFrom> for BitDecomposed { type Error = Error; fn try_from(bits: Vec) -> Result { diff --git a/ipa-core/src/secret_sharing/mod.rs b/ipa-core/src/secret_sharing/mod.rs index eb1838f0e..9e5e2453f 100644 --- a/ipa-core/src/secret_sharing/mod.rs +++ b/ipa-core/src/secret_sharing/mod.rs @@ -23,8 +23,8 @@ use rand::{ }; pub use scheme::{Bitwise, Linear, LinearRefOps, SecretSharing}; pub use vector::{ - FieldArray, FieldSimd, FieldVectorizable, SharedValueArray, StdArray, TransposeFrom, - Vectorizable, + BoolVectorLookup, BoolVectorTrait, FieldArray, FieldSimd, FieldVectorizable, SharedValueArray, + StdArray, TransposeFrom, Vectorizable, }; #[cfg(any(test, feature = "test-fixture", feature = "cli"))] diff --git a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs index c37bee4b1..93bda118e 100644 --- a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs +++ b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs @@ -124,6 +124,14 @@ impl, const N: usize> AdditiveShare { >::Array::from_fn(rf), ) } + + // Providing this as IntoIterator results in conflicting malicious upgrade implementations for + // AdditiveShare. It's not clear that the unpacking iterator is a universally appropriate thing + // to return from IntoIterator anyways. + pub fn into_unpacking_iter(self) -> UnpackIter { + let Self(left, right) = self; + UnpackIter(left.into_iter(), right.into_iter()) + } } impl AdditiveShare @@ -476,6 +484,23 @@ where } } +pub struct UnpackIter, const N: usize>( + <>::Array as IntoIterator>::IntoIter, + <>::Array as IntoIterator>::IntoIter, +); + +impl, const N: usize> Iterator for UnpackIter { + type Item = AdditiveShare; + + fn next(&mut self) -> Option { + match (self.0.next(), self.1.next()) { + (None, None) => None, + (Some(left), Some(right)) => Some(AdditiveShare::new(left, right)), + _ => unreachable!("unequal left/right length in vectorized AdditiveShare"), + } + } +} + pub struct AdditiveShareArrayBuilder where B: ArrayBuilder, diff --git a/ipa-core/src/secret_sharing/vector/array.rs b/ipa-core/src/secret_sharing/vector/array.rs index ce3c22f14..3a099ca86 100644 --- a/ipa-core/src/secret_sharing/vector/array.rs +++ b/ipa-core/src/secret_sharing/vector/array.rs @@ -6,11 +6,11 @@ use std::{ }; use generic_array::{ArrayLength, GenericArray}; -use typenum::{U16, U256, U32, U64}; +use typenum::{U128, U16, U256, U32, U512, U64}; use crate::{ error::LengthError, - ff::{Field, Fp32BitPrime, Serializable}, + ff::{ec_prime_field::Fp25519, Expand, Field, Fp32BitPrime, Serializable}, protocol::prss::FromRandom, secret_sharing::{FieldArray, Sendable, SharedValue, SharedValueArray}, }; @@ -104,6 +104,31 @@ where } } +impl StdArray +where + Self: Sendable, // required for `::ZERO` +{ + /// Build a pair of `StdArray`s from an iterator over tuples. + /// + /// # Panics + /// If the iterator terminates before producing N items. + pub fn from_tuple_iter>(iter: T) -> (Self, Self) { + let mut l_res = Self::ZERO_ARRAY; + let mut r_res = Self::ZERO_ARRAY; + let mut iter = iter.into_iter(); + + for i in 0..N { + let (l, r) = iter + .next() + .unwrap_or_else(|| panic!("Expected iterator to produce {N} items, got only {i}")); + l_res.0[i] = l; + r_res.0[i] = r; + } + + (l_res, r_res) + } +} + impl IntoIterator for StdArray { type Item = V; type IntoIter = std::array::IntoIter; @@ -113,6 +138,14 @@ impl IntoIterator for StdArray { } } +impl Expand for StdArray { + type Input = V; + + fn expand(v: &Self::Input) -> Self { + Self(array::from_fn(|_| *v)) + } +} + impl<'a, 'b, V: SharedValue, const N: usize> Add<&'b StdArray> for &'a StdArray { type Output = StdArray; @@ -293,6 +326,9 @@ macro_rules! impl_from_random { }; } +impl_from_random!(Fp25519, 16, U32, 2); +impl_from_random!(Fp25519, 64, U128, 2); +impl_from_random!(Fp25519, 256, U512, 2); impl_from_random!(Fp32BitPrime, 32, U32, 1); impl Serializable for StdArray { diff --git a/ipa-core/src/secret_sharing/vector/impls.rs b/ipa-core/src/secret_sharing/vector/impls.rs index 2ada6571c..79ee5949f 100644 --- a/ipa-core/src/secret_sharing/vector/impls.rs +++ b/ipa-core/src/secret_sharing/vector/impls.rs @@ -4,16 +4,23 @@ use crate::{ ff::{ boolean::Boolean, boolean_array::{BA16, BA20, BA256, BA3, BA32, BA5, BA64, BA8}, + ec_prime_field::Fp25519, Fp32BitPrime, }, secret_sharing::{ - replicated::semi_honest::AdditiveShare, FieldSimd, FieldVectorizable, + replicated::semi_honest::AdditiveShare, BitDecomposed, FieldSimd, FieldVectorizable, ReplicatedSecretSharing, Vectorizable, }, }; impl FieldSimd<32> for Fp32BitPrime {} +impl FieldSimd<16> for Fp25519 {} + +impl FieldSimd<64> for Fp25519 {} + +impl FieldSimd<256> for Fp25519 {} + macro_rules! boolean_vector { ($dim:expr, $vec:ty) => { impl Vectorizable<$dim> for Boolean { @@ -65,6 +72,36 @@ boolean_vector!(256, BA256); /// `BitDecomposed>`. #[macro_export] macro_rules! BoolVector { - (16, 1) => { $crate::secret_sharing::replicated::semi_honest::AdditiveShare<$crate::ff::BA16> }; - ($width:expr, $dim:expr) => { BitDecomposed<$crate::secret_sharing::replicated::semi_honest::AdditiveShare<$crate::ff::boolean::Boolean, $dim>> }; + ($width:expr, $dim:expr) => { + <$crate::secret_sharing::BoolVectorLookup as $crate::secret_sharing::BoolVectorTrait< + $width, + $dim, + >>::Share + }; +} + +pub trait BoolVectorTrait { + type Share; +} + +pub struct BoolVectorLookup; + +impl BoolVectorTrait<64, 1> for BoolVectorLookup { + type Share = AdditiveShare; +} + +impl BoolVectorTrait<256, 1> for BoolVectorLookup { + type Share = AdditiveShare; +} + +impl BoolVectorTrait for BoolVectorLookup { + type Share = BitDecomposed>; +} + +impl BoolVectorTrait for BoolVectorLookup { + type Share = BitDecomposed>; +} + +impl BoolVectorTrait for BoolVectorLookup { + type Share = BitDecomposed>; } diff --git a/ipa-core/src/secret_sharing/vector/mod.rs b/ipa-core/src/secret_sharing/vector/mod.rs index 4e4575af3..e4bb70c6e 100644 --- a/ipa-core/src/secret_sharing/vector/mod.rs +++ b/ipa-core/src/secret_sharing/vector/mod.rs @@ -54,6 +54,7 @@ mod traits; mod transpose; pub use array::StdArray; +pub use impls::{BoolVectorLookup, BoolVectorTrait}; pub use traits::{FieldArray, FieldSimd, FieldVectorizable, SharedValueArray, Vectorizable}; pub use transpose::TransposeFrom; #[cfg(feature = "enable-benches")] diff --git a/ipa-core/src/secret_sharing/vector/traits.rs b/ipa-core/src/secret_sharing/vector/traits.rs index b44316b70..91da2f2e1 100644 --- a/ipa-core/src/secret_sharing/vector/traits.rs +++ b/ipa-core/src/secret_sharing/vector/traits.rs @@ -5,7 +5,7 @@ use std::{ use crate::{ error::LengthError, - ff::Field, + ff::{Expand, Field}, protocol::prss::FromRandom, secret_sharing::{Sendable, SharedValue}, }; @@ -96,6 +96,7 @@ pub trait SharedValueArray: + for<'a> Sub<&'a Self, Output = Self> + SubAssign + for<'a> SubAssign<&'a Self> + + Expand { const ZERO_ARRAY: Self; diff --git a/ipa-core/src/secret_sharing/vector/transpose.rs b/ipa-core/src/secret_sharing/vector/transpose.rs index 020cdb9a6..aa14c3226 100644 --- a/ipa-core/src/secret_sharing/vector/transpose.rs +++ b/ipa-core/src/secret_sharing/vector/transpose.rs @@ -45,6 +45,7 @@ use crate::{ ff::{ boolean::Boolean, boolean_array::{BA16, BA256, BA64}, + ArrayAccess, }, secret_sharing::{ replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, @@ -154,6 +155,36 @@ pub fn transpose_16x16(src: &[u8; 32]) -> [u8; 32] { // Degenerate transposes. +impl<'a> TransposeFrom<&'a [AdditiveShare; 1]> for AdditiveShare { + type Error = Infallible; + fn transpose_from(&mut self, src: &'a [AdditiveShare; 1]) -> Result<(), Infallible> { + *self = src[0].clone(); + Ok(()) + } +} + +impl TransposeFrom>> for AdditiveShare { + type Error = LengthError; + fn transpose_from(&mut self, mut src: Vec>) -> Result<(), LengthError> { + if src.len() != 1 { + return Err(LengthError { + expected: 1, + actual: src.len(), + }); + } + *self = src.remove(0); + Ok(()) + } +} + +impl<'a> TransposeFrom<&'a AdditiveShare> for Vec> { + type Error = Infallible; + fn transpose_from(&mut self, src: &'a AdditiveShare) -> Result<(), Infallible> { + *self = vec![src.clone()]; + Ok(()) + } +} + impl TransposeFrom> for Vec> { type Error = Infallible; @@ -172,6 +203,41 @@ impl TransposeFrom>> for Vec { } } +impl<'a> TransposeFrom<&'a [StdArray; 256]> for Vec { + type Error = Infallible; + fn transpose_from(&mut self, src: &'a [StdArray; 256]) -> Result<(), Infallible> { + *self = vec![src.iter().map(Boolean::from_array).collect::()]; + Ok(()) + } +} + +impl TransposeFrom<&dyn Fn(usize) -> AdditiveShare> for AdditiveShare { + type Error = Infallible; + fn transpose_from( + &mut self, + src: &dyn Fn(usize) -> AdditiveShare, + ) -> Result<(), Infallible> { + *self = src(0); + Ok(()) + } +} + +impl TransposeFrom<&dyn Fn(usize) -> AdditiveShare> + for BitDecomposed> +{ + type Error = Infallible; + fn transpose_from( + &mut self, + src: &dyn Fn(usize) -> AdditiveShare, + ) -> Result<(), Infallible> { + let src = src(0); + *self = BitDecomposed::decompose(64, |i| src.get(i).unwrap()); + Ok(()) + } +} + +// Matrix transposes + /// Perform a larger transpose using an 16x16 kernel. /// /// Matrix height and width must be multiples of 16. @@ -261,6 +327,7 @@ macro_rules! impl_transpose_ba_to_ba { impl_transpose_ba_to_ba!(BA16, BA64, 16, 64, test_transpose_ba_16x64); impl_transpose_ba_to_ba!(BA64, BA64, 64, 64, test_transpose_ba_64x64); +impl_transpose_ba_to_ba!(BA256, BA16, 256, 16, test_transpose_ba_256x16); impl_transpose_ba_to_ba!(BA256, BA64, 256, 64, test_transpose_ba_256x64); impl_transpose_ba_to_ba!(BA256, BA256, 256, 256, test_transpose_ba_256x256); @@ -359,6 +426,108 @@ impl_transpose_shares_bool_to_ba!(BA256, 256, 16, test_transpose_shares_bool_to_ impl_transpose_shares_bool_to_ba!(BA256, 256, 64, test_transpose_shares_bool_to_ba_256x64); impl_transpose_shares_bool_to_ba!(BA256, 256, 256, test_transpose_shares_bool_to_ba_256x256); +/// Implement a transpose of a MxN matrix of secret-shared bits represented as +/// `[AdditiveShare>; M]` into a NxM bit matrix represented as `[AdditiveShare; N]`. +/// +/// For MxN = 16x64, the invocation looks like `impl_transpose_shares_ba_fn_to_bool!(BA64, 16, 64)`. +macro_rules! impl_transpose_shares_ba_to_bool { + ($src_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident) => { + impl TransposeFrom<&[AdditiveShare<$src_row>; $src_rows]> + for [AdditiveShare; $src_cols] + { + type Error = Infallible; + fn transpose_from( + &mut self, + src: &[AdditiveShare<$src_row>; $src_rows], + ) -> Result<(), Infallible> { + // Transpose left share + do_transpose_16( + $src_rows / 16, + $src_cols / 16, + |i, j| { + let mut d = [0u8; 32]; + for k in 0..16 { + d[2 * k..2 * (k + 1)].copy_from_slice( + &src[16 * i + k].left().as_raw_slice()[2 * j..2 * (j + 1)], + ); + } + d + }, + |i, j, d| { + for k in 0..16 { + self[16 * i + k].left_arr_mut().as_raw_mut_slice()[2 * j..2 * (j + 1)] + .copy_from_slice(&d[2 * k..2 * (k + 1)]); + } + }, + ); + // Transpose right share + do_transpose_16( + $src_rows / 16, + $src_cols / 16, + |i, j| { + let mut d = [0u8; 32]; + for k in 0..16 { + d[2 * k..2 * (k + 1)].copy_from_slice( + &src[16 * i + k].right().as_raw_slice()[2 * j..2 * (j + 1)], + ); + } + d + }, + |i, j, d| { + for k in 0..16 { + self[16 * i + k].right_arr_mut().as_raw_mut_slice()[2 * j..2 * (j + 1)] + .copy_from_slice(&d[2 * k..2 * (k + 1)]); + } + }, + ); + Ok(()) + } + } + + impl TransposeFrom<&[AdditiveShare<$src_row>; $src_rows]> + for BitDecomposed> + { + type Error = Infallible; + fn transpose_from( + &mut self, + src: &[AdditiveShare<$src_row>; $src_rows], + ) -> Result<(), Infallible> { + self.resize($src_cols, AdditiveShare::::ZERO); + let dst = + <&mut [AdditiveShare; $src_cols]>::try_from(&mut **self) + .unwrap(); + dst.transpose_from(src) + } + } + + impl TransposeFrom>> + for BitDecomposed> + { + type Error = LengthError; + fn transpose_from( + &mut self, + src: Vec>, + ) -> Result<(), LengthError> { + self.resize($src_cols, AdditiveShare::::ZERO); + let src = <&[AdditiveShare<$src_row>; $src_rows]>::try_from(src.as_slice()) + .map_err(|_| LengthError { + expected: $src_rows, + actual: src.len(), + })?; + let dst = + <&mut [AdditiveShare; $src_cols]>::try_from(&mut **self) + .unwrap(); + dst.transpose_from(src).unwrap_infallible(); + Ok(()) + } + } + }; +} + +impl_transpose_shares_ba_to_bool!(BA64, 16, 64, test_transpose_shares_ba_to_bool_16x64); // TODO: tests +impl_transpose_shares_ba_to_bool!(BA64, 64, 64, test_transpose_shares_ba_to_bool_64x64); +impl_transpose_shares_ba_to_bool!(BA64, 256, 64, test_transpose_shares_ba_to_bool_256x64); + /// Implement a transpose of a MxN matrix of secret-shared bits accessed via /// `Fn(usize) -> AdditiveShare` into a NxM bit matrix represented as `[AdditiveShare; N]`. /// @@ -441,6 +610,7 @@ macro_rules! impl_transpose_shares_ba_fn_to_bool { } impl_transpose_shares_ba_fn_to_bool!(BA64, 16, 64, test_transpose_shares_ba_fn_to_bool_16x64); +impl_transpose_shares_ba_fn_to_bool!(BA64, 64, 64, test_transpose_shares_ba_fn_to_bool_64x64); impl_transpose_shares_ba_fn_to_bool!(BA64, 256, 64, test_transpose_shares_ba_fn_to_bool_256x64); /// Implement a transpose of a MxN matrix of secret-shared bits represented as From 69cf1888eb5fb93e5867d40843ea4f58fa47c8eb Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Tue, 19 Mar 2024 16:54:13 -0700 Subject: [PATCH 108/135] Some improvements to the transpose tests --- .../src/secret_sharing/vector/transpose.rs | 270 ++++++++++++------ 1 file changed, 176 insertions(+), 94 deletions(-) diff --git a/ipa-core/src/secret_sharing/vector/transpose.rs b/ipa-core/src/secret_sharing/vector/transpose.rs index aa14c3226..7a43cfd78 100644 --- a/ipa-core/src/secret_sharing/vector/transpose.rs +++ b/ipa-core/src/secret_sharing/vector/transpose.rs @@ -429,7 +429,7 @@ impl_transpose_shares_bool_to_ba!(BA256, 256, 256, test_transpose_shares_bool_to /// Implement a transpose of a MxN matrix of secret-shared bits represented as /// `[AdditiveShare>; M]` into a NxM bit matrix represented as `[AdditiveShare; N]`. /// -/// For MxN = 16x64, the invocation looks like `impl_transpose_shares_ba_fn_to_bool!(BA64, 16, 64)`. +/// For MxN = 16x64, the invocation looks like `impl_transpose_shares_ba_to_bool!(BA64, 16, 64)`. macro_rules! impl_transpose_shares_ba_to_bool { ($src_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident) => { impl TransposeFrom<&[AdditiveShare<$src_row>; $src_rows]> @@ -484,6 +484,12 @@ macro_rules! impl_transpose_shares_ba_to_bool { } } + #[cfg(all(test, unit_test))] + #[test] + fn $test_fn() { + tests::test_transpose_shares_ba_to_bool::<$src_row, $src_rows, $src_cols>(); + } + impl TransposeFrom<&[AdditiveShare<$src_row>; $src_rows]> for BitDecomposed> { @@ -524,7 +530,7 @@ macro_rules! impl_transpose_shares_ba_to_bool { }; } -impl_transpose_shares_ba_to_bool!(BA64, 16, 64, test_transpose_shares_ba_to_bool_16x64); // TODO: tests +impl_transpose_shares_ba_to_bool!(BA64, 16, 64, test_transpose_shares_ba_to_bool_16x64); impl_transpose_shares_ba_to_bool!(BA64, 64, 64, test_transpose_shares_ba_to_bool_64x64); impl_transpose_shares_ba_to_bool!(BA64, 256, 64, test_transpose_shares_ba_to_bool_256x64); @@ -590,6 +596,12 @@ macro_rules! impl_transpose_shares_ba_fn_to_bool { } } + #[cfg(all(test, unit_test))] + #[test] + fn $test_fn() { + tests::test_transpose_shares_ba_fn_to_bool::<$src_row, $src_rows, $src_cols>(); + } + impl TransposeFrom<&dyn Fn(usize) -> AdditiveShare<$src_row>> for BitDecomposed> { @@ -720,9 +732,6 @@ impl_transpose_shares_bool_to_bool!(BA64, 256, 64, test_transpose_shares_bool_to #[cfg(all(test, unit_test))] mod tests { - // Using `.enumerate()` would just obfuscate the nested for loops verifying transposes. - #![allow(clippy::needless_range_loop)] - use std::{ cmp::min, fmt::Debug, @@ -736,7 +745,7 @@ mod tests { }; use super::*; - use crate::{ff::ArrayAccess, secret_sharing::Vectorizable}; + use crate::secret_sharing::Vectorizable; fn random_array() -> [T; N] where @@ -796,6 +805,19 @@ mod tests { impl_byte_conversion!([u32; 32], [u8; 128]); impl_byte_conversion!([u64; 64], [u8; 512]); + fn verify_transpose(src_rows: usize, src_cols: usize, transposed: F1, original: F2) + where + T: PartialEq + Debug, + F1: Fn(usize, usize) -> T, + F2: Fn(usize, usize) -> T, + { + for i in 0..src_cols { + for j in 0..src_rows { + assert_eq!(transposed(i, j), original(j, i)); + } + } + } + fn test_transpose_array< T, // Matrix integer type (e.g. u16 for 16x16) const N: usize, // Matrix dimension @@ -837,11 +859,7 @@ mod tests { let m = <[T; N]>::from_bytes(m); let m_t = <[T; N]>::from_bytes(m_t); - for i in 0..N { - for j in 0..N { - assert_eq!((m_t[i] >> j) & one, (m[j] >> i) & one); - } - } + verify_transpose(N, N, |i, j| (m_t[i] >> j) & one, |i, j| (m[i] >> j) & one); } #[test] @@ -854,6 +872,48 @@ mod tests { test_transpose_array::(super::transpose_16x16); } + fn ba_shares_test_matrix( + step: usize, + ) -> [AdditiveShare; M] + where + BA: SharedValue + FromIterator + Vectorizable<1, Array = StdArray>, + { + array::from_fn(|i| { + let mut left = vec![Boolean::FALSE; N]; + let mut right = vec![Boolean::FALSE; N]; + for j in ((i % N)..N).step_by(step) { + let b = Boolean::from(j % 2 != 0); + left[j] = b; + right[j] = !b; + } + AdditiveShare::new_arr( + BA::from_iter(left).into_array(), + BA::from_iter(right).into_array(), + ) + }) + } + + fn bool_shares_test_matrix( + step: usize, + ) -> [AdditiveShare; M] + where + Boolean: Vectorizable, + { + array::from_fn(|i| { + let mut left = vec![Boolean::FALSE; N]; + let mut right = vec![Boolean::FALSE; N]; + for j in ((i % N)..N).step_by(step) { + let b = Boolean::from(j % 2 != 0); + left[j] = b; + right[j] = !b; + } + AdditiveShare::new_arr( + >::Array::from_iter(left), + >::Array::from_iter(right), + ) + }) + } + // The order of type parameters matches the implementation macro: BA, BA, , pub(super) fn test_transpose_ba_to_ba< DR, // Destination row type @@ -897,11 +957,93 @@ mod tests { let m = repeat_with(|| rng.gen()).take(SM).collect::>(); let m_t = t_impl(<&[SR; SM]>::try_from(m.as_slice()).unwrap()); - for i in 0..DM { - for j in 0..SM { - assert_eq!(m_t[i].get(j), m[j].get(i)); - } - } + verify_transpose(SM, DM, |i, j| m_t[i].get(j), |i, j| m[i].get(j)); + } + + // The order of type parameters matches the implementation macro: BA, , + pub(super) fn test_transpose_shares_ba_to_bool< + SR, // Source row type + const SM: usize, // Source rows (== dest cols) + const DM: usize, // Destination rows (== source cols) + >() + where + Boolean: Vectorizable, + >::Array: ArrayAccess, + SR: SharedValue + + ArrayAccess + + FromIterator + + Vectorizable<1, Array = StdArray>, + [AdditiveShare; DM]: + for<'a> TransposeFrom<&'a [AdditiveShare; SM], Error = Infallible>, + Standard: Distribution, + { + let t_impl = |src| { + let mut dst = [AdditiveShare::::ZERO; DM]; + dst.transpose_from(src).unwrap_infallible(); + dst + }; + + let step = min(SM, DM); + let m = ba_shares_test_matrix::(step); + let m_t = t_impl(&m); + assert_eq!(m_t, bool_shares_test_matrix::(step),); + + let mut left_rng = thread_rng(); + let mut right_rng = thread_rng(); + let m = repeat_with(|| AdditiveShare::from_fns(|_| left_rng.gen(), |_| right_rng.gen())) + .take(SM) + .collect::>(); + let m_t = t_impl(<&[AdditiveShare; SM]>::try_from(m.as_slice()).unwrap()); + + #[rustfmt::skip] + verify_transpose(SM, DM, + |i, j| (m_t[i].left_arr().get(j).unwrap(), m_t[i].right_arr().get(j).unwrap()), + |i, j| (m[i].get(j).unwrap().left(), m[i].get(j).unwrap().right()), + ); + } + + // The order of type parameters matches the implementation macro: BA, , + pub(super) fn test_transpose_shares_ba_fn_to_bool< + SR, // Source row type + const SM: usize, // Source rows (== dest cols) + const DM: usize, // Destination rows (== source cols) + >() + where + Boolean: Vectorizable, + >::Array: ArrayAccess, + SR: SharedValue + + ArrayAccess + + FromIterator + + Vectorizable<1, Array = StdArray>, + [AdditiveShare; DM]: + for<'a> TransposeFrom<&'a dyn Fn(usize) -> AdditiveShare, Error = Infallible>, + Standard: Distribution, + { + let t_impl = |src| { + let mut dst = [AdditiveShare::::ZERO; DM]; + dst.transpose_from(src).unwrap_infallible(); + dst + }; + + let step = min(SM, DM); + let m = ba_shares_test_matrix::(step); + let m_func = |i| AdditiveShare::::clone(&m[i]); + let m_t = t_impl(&m_func); + assert_eq!(m_t, bool_shares_test_matrix::(step),); + + let mut left_rng = thread_rng(); + let mut right_rng = thread_rng(); + let m = repeat_with(|| AdditiveShare::from_fns(|_| left_rng.gen(), |_| right_rng.gen())) + .take(SM) + .collect::>(); + let m_func = |i| AdditiveShare::::clone(&m[i]); + let m_t = t_impl(&m_func); + + #[rustfmt::skip] + verify_transpose(SM, DM, + |i, j| (m_t[i].left_arr().get(j).unwrap(), m_t[i].right_arr().get(j).unwrap()), + |i, j| (m[i].get(j).unwrap().left(), m[i].get(j).unwrap().right()), + ); } // The order of type parameters matches the implementation macro: BA, , @@ -913,7 +1055,10 @@ mod tests { where Boolean: Vectorizable, >::Array: ArrayAccess, - DR: SharedValue + ArrayAccess, + DR: SharedValue + + ArrayAccess + + FromIterator + + Vectorizable<1, Array = StdArray>, [AdditiveShare; DM]: for<'a> TransposeFrom<&'a [AdditiveShare; SM], Error = Infallible>, { @@ -924,31 +1069,9 @@ mod tests { }; let step = min(SM, DM); - let m = array::from_fn(|i| { - let mut left = vec![Boolean::FALSE; DM]; - let mut right = vec![Boolean::FALSE; DM]; - for j in ((i % DM)..DM).step_by(step) { - let b = Boolean::from(j % 2 != 0); - left[j] = b; - right[j] = !b; - } - AdditiveShare::new_arr( - >::Array::from_iter(left), - >::Array::from_iter(right), - ) - }); + let m = bool_shares_test_matrix::(step); let m_t = t_impl(&m); - assert_eq!( - m_t, - array::from_fn(|i| { - let mut v = AdditiveShare::::ZERO; - for j in ((i % SM)..SM).step_by(step) { - let b = Boolean::from(j % 2 != 0); - v.set(j, AdditiveShare::new(b, !b)); - } - v - }) - ); + assert_eq!(m_t, ba_shares_test_matrix::(step),); let mut left_rng = thread_rng(); let mut right_rng = thread_rng(); @@ -957,18 +1080,11 @@ mod tests { .collect::>(); let m_t = t_impl(<&[AdditiveShare; SM]>::try_from(m.as_slice()).unwrap()); - for i in 0..DM { - for j in 0..SM { - assert_eq!( - m_t[i].get(j).unwrap().left(), - m[j].left_arr().get(i).unwrap() - ); - assert_eq!( - m_t[i].get(j).unwrap().right(), - m[j].right_arr().get(i).unwrap() - ); - } - } + #[rustfmt::skip] + verify_transpose(SM, DM, + |i, j| (m_t[i].get(j).unwrap().left(), m_t[i].get(j).unwrap().right()), + |i, j| (m[i].left_arr().get(j).unwrap(), m[i].right_arr().get(j).unwrap()), + ); } pub(super) fn test_transpose_shares_bool_to_bool< @@ -990,36 +1106,9 @@ mod tests { }; let step = min(SM, DM); - let m = array::from_fn(|i| { - let mut left = vec![Boolean::FALSE; DM]; - let mut right = vec![Boolean::FALSE; DM]; - for j in ((i % DM)..DM).step_by(step) { - let b = Boolean::from(j % 2 != 0); - left[j] = b; - right[j] = !b; - } - AdditiveShare::new_arr( - >::Array::from_iter(left), - >::Array::from_iter(right), - ) - }); + let m = bool_shares_test_matrix::(step); let m_t = t_impl(&m); - assert_eq!( - m_t, - array::from_fn(|i| { - let mut left = vec![Boolean::FALSE; SM]; - let mut right = vec![Boolean::FALSE; SM]; - for j in ((i % SM)..SM).step_by(step) { - let b = Boolean::from(j % 2 != 0); - left[j] = b; - right[j] = !b; - } - AdditiveShare::new_arr( - >::Array::from_iter(left), - >::Array::from_iter(right), - ) - }) - ); + assert_eq!(m_t, bool_shares_test_matrix::(step)); let mut left_rng = thread_rng(); let mut right_rng = thread_rng(); @@ -1028,17 +1117,10 @@ mod tests { .collect::>(); let m_t = t_impl(<&[AdditiveShare; SM]>::try_from(m.as_slice()).unwrap()); - for i in 0..DM { - for j in 0..SM { - assert_eq!( - m_t[i].left_arr().get(j).unwrap(), - m[j].left_arr().get(i).unwrap() - ); - assert_eq!( - m_t[i].right_arr().get(j).unwrap(), - m[j].right_arr().get(i).unwrap() - ); - } - } + #[rustfmt::skip] + verify_transpose(SM, DM, + |i, j| (m_t[i].left_arr().get(j).unwrap(), m_t[i].right_arr().get(j).unwrap()), + |i, j| (m[i].left_arr().get(j).unwrap(), m[i].right_arr().get(j).unwrap()), + ); } } From de5157ade722dcad07d54d8270c42771136f4742 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Tue, 19 Mar 2024 17:17:15 -0700 Subject: [PATCH 109/135] CI fixes --- ipa-core/src/protocol/context/validator.rs | 14 +- .../boolean_ops/share_conversion_aby.rs | 12 +- ipa-core/src/protocol/step/steps.txt | 292 +++++++++++++++++- 3 files changed, 297 insertions(+), 21 deletions(-) diff --git a/ipa-core/src/protocol/context/validator.rs b/ipa-core/src/protocol/context/validator.rs index 2a3ab6a73..ca67c1b16 100644 --- a/ipa-core/src/protocol/context/validator.rs +++ b/ipa-core/src/protocol/context/validator.rs @@ -14,15 +14,10 @@ use crate::{ prss::SharedRandomness, RecordId, }, - secret_sharing::{ - replicated::{ - malicious::{ - AdditiveShare as MaliciousReplicated, DowngradeMalicious, ExtendableField, - }, - semi_honest::AdditiveShare as Replicated, - ReplicatedSecretSharing, - }, - SharedValue, + secret_sharing::replicated::{ + malicious::{AdditiveShare as MaliciousReplicated, DowngradeMalicious, ExtendableField}, + semi_honest::AdditiveShare as Replicated, + ReplicatedSecretSharing, }, sharding::ShardBinding, sync::{Mutex, Weak}, @@ -33,6 +28,7 @@ use crate::{ protocol::basics::Reveal, protocol::context::Context, protocol::context::{MaliciousContext, UpgradedMaliciousContext}, + secret_sharing::SharedValue, sync::Arc, }; diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs index e31698870..162df3b2e 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs @@ -349,19 +349,9 @@ mod tests { use super::*; use crate::{ - ff::{ - boolean::Boolean, - boolean_array::{BA256, BA64}, - ec_prime_field::Fp25519, - ArrayAccess, Serializable, - }, + ff::{boolean_array::BA64, Serializable}, helpers::stream::{ProcessChunks, TryFlattenItersExt}, - protocol::{ - context::Context, - ipa_prf::boolean_ops::share_conversion_aby::{convert_to_fp25519, expand_array}, - }, rand::thread_rng, - secret_sharing::{SharedValue, TransposeFrom}, seq_join::{seq_join, SeqJoin}, test_executor::run, test_fixture::{ReconstructArr, Runner, TestWorld}, diff --git a/ipa-core/src/protocol/step/steps.txt b/ipa-core/src/protocol/step/steps.txt index 8bffb0fb6..5d233d7ef 100644 --- a/ipa-core/src/protocol/step/steps.txt +++ b/ipa-core/src/protocol/step/steps.txt @@ -515,7 +515,262 @@ ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol: ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::integer_add_mask_to_x/ipa_core::protocol::step::BitOpStep::bit97 ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::integer_add_mask_to_x/ipa_core::protocol::step::BitOpStep::bit98 ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::integer_add_mask_to_x/ipa_core::protocol::step::BitOpStep::bit99 -ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y0 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y1 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y10 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y100 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y101 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y102 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y103 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y104 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y105 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y106 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y107 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y108 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y109 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y11 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y110 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y111 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y112 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y113 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y114 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y115 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y116 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y117 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y118 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y119 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y12 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y120 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y121 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y122 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y123 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y124 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y125 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y126 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y127 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y128 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y129 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y13 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y130 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y131 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y132 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y133 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y134 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y135 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y136 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y137 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y138 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y139 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y14 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y140 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y141 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y142 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y143 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y144 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y145 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y146 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y147 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y148 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y149 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y15 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y150 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y151 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y152 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y153 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y154 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y155 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y156 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y157 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y158 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y159 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y16 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y160 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y161 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y162 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y163 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y164 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y165 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y166 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y167 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y168 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y169 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y17 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y170 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y171 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y172 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y173 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y174 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y175 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y176 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y177 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y178 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y179 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y18 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y180 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y181 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y182 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y183 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y184 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y185 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y186 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y187 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y188 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y189 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y19 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y190 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y191 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y192 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y193 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y194 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y195 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y196 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y197 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y198 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y199 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y2 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y20 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y200 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y201 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y202 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y203 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y204 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y205 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y206 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y207 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y208 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y209 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y21 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y210 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y211 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y212 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y213 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y214 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y215 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y216 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y217 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y218 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y219 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y22 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y220 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y221 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y222 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y223 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y224 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y225 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y226 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y227 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y228 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y229 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y23 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y230 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y231 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y232 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y233 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y234 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y235 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y236 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y237 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y238 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y239 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y24 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y240 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y241 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y242 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y243 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y244 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y245 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y246 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y247 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y248 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y249 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y25 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y250 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y251 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y252 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y253 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y254 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y255 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y26 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y27 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y28 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y29 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y3 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y30 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y31 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y32 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y33 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y34 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y35 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y36 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y37 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y38 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y39 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y4 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y40 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y41 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y42 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y43 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y44 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y45 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y46 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y47 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y48 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y49 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y5 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y50 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y51 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y52 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y53 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y54 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y55 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y56 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y57 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y58 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y59 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y6 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y60 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y61 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y62 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y63 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y64 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y65 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y66 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y67 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y68 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y69 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y7 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y70 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y71 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y72 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y73 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y74 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y75 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y76 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y77 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y78 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y79 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y8 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y80 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y81 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y82 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y83 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y84 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y85 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y86 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y87 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y88 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y89 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y9 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y90 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y91 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y92 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y93 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y94 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y95 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y96 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y97 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y98 +ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::boolean_ops::share_conversion_aby::Step::reveal_y99 ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::convert_fp25519/ipa_core::protocol::ipa_prf::prf_eval::Step::p_r_f_key_gen ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::eval_prf ipa_core::protocol::ipa_prf::Step::convert_input_rows_to_prf/ipa_core::protocol::ipa_prf::Step::eval_prf/ipa_core::protocol::ipa_prf::prf_eval::Step::gen_random_mask @@ -708,7 +963,42 @@ ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass13/ipa_core::protocol::ipa_prf::quicksort::Step::reveal ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14 ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit0 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit1 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit10 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit11 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit12 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit13 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit14 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit15 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit16 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit17 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit18 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit19 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit2 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit20 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit21 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit22 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit23 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit24 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit25 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit26 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit27 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit28 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit29 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit3 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit30 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit31 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit4 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit5 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit6 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit7 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit8 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit9 ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass14/ipa_core::protocol::ipa_prf::quicksort::Step::reveal +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass15 +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass15/ipa_core::protocol::ipa_prf::quicksort::Step::compare +ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass15/ipa_core::protocol::ipa_prf::quicksort::Step::reveal ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass2 ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass2/ipa_core::protocol::ipa_prf::quicksort::Step::compare ipa_core::protocol::ipa_prf::Step::sort_by_timestamp/ipa_core::protocol::ipa_prf::quicksort::Step::quicksort_pass2/ipa_core::protocol::ipa_prf::quicksort::Step::compare/ipa_core::protocol::step::BitOpStep::bit0 From 2c24e7fe1ace6411cf43104078a4ded771b6958a Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Wed, 20 Mar 2024 14:42:16 -0700 Subject: [PATCH 110/135] Remove an unused function --- .../secret_sharing/replicated/semi_honest/additive_share.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs index 93bda118e..55c5fbe2f 100644 --- a/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs +++ b/ipa-core/src/secret_sharing/replicated/semi_honest/additive_share.rs @@ -113,11 +113,6 @@ impl, const N: usize> AdditiveShare { &mut self.1 } - pub fn into_arr_tuple(self) -> (>::Array, >::Array) { - let Self(left, right) = self; - (left, right) - } - pub fn from_fns V, RF: FnMut(usize) -> V>(lf: LF, rf: RF) -> Self { Self( >::Array::from_fn(lf), From f753cae2a31d3fb6bd7b3daaf8da70166584a175 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 4 Apr 2024 09:44:25 -0700 Subject: [PATCH 111/135] Safety check for share conversion input size --- .../src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs index 162df3b2e..fdd792275 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs @@ -133,6 +133,9 @@ where // in the source of this function -- it is behind the XS and YS parameters.) const BITS: usize = 256; + // Ensure that the probability of leaking information is less than 1/(2^128). + debug_assert!(x.iter().count() < (BITS - 128)); + // generate sh_r = (0, 0, sh_r) and sh_s = (sh_s, 0, 0) // the two highest bits are set to 0 to allow carries for two additions let (sh_r, sh_s) = From 89050eb1d3f920e63b9f147d9097b5faf0eddd06 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 4 Apr 2024 10:54:25 -0700 Subject: [PATCH 112/135] Update github actions to resolve node16 EOL warnings --- .github/workflows/audit.yml | 2 +- .github/workflows/check.yml | 6 +++--- .github/workflows/docker.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index 048226758..1a2dc1b76 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -22,7 +22,7 @@ jobs: pull-requests: read contents: read steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: cargo audit run: | diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 195ad733f..3572e6e23 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -38,7 +38,7 @@ jobs: with: components: clippy,rustfmt - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ @@ -89,7 +89,7 @@ jobs: with: components: clippy,rustfmt - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ @@ -123,7 +123,7 @@ jobs: with: components: clippy,rustfmt - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index bb1f546d2..e8355908a 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: "Checkout" - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: "Setup Docker Buildx" uses: docker/setup-buildx-action@v2 From b4f5f6524ab784361a70b9f6a7b286cbfc13fd34 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 4 Apr 2024 12:06:53 -0700 Subject: [PATCH 113/135] Tidy various vectorized impls --- ipa-core/src/ff/boolean_array.rs | 5 +- ipa-core/src/ff/ec_prime_field.rs | 33 +-- ipa-core/src/lib.rs | 20 ++ .../boolean_ops/share_conversion_aby.rs | 16 -- ipa-core/src/protocol/ipa_prf/mod.rs | 41 +-- ipa-core/src/secret_sharing/decomposed.rs | 7 + ipa-core/src/secret_sharing/vector/array.rs | 13 +- ipa-core/src/secret_sharing/vector/impls.rs | 32 +-- .../src/secret_sharing/vector/transpose.rs | 262 +++--------------- 9 files changed, 131 insertions(+), 298 deletions(-) diff --git a/ipa-core/src/ff/boolean_array.rs b/ipa-core/src/ff/boolean_array.rs index 8b421098b..1408660e4 100644 --- a/ipa-core/src/ff/boolean_array.rs +++ b/ipa-core/src/ff/boolean_array.rs @@ -215,8 +215,9 @@ macro_rules! impl_serializable_trait { }; ($name: ident, $bits: tt, $store: ty, infallible) => { - const _SAFEGUARD: () = assert!( - $bits % 8 == 0, + $crate::const_assert_eq!( + $bits % 8, + 0, "Infallible deserialization is defined for lengths that are multiples of 8 only" ); diff --git a/ipa-core/src/ff/ec_prime_field.rs b/ipa-core/src/ff/ec_prime_field.rs index 9f85b949a..29d7964e0 100644 --- a/ipa-core/src/ff/ec_prime_field.rs +++ b/ipa-core/src/ff/ec_prime_field.rs @@ -7,7 +7,10 @@ use typenum::{U2, U32}; use crate::{ ff::{boolean_array::BA256, Expand, Field, Serializable}, impl_shared_value_common, - protocol::prss::{FromPrss, FromRandom, PrssIndex, SharedRandomness}, + protocol::{ + ipa_prf::PRF_CHUNK, + prss::{FromPrss, FromRandom, PrssIndex, SharedRandomness}, + }, secret_sharing::{ replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, Block, FieldVectorizable, SharedValue, StdArray, Vectorizable, @@ -202,28 +205,12 @@ impl FieldVectorizable<1> for Fp25519 { type ArrayAlias = StdArray; } -impl Vectorizable<16> for Fp25519 { - type Array = StdArray; -} - -impl FieldVectorizable<16> for Fp25519 { - type ArrayAlias = StdArray; -} - -impl Vectorizable<64> for Fp25519 { - type Array = StdArray; -} - -impl FieldVectorizable<64> for Fp25519 { - type ArrayAlias = StdArray; -} - -impl Vectorizable<256> for Fp25519 { - type Array = StdArray; +impl Vectorizable for Fp25519 { + type Array = StdArray; } -impl FieldVectorizable<256> for Fp25519 { - type ArrayAlias = StdArray; +impl FieldVectorizable for Fp25519 { + type ArrayAlias = StdArray; } impl Field for Fp25519 { @@ -265,9 +252,7 @@ macro_rules! impl_share_from_random { }; } -impl_share_from_random!(16); -impl_share_from_random!(64); -impl_share_from_random!(256); +impl_share_from_random!(PRF_CHUNK); #[cfg(all(test, unit_test))] mod test { diff --git a/ipa-core/src/lib.rs b/ipa-core/src/lib.rs index 784313c85..984ba0f12 100644 --- a/ipa-core/src/lib.rs +++ b/ipa-core/src/lib.rs @@ -145,6 +145,26 @@ pub(crate) mod test_executor { } } +#[macro_export] +macro_rules! const_assert { + ($x:expr $(,)?) => { + const _: () = assert!($x, stringify!($x)); + }; + ($x:expr, $msg:expr $(,)?) => { + const _: () = assert!($x, $msg); + }; +} + +#[macro_export] +macro_rules! const_assert_eq { + ($x:expr, $y:expr $(,)?) => { + $crate::const_assert!($x == $y); + }; + ($x:expr, $y:expr, $msg:expr $(,)?) => { + $crate::const_assert!($x == $y, $msg); + }; +} + macro_rules! mutually_incompatible { ($feature1:literal,$feature2:literal) => { #[cfg(all(feature = $feature1, feature = $feature2))] diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs index fdd792275..b75660d4d 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs @@ -467,28 +467,12 @@ mod tests { test_semi_honest_convert_into_fp25519::(); } - #[test] - fn semi_honest_convert_into_fp25519_vec16() { - test_semi_honest_convert_into_fp25519::( - ); - } - #[test] fn semi_honest_convert_into_fp25519_vec64() { test_semi_honest_convert_into_fp25519::( ); } - #[test] - fn semi_honest_convert_into_fp25519_vec256() { - test_semi_honest_convert_into_fp25519::< - BoolVector!(64, 256), - BoolVector!(256, 256), - 512, - 256, - >(); - } - #[test] fn test_expand() { let mut rng = thread_rng(); diff --git a/ipa-core/src/protocol/ipa_prf/mod.rs b/ipa-core/src/protocol/ipa_prf/mod.rs index 4147c8e27..aa5628c70 100644 --- a/ipa-core/src/protocol/ipa_prf/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/mod.rs @@ -1,4 +1,4 @@ -use std::{array, num::NonZeroU32, ops::Add}; +use std::{array, iter, num::NonZeroU32, ops::Add}; use futures_util::TryStreamExt; use generic_array::{ArrayLength, GenericArray}; @@ -9,8 +9,8 @@ use self::{quicksort::quicksort_ranges_by_key_insecure, shuffle::shuffle_inputs} use crate::{ error::{Error, UnwrapInfallible}, ff::{ - boolean::Boolean, boolean_array::BA64, ArrayBuild, ArrayBuilder, CustomArray, PrimeField, - Serializable, U128Conversions, + boolean::Boolean, boolean_array::BA64, CustomArray, PrimeField, Serializable, + U128Conversions, }, helpers::stream::{ChunkData, ProcessChunks, TryFlattenItersExt}, protocol::{ @@ -42,6 +42,12 @@ mod malicious_security; mod quicksort; mod shuffle; +/// Match key size +pub const MK_BITS: usize = 64; + +/// Vectorization dimension for PRF +pub const PRF_CHUNK: usize = 64; + #[derive(Step)] pub(crate) enum Step { ConvertFp25519, @@ -228,9 +234,7 @@ where F: PrimeField + ExtendableField, Replicated: Serializable, { - const CHUNK: usize = 64; - - let ctx = ctx.set_total_records((input_rows.len() + CHUNK - 1) / CHUNK); + let ctx = ctx.set_total_records((input_rows.len() + PRF_CHUNK - 1) / PRF_CHUNK); let convert_ctx = ctx.narrow(&Step::ConvertFp25519); let eval_ctx = ctx.narrow(&Step::EvalPrf); @@ -239,31 +243,30 @@ where seq_join( ctx.active_work(), input_rows.process_chunks( - move |idx, records: ChunkData<_, CHUNK>| { + move |idx, records: ChunkData<_, PRF_CHUNK>| { let convert_ctx = convert_ctx.clone(); let eval_ctx = eval_ctx.clone(); let prf_key = prf_key.clone(); async move { let record_id = RecordId::from(idx); - let mut match_keys_builder = ::builder(); - for _ in 0..CHUNK { - match_keys_builder.push(Replicated::::ZERO); - } - let mut match_keys = match_keys_builder.build(); - let tmp: &dyn Fn(usize) -> Replicated = - &|i: usize| records[i].match_key.clone(); - match_keys.transpose_from(tmp).unwrap_infallible(); + let input_match_keys: &dyn Fn(usize) -> Replicated = + &|i| records[i].match_key.clone(); + let mut match_keys = iter::empty().collect::(); + match_keys + .transpose_from(input_match_keys) + .unwrap_infallible(); let curve_pts = convert_to_fp25519::< _, - BoolVector!(64, CHUNK), - BoolVector!(256, CHUNK), - CHUNK, + BoolVector!(64, PRF_CHUNK), + BoolVector!(256, PRF_CHUNK), + PRF_CHUNK, >(convert_ctx, record_id, match_keys) .await?; let prf_of_match_keys = - eval_dy_prf::<_, CHUNK>(eval_ctx, record_id, &prf_key, curve_pts).await?; + eval_dy_prf::<_, PRF_CHUNK>(eval_ctx, record_id, &prf_key, curve_pts) + .await?; Ok(array::from_fn(|i| { let OPRFIPAInputRow { diff --git a/ipa-core/src/secret_sharing/decomposed.rs b/ipa-core/src/secret_sharing/decomposed.rs index dc1daed02..e96d8e322 100644 --- a/ipa-core/src/secret_sharing/decomposed.rs +++ b/ipa-core/src/secret_sharing/decomposed.rs @@ -107,6 +107,13 @@ impl BitDecomposed { } } +// Provides BitDecomposed <-> BooleanArray interoperability. Otherwise just use `new`. +impl FromIterator for BitDecomposed { + fn from_iter>(iter: I) -> Self { + Self::new(iter) + } +} + impl BitDecomposed { pub fn resize(&mut self, new_len: usize, value: S) { self.bits.resize(new_len, value); diff --git a/ipa-core/src/secret_sharing/vector/array.rs b/ipa-core/src/secret_sharing/vector/array.rs index 3a099ca86..a5ad37119 100644 --- a/ipa-core/src/secret_sharing/vector/array.rs +++ b/ipa-core/src/secret_sharing/vector/array.rs @@ -6,12 +6,13 @@ use std::{ }; use generic_array::{ArrayLength, GenericArray}; -use typenum::{U128, U16, U256, U32, U512, U64}; +use typenum::{U128, U16, U256, U32, U64}; use crate::{ + const_assert_eq, error::LengthError, ff::{ec_prime_field::Fp25519, Expand, Field, Fp32BitPrime, Serializable}, - protocol::prss::FromRandom, + protocol::{ipa_prf::PRF_CHUNK, prss::FromRandom}, secret_sharing::{FieldArray, Sendable, SharedValue, SharedValueArray}, }; @@ -326,9 +327,13 @@ macro_rules! impl_from_random { }; } -impl_from_random!(Fp25519, 16, U32, 2); +const_assert_eq!( + PRF_CHUNK, + 64, + "Appropriate FromRandom implementation required" +); impl_from_random!(Fp25519, 64, U128, 2); -impl_from_random!(Fp25519, 256, U512, 2); + impl_from_random!(Fp32BitPrime, 32, U32, 1); impl Serializable for StdArray { diff --git a/ipa-core/src/secret_sharing/vector/impls.rs b/ipa-core/src/secret_sharing/vector/impls.rs index 79ee5949f..9fffbc0c3 100644 --- a/ipa-core/src/secret_sharing/vector/impls.rs +++ b/ipa-core/src/secret_sharing/vector/impls.rs @@ -1,25 +1,23 @@ //! Supported vectorizations use crate::{ + const_assert_eq, ff::{ boolean::Boolean, boolean_array::{BA16, BA20, BA256, BA3, BA32, BA5, BA64, BA8}, ec_prime_field::Fp25519, Fp32BitPrime, }, + protocol::ipa_prf::{MK_BITS, PRF_CHUNK}, secret_sharing::{ replicated::semi_honest::AdditiveShare, BitDecomposed, FieldSimd, FieldVectorizable, - ReplicatedSecretSharing, Vectorizable, + ReplicatedSecretSharing, SharedValue, Vectorizable, }, }; impl FieldSimd<32> for Fp32BitPrime {} -impl FieldSimd<16> for Fp25519 {} - -impl FieldSimd<64> for Fp25519 {} - -impl FieldSimd<256> for Fp25519 {} +impl FieldSimd for Fp25519 {} macro_rules! boolean_vector { ($dim:expr, $vec:ty) => { @@ -86,22 +84,24 @@ pub trait BoolVectorTrait { pub struct BoolVectorLookup; +const_assert_eq!( + MK_BITS, + 64, + "Appropriate BoolVectorTrait implementation required" +); impl BoolVectorTrait<64, 1> for BoolVectorLookup { type Share = AdditiveShare; } +const_assert_eq!( + Fp25519::BITS, + 256, + "Appropriate BoolVectorTrait implementation required" +); impl BoolVectorTrait<256, 1> for BoolVectorLookup { type Share = AdditiveShare; } -impl BoolVectorTrait for BoolVectorLookup { - type Share = BitDecomposed>; -} - -impl BoolVectorTrait for BoolVectorLookup { - type Share = BitDecomposed>; -} - -impl BoolVectorTrait for BoolVectorLookup { - type Share = BitDecomposed>; +impl BoolVectorTrait for BoolVectorLookup { + type Share = BitDecomposed>; } diff --git a/ipa-core/src/secret_sharing/vector/transpose.rs b/ipa-core/src/secret_sharing/vector/transpose.rs index 7a43cfd78..9e5e13182 100644 --- a/ipa-core/src/secret_sharing/vector/transpose.rs +++ b/ipa-core/src/secret_sharing/vector/transpose.rs @@ -41,18 +41,40 @@ use std::borrow::Borrow; use std::{array, convert::Infallible}; use crate::{ + const_assert_eq, error::{LengthError, UnwrapInfallible}, ff::{ boolean::Boolean, - boolean_array::{BA16, BA256, BA64}, - ArrayAccess, + boolean_array::{BA256, BA64}, + ec_prime_field::Fp25519, }, + protocol::ipa_prf::{MK_BITS, PRF_CHUNK}, secret_sharing::{ replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, BitDecomposed, SharedValue, StdArray, }, }; +// The following constants are hardcoded in various places throughout this file (including in type +// names like `BA256` where they cannot be substituted directly). +// +// The symbolic names are referenced in a comment adjacent to each use. +const_assert_eq!( + Fp25519::BITS, + 256, + "Appropriate transpose implementations required" +); +const_assert_eq!( + MK_BITS, + 64, + "Appropriate transpose implementations required" +); +const_assert_eq!( + PRF_CHUNK, + 64, + "Appropriate transpose implementations required" +); + /// Trait for overwriting a value with the transpose of a source value. pub trait TransposeFrom { type Error; @@ -153,8 +175,12 @@ pub fn transpose_16x16(src: &[u8; 32]) -> [u8; 32] { dst } -// Degenerate transposes. +// Degenerate transposes +// +// These can be particularly confusing, because an Mx1 matrix may be stored as a `BA{M}` rather +// than a `[Boolean; M]`. +// Usage: Share conversion input (convert_to_fp25519 test). M = PRF_CHUNK, N = MK_BITS. impl<'a> TransposeFrom<&'a [AdditiveShare; 1]> for AdditiveShare { type Error = Infallible; fn transpose_from(&mut self, src: &'a [AdditiveShare; 1]) -> Result<(), Infallible> { @@ -163,20 +189,7 @@ impl<'a> TransposeFrom<&'a [AdditiveShare; 1]> for AdditiveShare } } -impl TransposeFrom>> for AdditiveShare { - type Error = LengthError; - fn transpose_from(&mut self, mut src: Vec>) -> Result<(), LengthError> { - if src.len() != 1 { - return Err(LengthError { - expected: 1, - actual: src.len(), - }); - } - *self = src.remove(0); - Ok(()) - } -} - +// Usage: Share conversion output (r/s). M = Fp25519::BITS, N = PRF_CHUNK. impl<'a> TransposeFrom<&'a AdditiveShare> for Vec> { type Error = Infallible; fn transpose_from(&mut self, src: &'a AdditiveShare) -> Result<(), Infallible> { @@ -185,24 +198,7 @@ impl<'a> TransposeFrom<&'a AdditiveShare> for Vec } } -impl TransposeFrom> for Vec> { - type Error = Infallible; - - fn transpose_from(&mut self, src: AdditiveShare) -> Result<(), Infallible> { - *self = vec![src]; - Ok(()) - } -} - -impl TransposeFrom>> for Vec { - type Error = Infallible; - - fn transpose_from(&mut self, src: Vec>) -> Result<(), Infallible> { - *self = vec![src.iter().map(Boolean::from_array).collect::()]; - Ok(()) - } -} - +// Usage: Share conversion output (y). M = Fp25519::BITS, N = PRF_CHUNK. impl<'a> TransposeFrom<&'a [StdArray; 256]> for Vec { type Error = Infallible; fn transpose_from(&mut self, src: &'a [StdArray; 256]) -> Result<(), Infallible> { @@ -211,32 +207,7 @@ impl<'a> TransposeFrom<&'a [StdArray; 256]> for Vec { } } -impl TransposeFrom<&dyn Fn(usize) -> AdditiveShare> for AdditiveShare { - type Error = Infallible; - fn transpose_from( - &mut self, - src: &dyn Fn(usize) -> AdditiveShare, - ) -> Result<(), Infallible> { - *self = src(0); - Ok(()) - } -} - -impl TransposeFrom<&dyn Fn(usize) -> AdditiveShare> - for BitDecomposed> -{ - type Error = Infallible; - fn transpose_from( - &mut self, - src: &dyn Fn(usize) -> AdditiveShare, - ) -> Result<(), Infallible> { - let src = src(0); - *self = BitDecomposed::decompose(64, |i| src.get(i).unwrap()); - Ok(()) - } -} - -// Matrix transposes +// Matrix transpose helpers /// Perform a larger transpose using an 16x16 kernel. /// @@ -325,16 +296,16 @@ macro_rules! impl_transpose_ba_to_ba { }; } -impl_transpose_ba_to_ba!(BA16, BA64, 16, 64, test_transpose_ba_16x64); +// Usage: Transpose benchmark. impl_transpose_ba_to_ba!(BA64, BA64, 64, 64, test_transpose_ba_64x64); -impl_transpose_ba_to_ba!(BA256, BA16, 256, 16, test_transpose_ba_256x16); + +// Usage: Share conversion output (y). M = Fp25519::BITS, N = PRF_CHUNK. impl_transpose_ba_to_ba!(BA256, BA64, 256, 64, test_transpose_ba_256x64); -impl_transpose_ba_to_ba!(BA256, BA256, 256, 256, test_transpose_ba_256x256); /// Implement a transpose of a MxN matrix of secret-shared bits represented as /// `[AdditiveShare; ]` into a NxM bit matrix represented as `[AdditiveShare>; N]`. /// -/// For MxN = 256x64, the invocation looks like `impl_transpose_bool_to_ba!(BA256, 256, 64)`. +/// For MxN = 256x64, the invocation looks like `impl_transpose_shares_bool_to_ba!(BA256, 256, 64)`. macro_rules! impl_transpose_shares_bool_to_ba { ($dst_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident) => { impl TransposeFrom<&[AdditiveShare; $src_rows]> @@ -422,9 +393,8 @@ macro_rules! impl_transpose_shares_bool_to_ba { }; } -impl_transpose_shares_bool_to_ba!(BA256, 256, 16, test_transpose_shares_bool_to_ba_256x16); +// Usage: Share conversion output (r/s). M = Fp25519::BITS, N = PRF_CHUNK. impl_transpose_shares_bool_to_ba!(BA256, 256, 64, test_transpose_shares_bool_to_ba_256x64); -impl_transpose_shares_bool_to_ba!(BA256, 256, 256, test_transpose_shares_bool_to_ba_256x256); /// Implement a transpose of a MxN matrix of secret-shared bits represented as /// `[AdditiveShare>; M]` into a NxM bit matrix represented as `[AdditiveShare; N]`. @@ -530,9 +500,9 @@ macro_rules! impl_transpose_shares_ba_to_bool { }; } -impl_transpose_shares_ba_to_bool!(BA64, 16, 64, test_transpose_shares_ba_to_bool_16x64); +// Usage: Share conversion input (convert_to_fp25519 test). M = PRF_CHUNK, N = MK_BITS. +// Note first macro argument is `BA{N}`, not `BA{M}`. impl_transpose_shares_ba_to_bool!(BA64, 64, 64, test_transpose_shares_ba_to_bool_64x64); -impl_transpose_shares_ba_to_bool!(BA64, 256, 64, test_transpose_shares_ba_to_bool_256x64); /// Implement a transpose of a MxN matrix of secret-shared bits accessed via /// `Fn(usize) -> AdditiveShare` into a NxM bit matrix represented as `[AdditiveShare; N]`. @@ -621,114 +591,9 @@ macro_rules! impl_transpose_shares_ba_fn_to_bool { }; } -impl_transpose_shares_ba_fn_to_bool!(BA64, 16, 64, test_transpose_shares_ba_fn_to_bool_16x64); +// Usage: Share conversion input (compute_prf_for_inputs). M = PRF_CHUNK, N = MK_BITS. +// Note first macro argument is `BA{N}`, not `BA{M}`. impl_transpose_shares_ba_fn_to_bool!(BA64, 64, 64, test_transpose_shares_ba_fn_to_bool_64x64); -impl_transpose_shares_ba_fn_to_bool!(BA64, 256, 64, test_transpose_shares_ba_fn_to_bool_256x64); - -/// Implement a transpose of a MxN matrix of secret-shared bits represented as -/// `[AdditiveShare; ]` into a NxM bit matrix represented as `[AdditiveShare>; N]`. -/// -/// For MxN = 256x64, the invocation looks like `impl_transpose_bool_to_bool!(BA64, 256, 64)`. -macro_rules! impl_transpose_shares_bool_to_bool { - ($src_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident) => { - impl TransposeFrom<&[AdditiveShare; $src_rows]> - for [AdditiveShare; $src_cols] - { - type Error = Infallible; - - fn transpose_from( - &mut self, - src: &[AdditiveShare; $src_rows], - ) -> Result<(), Infallible> { - // Transpose left share - do_transpose_16( - $src_rows / 16, - $src_cols / 16, - |i, j| { - let mut d = [0u8; 32]; - for k in 0..16 { - d[2 * k..2 * (k + 1)].copy_from_slice( - &src[16 * i + k].left_arr().as_raw_slice()[2 * j..2 * (j + 1)], - ); - } - d - }, - |i, j, d| { - for k in 0..16 { - self[16 * i + k].left_arr_mut().as_raw_mut_slice()[2 * j..2 * (j + 1)] - .copy_from_slice(&d[2 * k..2 * (k + 1)]); - } - }, - ); - // Transpose right share - do_transpose_16( - $src_rows / 16, - $src_cols / 16, - |i, j| { - let mut d = [0u8; 32]; - for k in 0..16 { - d[2 * k..2 * (k + 1)].copy_from_slice( - &src[16 * i + k].right_arr().as_raw_slice()[2 * j..2 * (j + 1)], - ); - } - d - }, - |i, j, d| { - for k in 0..16 { - self[16 * i + k].right_arr_mut().as_raw_mut_slice()[2 * j..2 * (j + 1)] - .copy_from_slice(&d[2 * k..2 * (k + 1)]); - } - }, - ); - Ok(()) - } - } - - #[cfg(all(test, unit_test))] - #[test] - fn $test_fn() { - tests::test_transpose_shares_bool_to_bool::<$src_rows, $src_cols>(); - } - - impl TransposeFrom<&[AdditiveShare]> - for BitDecomposed> - { - type Error = LengthError; - fn transpose_from( - &mut self, - src: &[AdditiveShare], - ) -> Result<(), LengthError> { - let src = <&[AdditiveShare; $src_rows]>::try_from(src) - .map_err(|_| LengthError { - expected: $src_rows, - actual: src.len(), - })?; - self.transpose_from(src).unwrap_infallible(); - Ok(()) - } - } - - impl TransposeFrom<&[AdditiveShare; $src_rows]> - for BitDecomposed> - { - type Error = Infallible; - fn transpose_from( - &mut self, - src: &[AdditiveShare; $src_rows], - ) -> Result<(), Infallible> { - self.resize($src_cols, AdditiveShare::::ZERO); - let dst = - <&mut [AdditiveShare; $src_cols]>::try_from(&mut **self) - .unwrap(); - dst.transpose_from(src) - } - } - }; -} - -impl_transpose_shares_bool_to_bool!(BA64, 16, 64, test_transpose_shares_bool_to_bool_16x64); -impl_transpose_shares_bool_to_bool!(BA64, 64, 64, test_transpose_shares_bool_to_bool_64x64); -impl_transpose_shares_bool_to_bool!(BA64, 256, 64, test_transpose_shares_bool_to_bool_256x64); #[cfg(all(test, unit_test))] mod tests { @@ -745,7 +610,7 @@ mod tests { }; use super::*; - use crate::secret_sharing::Vectorizable; + use crate::{ff::ArrayAccess, secret_sharing::Vectorizable}; fn random_array() -> [T; N] where @@ -986,7 +851,7 @@ mod tests { let step = min(SM, DM); let m = ba_shares_test_matrix::(step); let m_t = t_impl(&m); - assert_eq!(m_t, bool_shares_test_matrix::(step),); + assert_eq!(m_t, bool_shares_test_matrix::(step)); let mut left_rng = thread_rng(); let mut right_rng = thread_rng(); @@ -1029,7 +894,7 @@ mod tests { let m = ba_shares_test_matrix::(step); let m_func = |i| AdditiveShare::::clone(&m[i]); let m_t = t_impl(&m_func); - assert_eq!(m_t, bool_shares_test_matrix::(step),); + assert_eq!(m_t, bool_shares_test_matrix::(step)); let mut left_rng = thread_rng(); let mut right_rng = thread_rng(); @@ -1071,7 +936,7 @@ mod tests { let step = min(SM, DM); let m = bool_shares_test_matrix::(step); let m_t = t_impl(&m); - assert_eq!(m_t, ba_shares_test_matrix::(step),); + assert_eq!(m_t, ba_shares_test_matrix::(step)); let mut left_rng = thread_rng(); let mut right_rng = thread_rng(); @@ -1086,41 +951,4 @@ mod tests { |i, j| (m[i].left_arr().get(j).unwrap(), m[i].right_arr().get(j).unwrap()), ); } - - pub(super) fn test_transpose_shares_bool_to_bool< - const SM: usize, // Source rows (== dest cols) - const DM: usize, // Destination rows (== source cols) - >() - where - Boolean: Vectorizable, - >::Array: ArrayAccess, - Boolean: Vectorizable, - >::Array: ArrayAccess, - [AdditiveShare; DM]: - for<'a> TransposeFrom<&'a [AdditiveShare; SM], Error = Infallible>, - { - let t_impl = |src| { - let mut dst = [AdditiveShare::::ZERO; DM]; - dst.transpose_from(src).unwrap_infallible(); - dst - }; - - let step = min(SM, DM); - let m = bool_shares_test_matrix::(step); - let m_t = t_impl(&m); - assert_eq!(m_t, bool_shares_test_matrix::(step)); - - let mut left_rng = thread_rng(); - let mut right_rng = thread_rng(); - let m = repeat_with(|| AdditiveShare::from_fns(|_| left_rng.gen(), |_| right_rng.gen())) - .take(SM) - .collect::>(); - let m_t = t_impl(<&[AdditiveShare; SM]>::try_from(m.as_slice()).unwrap()); - - #[rustfmt::skip] - verify_transpose(SM, DM, - |i, j| (m_t[i].left_arr().get(j).unwrap(), m_t[i].right_arr().get(j).unwrap()), - |i, j| (m[i].left_arr().get(j).unwrap(), m[i].right_arr().get(j).unwrap()), - ); - } } From a082a24b8e88b7dd5b9e0b177c4ef02eeccbc8ec Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 4 Apr 2024 12:53:19 -0700 Subject: [PATCH 114/135] Remove one more unused transpose impl --- .../src/secret_sharing/vector/transpose.rs | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/ipa-core/src/secret_sharing/vector/transpose.rs b/ipa-core/src/secret_sharing/vector/transpose.rs index 9e5e13182..d17a21b69 100644 --- a/ipa-core/src/secret_sharing/vector/transpose.rs +++ b/ipa-core/src/secret_sharing/vector/transpose.rs @@ -475,28 +475,6 @@ macro_rules! impl_transpose_shares_ba_to_bool { dst.transpose_from(src) } } - - impl TransposeFrom>> - for BitDecomposed> - { - type Error = LengthError; - fn transpose_from( - &mut self, - src: Vec>, - ) -> Result<(), LengthError> { - self.resize($src_cols, AdditiveShare::::ZERO); - let src = <&[AdditiveShare<$src_row>; $src_rows]>::try_from(src.as_slice()) - .map_err(|_| LengthError { - expected: $src_rows, - actual: src.len(), - })?; - let dst = - <&mut [AdditiveShare; $src_cols]>::try_from(&mut **self) - .unwrap(); - dst.transpose_from(src).unwrap_infallible(); - Ok(()) - } - } }; } From 5799798fbaf1efd7eefac340ebcc14eb381cc290 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 4 Apr 2024 13:42:53 -0700 Subject: [PATCH 115/135] One more impl cleanup --- ipa-core/src/ff/curve_points.rs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/ipa-core/src/ff/curve_points.rs b/ipa-core/src/ff/curve_points.rs index 451994360..597673c97 100644 --- a/ipa-core/src/ff/curve_points.rs +++ b/ipa-core/src/ff/curve_points.rs @@ -8,6 +8,7 @@ use typenum::U32; use crate::{ ff::{ec_prime_field::Fp25519, Serializable}, impl_shared_value_common, + protocol::ipa_prf::PRF_CHUNK, secret_sharing::{Block, SharedValue, StdArray, Vectorizable}, }; @@ -42,16 +43,8 @@ impl Vectorizable<1> for RP25519 { type Array = StdArray; } -impl Vectorizable<16> for RP25519 { - type Array = StdArray; -} - -impl Vectorizable<64> for RP25519 { - type Array = StdArray; -} - -impl Vectorizable<256> for RP25519 { - type Array = StdArray; +impl Vectorizable for RP25519 { + type Array = StdArray; } #[derive(thiserror::Error, Debug)] From 535f8a7a6959787e3b73228424db27d07ce46610 Mon Sep 17 00:00:00 2001 From: danielmasny Date: Thu, 4 Apr 2024 18:54:58 -0700 Subject: [PATCH 116/135] add #[allow(clippy::diverging_sub_expression)] --- ipa-core/src/test_fixture/world.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ipa-core/src/test_fixture/world.rs b/ipa-core/src/test_fixture/world.rs index 3cd252fae..654fc811e 100644 --- a/ipa-core/src/test_fixture/world.rs +++ b/ipa-core/src/test_fixture/world.rs @@ -403,6 +403,7 @@ impl Runner> for TestWorld(&'a self, _input: I, _helper_fn: H) -> [O; 3] where I: IntoShares + Send + 'static, @@ -414,6 +415,7 @@ impl Runner> for TestWorld( &'a self, _input: I, From fa79ceefc637b58a52d66b78c667ecb496d7d909 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Thu, 4 Apr 2024 22:31:04 -0700 Subject: [PATCH 117/135] Delete `TransportCallbacks` and use `RequestHandler` trait instead (#992) * Delete `TransportCallbacks` and use `RequestHandler` trait instead See #987 for motivation. I had to decide whether I want to use dynamic dispatch vs clunky HTTP interfaces with another generic parameter propagated through the entire stack. I don't have a conslusive answer which way is better, both have significant downsides. Problems with DD approach that is proposed in this change: * Hard to keep `RequestHandler` trait object safe. No generics for `handle` method, use of `async_trait` etc. That removes the opportunity for some optimizations, namely using a trait to pass data down to the handler. It could be better if HTTP layer just passes the same structs it gets from HTTP layer without an extra conversion that must occur if dynamic dispatch is used. * Non zero-cost abstraction. To get data back from the handler, we have to use the same format, right now it is JSON but I doubt we can do better than binary serialization, which means more work to get the data out. * `Box }/routing.rs | 28 ++- .../src/helpers/transport/stream/axum_body.rs | 6 + .../src/helpers/transport/stream/box_body.rs | 12 +- ipa-core/src/net/client/mod.rs | 157 ++++++------ ipa-core/src/net/http_serde.rs | 73 +++++- .../src/net/server/handlers/query/create.rs | 47 ++-- .../src/net/server/handlers/query/input.rs | 56 +++-- .../src/net/server/handlers/query/prepare.rs | 45 ++-- .../src/net/server/handlers/query/results.rs | 44 ++-- .../src/net/server/handlers/query/status.rs | 37 +-- ipa-core/src/net/test.rs | 19 +- ipa-core/src/net/transport.rs | 130 ++++++---- ipa-core/src/query/executor.rs | 10 +- ipa-core/src/query/processor.rs | 121 ++++----- ipa-core/src/test_fixture/app.rs | 19 +- 28 files changed, 1002 insertions(+), 704 deletions(-) delete mode 100644 ipa-core/src/helpers/transport/callbacks.rs create mode 100644 ipa-core/src/helpers/transport/handler.rs delete mode 100644 ipa-core/src/helpers/transport/in_memory/handlers.rs rename ipa-core/src/helpers/transport/{in_memory => }/routing.rs (64%) diff --git a/ipa-core/src/app.rs b/ipa-core/src/app.rs index e571690a3..0ca99287d 100644 --- a/ipa-core/src/app.rs +++ b/ipa-core/src/app.rs @@ -1,97 +1,76 @@ +use std::sync::Weak; + +use async_trait::async_trait; + use crate::{ helpers::{ - query::{QueryConfig, QueryInput}, - Transport, TransportCallbacks, TransportImpl, + query::{PrepareQuery, QueryConfig, QueryInput}, + routing::{Addr, RouteId}, + ApiError, BodyStream, HandlerBox, HandlerRef, HelperIdentity, HelperResponse, + RequestHandler, Transport, TransportImpl, }, hpke::{KeyPair, KeyRegistry}, protocol::QueryId, - query::{ - NewQueryError, QueryCompletionError, QueryInputError, QueryProcessor, QueryStatus, - QueryStatusError, - }, + query::{NewQueryError, QueryProcessor, QueryStatus}, sync::Arc, }; pub struct Setup { - query_processor: Arc, + query_processor: QueryProcessor, + handler: HandlerRef, } /// The API layer to interact with a helper. #[must_use] pub struct HelperApp { - query_processor: Arc, + inner: Arc, +} + +struct Inner { + query_processor: QueryProcessor, + /// For HTTP implementation this transport is also behind an [`Arc`] which causes double indirection + /// on top of atomics and all fun stuff associated with it. I don't see an easy way to avoid that + /// if we want to keep the implementation leak-free, but one may be aware if this shows up on + /// the flamegraph transport: TransportImpl, } impl Setup { #[must_use] - pub fn new() -> (Self, TransportCallbacks) { + pub fn new() -> (Self, HandlerRef) { Self::with_key_registry(KeyRegistry::empty()) } #[must_use] - pub fn with_key_registry( - key_registry: KeyRegistry, - ) -> (Self, TransportCallbacks) { - let query_processor = Arc::new(QueryProcessor::new(key_registry)); + pub fn with_key_registry(key_registry: KeyRegistry) -> (Self, HandlerRef) { + let query_processor = QueryProcessor::new(key_registry); + let handler = HandlerBox::empty(); let this = Self { - query_processor: Arc::clone(&query_processor), + query_processor, + handler: handler.clone(), }; // TODO: weak reference to query processor to prevent mem leak - (this, Self::callbacks(&query_processor)) + (this, handler) } /// Instantiate [`HelperApp`] by connecting it to the provided transport implementation pub fn connect(self, transport: TransportImpl) -> HelperApp { - HelperApp::new(transport, self.query_processor) - } + let app = Arc::new(Inner { + query_processor: self.query_processor, + transport, + }); + self.handler.set_handler( + Arc::downgrade(&app) as Weak> + ); - /// Create callbacks that tie up query processor and transport. - fn callbacks(query_processor: &Arc) -> TransportCallbacks { - let rqp = Arc::clone(query_processor); - let pqp = Arc::clone(query_processor); - let iqp = Arc::clone(query_processor); - let sqp = Arc::clone(query_processor); - let cqp = Arc::clone(query_processor); - - TransportCallbacks { - receive_query: Box::new(move |transport: TransportImpl, receive_query| { - let processor = Arc::clone(&rqp); - Box::pin(async move { - let r = processor.new_query(transport, receive_query).await?; - - Ok(r.query_id) - }) - }), - prepare_query: Box::new(move |transport: TransportImpl, prepare_query| { - let processor = Arc::clone(&pqp); - Box::pin(async move { processor.prepare(&transport, prepare_query) }) - }), - query_input: Box::new(move |transport: TransportImpl, query_input| { - let processor = Arc::clone(&iqp); - Box::pin(async move { processor.receive_inputs(transport, query_input) }) - }), - query_status: Box::new(move |_transport: TransportImpl, query_id| { - let processor = Arc::clone(&sqp); - Box::pin(async move { processor.query_status(query_id) }) - }), - complete_query: Box::new(move |_transport: TransportImpl, query_id| { - let processor = Arc::clone(&cqp); - Box::pin(async move { processor.complete(query_id).await }) - }), - } + // Handler must be kept inside the app instance. When app is dropped, handler, transport and + // query processor are destroyed. + HelperApp { inner: app } } } impl HelperApp { - pub fn new(transport: TransportImpl, query_processor: Arc) -> Self { - Self { - query_processor, - transport, - } - } - /// Initiates a new query on this helper. In case if query is accepted, the unique [`QueryId`] /// identifier is returned, otherwise an error indicating what went wrong is reported back. /// @@ -99,8 +78,9 @@ impl HelperApp { /// If query is rejected for any reason. pub async fn start_query(&self, query_config: QueryConfig) -> Result { Ok(self + .inner .query_processor - .new_query(Transport::clone_ref(&self.transport), query_config) + .new_query(Transport::clone_ref(&self.inner.transport), query_config) .await? .query_id) } @@ -109,9 +89,11 @@ impl HelperApp { /// /// ## Errors /// Propagates errors from the helper. - pub fn execute_query(&self, input: QueryInput) -> Result<(), Error> { - let transport = ::clone(&self.transport); - self.query_processor.receive_inputs(transport, input)?; + pub fn execute_query(&self, input: QueryInput) -> Result<(), ApiError> { + let transport = ::clone(&self.inner.transport); + self.inner + .query_processor + .receive_inputs(transport, input)?; Ok(()) } @@ -119,28 +101,76 @@ impl HelperApp { /// /// ## Errors /// Propagates errors from the helper. - pub fn query_status(&self, query_id: QueryId) -> Result { - Ok(self.query_processor.query_status(query_id)?) + pub fn query_status(&self, query_id: QueryId) -> Result { + Ok(self.inner.query_processor.query_status(query_id)?) } /// Waits for a query to complete and returns the result. /// /// ## Errors /// Propagates errors from the helper. - pub async fn complete_query(&self, query_id: QueryId) -> Result, Error> { - Ok(self.query_processor.complete(query_id).await?.into_bytes()) + pub async fn complete_query(&self, query_id: QueryId) -> Result, ApiError> { + Ok(self + .inner + .query_processor + .complete(query_id) + .await? + .to_bytes()) } } -/// Union of error types returned by API operations. -#[derive(thiserror::Error, Debug)] -pub enum Error { - #[error(transparent)] - NewQuery(#[from] NewQueryError), - #[error(transparent)] - QueryInput(#[from] QueryInputError), - #[error(transparent)] - QueryCompletion(#[from] QueryCompletionError), - #[error(transparent)] - QueryStatus(#[from] QueryStatusError), +#[async_trait] +impl RequestHandler for Inner { + type Identity = HelperIdentity; + + async fn handle( + &self, + req: Addr, + data: BodyStream, + ) -> Result { + fn ext_query_id(req: &Addr) -> Result { + req.query_id.ok_or_else(|| { + ApiError::BadRequest("Query input is missing query_id argument".into()) + }) + } + + let qp = &self.query_processor; + + Ok(match req.route { + r @ RouteId::Records => { + return Err(ApiError::BadRequest( + format!("{r:?} request must not be handled by query processing flow").into(), + )) + } + RouteId::ReceiveQuery => { + let req = req.into::()?; + HelperResponse::from( + qp.new_query(Transport::clone_ref(&self.transport), req) + .await?, + ) + } + RouteId::PrepareQuery => { + let req = req.into::()?; + HelperResponse::from(qp.prepare(&self.transport, req)?) + } + RouteId::QueryInput => { + let query_id = ext_query_id(&req)?; + HelperResponse::from(qp.receive_inputs( + Transport::clone_ref(&self.transport), + QueryInput { + query_id, + input_stream: data, + }, + )?) + } + RouteId::QueryStatus => { + let query_id = ext_query_id(&req)?; + HelperResponse::from(qp.query_status(query_id)?) + } + RouteId::CompleteQuery => { + let query_id = ext_query_id(&req)?; + HelperResponse::from(qp.complete(query_id).await?) + } + }) + } } diff --git a/ipa-core/src/bin/helper.rs b/ipa-core/src/bin/helper.rs index d0ef0b14d..9ac13f670 100644 --- a/ipa-core/src/bin/helper.rs +++ b/ipa-core/src/bin/helper.rs @@ -131,7 +131,7 @@ async fn server(args: ServerArgs) -> Result<(), BoxError> { }); let key_registry = hpke_registry(mk_encryption.as_ref()).await?; - let (setup, callbacks) = AppSetup::with_key_registry(key_registry); + let (setup, handler) = AppSetup::with_key_registry(key_registry); let server_config = ServerConfig { port: args.port, @@ -155,7 +155,7 @@ async fn server(args: ServerArgs) -> Result<(), BoxError> { server_config, network_config, clients, - callbacks, + Some(handler), ); let _app = setup.connect(transport.clone()); diff --git a/ipa-core/src/helpers/gateway/mod.rs b/ipa-core/src/helpers/gateway/mod.rs index 6c75de9a6..151a920c6 100644 --- a/ipa-core/src/helpers/gateway/mod.rs +++ b/ipa-core/src/helpers/gateway/mod.rs @@ -19,7 +19,8 @@ use crate::{ gateway::{ receive::GatewayReceivers, send::GatewaySenders, transport::RoleResolvingTransport, }, - HelperChannelId, Message, Role, RoleAssignment, RouteId, TotalRecords, Transport, + transport::routing::RouteId, + HelperChannelId, Message, Role, RoleAssignment, TotalRecords, Transport, }, protocol::QueryId, }; diff --git a/ipa-core/src/helpers/gateway/transport.rs b/ipa-core/src/helpers/gateway/transport.rs index 558e44e40..43840ce4a 100644 --- a/ipa-core/src/helpers/gateway/transport.rs +++ b/ipa-core/src/helpers/gateway/transport.rs @@ -3,8 +3,8 @@ use futures::Stream; use crate::{ helpers::{ - NoResourceIdentifier, QueryIdBinding, Role, RoleAssignment, RouteId, RouteParams, - StepBinding, Transport, TransportImpl, + transport::routing::RouteId, NoResourceIdentifier, QueryIdBinding, Role, RoleAssignment, + RouteParams, StepBinding, Transport, TransportImpl, }, protocol::{step::Gate, QueryId}, }; diff --git a/ipa-core/src/helpers/mod.rs b/ipa-core/src/helpers/mod.rs index e39a094cb..e6416b565 100644 --- a/ipa-core/src/helpers/mod.rs +++ b/ipa-core/src/helpers/mod.rs @@ -52,10 +52,10 @@ pub use prss_protocol::negotiate as negotiate_prss; #[cfg(feature = "web-app")] pub use transport::WrappedAxumBodyStream; pub use transport::{ - callbacks::*, query, BodyStream, BytesStream, Identity as TransportIdentity, - LengthDelimitedStream, LogErrors, NoResourceIdentifier, QueryIdBinding, ReceiveRecords, - RecordsStream, RouteId, RouteParams, StepBinding, StreamCollection, StreamKey, Transport, - WrappedBoxBodyStream, + make_owned_handler, query, routing, ApiError, BodyStream, BytesStream, HandlerBox, HandlerRef, + HelperResponse, Identity as TransportIdentity, LengthDelimitedStream, LogErrors, NoQueryId, + NoResourceIdentifier, NoStep, QueryIdBinding, ReceiveRecords, RecordsStream, RequestHandler, + RouteParams, StepBinding, StreamCollection, StreamKey, Transport, WrappedBoxBodyStream, }; #[cfg(feature = "in-memory-infra")] pub use transport::{InMemoryMpcNetwork, InMemoryShardNetwork, InMemoryTransport}; diff --git a/ipa-core/src/helpers/transport/callbacks.rs b/ipa-core/src/helpers/transport/callbacks.rs deleted file mode 100644 index ea32ee005..000000000 --- a/ipa-core/src/helpers/transport/callbacks.rs +++ /dev/null @@ -1,101 +0,0 @@ -use std::{future::Future, pin::Pin}; - -use crate::{ - helpers::query::{PrepareQuery, QueryConfig, QueryInput}, - protocol::QueryId, - query::{ - NewQueryError, PrepareQueryError, ProtocolResult, QueryCompletionError, QueryInputError, - QueryStatus, QueryStatusError, - }, -}; - -/// Macro for defining transport callbacks. -/// -/// Each input definition specifies a callback name, a result type name, and -/// a function signature for the callback. The expansion looks like this: -/// -/// ```ignore -/// pub type ReceiveQueryResult = Pin> + Send>>; -/// -/// /// Called when helper receives a new query request from an external party. -/// pub trait ReceiveQueryCallback: -/// Fn(T, QueryConfig) -> ReceiveQueryResult + Send + Sync {} -/// -/// impl ReceiveQueryCallback for F where -/// F: Fn(T, QueryConfig) -> ReceiveQueryResult + Send + Sync {} -/// ``` -macro_rules! callbacks { - { - $( - $(#[$($attr:meta),+ ])? - ($cb_name:ident, $res_name:ident): async fn($($args:ident),*) -> $result:ty; - )* - } => { - $( - pub type $res_name = Pin + Send>>; - - $(#[$($attr),+ ])? - pub trait $cb_name: Fn($($args),*) -> $res_name + Send + Sync {} - - impl $cb_name for F where - F: Fn($($args),*) -> $res_name + Send + Sync {} - )* - } -} - -callbacks! { - /// Called by clients to initiate a new query. - (ReceiveQueryCallback, ReceiveQueryResult): - async fn(T, QueryConfig) -> Result; - - /// Called by the leader helper to set up followers for a new query. - (PrepareQueryCallback, PrepareQueryResult): - async fn(T, PrepareQuery) -> Result<(), PrepareQueryError>; - - /// Called by clients to deliver query input data. - (QueryInputCallback, QueryInputResult): - async fn(T, QueryInput) -> Result<(), QueryInputError>; - - /// Called by clients to retrieve query status. - (QueryStatusCallback, QueryStatusResult): - async fn(T, QueryId) -> Result; - - /// Called by clients to drive query to completion and retrieve results. - (CompleteQueryCallback, CompleteQueryResult): - async fn(T, QueryId) -> Result, QueryCompletionError>; -} - -pub struct TransportCallbacks { - pub receive_query: Box>, - pub prepare_query: Box>, - pub query_input: Box>, - pub query_status: Box>, - pub complete_query: Box>, -} - -#[cfg(any(test, feature = "in-memory-infra"))] -impl Default for TransportCallbacks { - fn default() -> Self { - // `TransportCallbacks::default()` is commonly used with struct update syntax - // (`..Default::default()`) to fill out the callbacks that aren't relevant to a particular - // test. In that scenario, a call that does occur is "unexpected" in the sense the term - // is used by mocks. - Self { - receive_query: Box::new(move |_, _| { - Box::pin(async { panic!("unexpected call to receive_query") }) - }), - prepare_query: Box::new(move |_, _| { - Box::pin(async { panic!("unexpected call to prepare_query") }) - }), - query_input: Box::new(move |_, _| { - Box::pin(async { panic!("unexpected call to query_input") }) - }), - query_status: Box::new(move |_, _| { - Box::pin(async { panic!("unexpected call to query_status") }) - }), - complete_query: Box::new(move |_, _| { - Box::pin(async { panic!("unexpected call to complete_query") }) - }), - } - } -} diff --git a/ipa-core/src/helpers/transport/handler.rs b/ipa-core/src/helpers/transport/handler.rs new file mode 100644 index 000000000..42981d097 --- /dev/null +++ b/ipa-core/src/helpers/transport/handler.rs @@ -0,0 +1,229 @@ +use std::{fmt::Debug, future::Future, marker::PhantomData}; + +use async_trait::async_trait; +use serde::de::DeserializeOwned; +use serde_json::json; + +use crate::{ + error::BoxError, + helpers::{ + query::PrepareQuery, transport::routing::Addr, BodyStream, HelperIdentity, + TransportIdentity, + }, + query::{ + NewQueryError, PrepareQueryError, ProtocolResult, QueryCompletionError, QueryInputError, + QueryStatus, QueryStatusError, + }, + sync::{Arc, Mutex, Weak}, +}; + +/// Represents some response sent from MPC helper acting on a given request. It is rudimental now +/// because we sent everything as HTTP body, but it could evolve. +/// +/// ## Performance +/// This implementation is far from being optimal. Between HTTP and transport layer, there exists +/// one round of serialization and deserialization to properly represent the types. It is not critical +/// to address, because MPC helpers have to handle a constant number of requests per query. Note +/// that all requests tagged with [`crate::helpers::transport::RouteId::Records`] are not routed +/// through [`RequestHandler`], so there is no penalty. +/// +pub struct HelperResponse { + body: Vec, +} + +/// The lifecycle of request handlers is somewhat complicated. First, to initialize [`Transport`], +/// an instance of [`RequestHandler`] is required upfront. To function properly, each handler must +/// have a reference to transport. +/// +/// This lifecycle is managed through this struct. An empty [`Option`], protected by a mutex +/// is passed over to transport, and it is given a value later, after transport is fully initialized. +pub struct HandlerBox { + /// There is a cyclic dependency between handlers and transport. + /// Handlers use transports to create MPC infrastructure as response to query requests. + /// Transport uses handler to respond to requests. + /// + /// To break this cycle, transport holds a weak reference to the handler and handler + /// uses strong references to transport. + inner: Mutex>>>, +} + +impl Default for HandlerBox { + fn default() -> Self { + Self { + inner: Mutex::new(None), + } + } +} + +impl HandlerBox { + #[must_use] + pub fn empty() -> HandlerRef { + HandlerRef { + inner: Arc::new(Self::default()), + } + } + + pub fn owning_ref(handler: &Arc>) -> HandlerRef { + HandlerRef { + inner: Arc::new(Self { + inner: Mutex::new(Some(Arc::downgrade(handler))), + }), + } + } + + fn set_handler(&self, handler: Weak>) { + let mut guard = self.inner.lock().unwrap(); + assert!(guard.is_none(), "Handler can be set only once"); + *guard = Some(handler); + } + + fn handler(&self) -> Arc> { + self.inner + .lock() + .unwrap() + .as_ref() + .expect("Handler is set") + .upgrade() + .expect("Handler is not destroyed") + } +} + +/// This struct is passed over to [`Transport`] to initialize it. +#[derive(Clone)] +pub struct HandlerRef { + inner: Arc>, +} + +impl HelperResponse { + /// Returns an empty response that indicates that incoming request has been processed successfully + #[must_use] + pub fn ok() -> Self { + Self { body: Vec::new() } + } + + /// Consumes [`Self`] and returns the body of the response. + #[must_use] + pub fn into_body(self) -> Vec { + self.body + } + + /// Attempts to interpret [`Self`] body as JSON-serialized `T`. + /// ## Errors + /// if `T` cannot be deserialized from response body. + pub fn try_into_owned(self) -> Result { + serde_json::from_slice(&self.body) + } +} + +impl From for HelperResponse { + fn from(value: PrepareQuery) -> Self { + let v = serde_json::to_vec(&json!({"query_id": value.query_id})).unwrap(); + Self { body: v } + } +} + +impl From<()> for HelperResponse { + fn from(_value: ()) -> Self { + Self::ok() + } +} + +impl From for HelperResponse { + fn from(value: QueryStatus) -> Self { + let v = serde_json::to_vec(&json!({"status": value})).unwrap(); + Self { body: v } + } +} + +impl> From for HelperResponse { + fn from(value: R) -> Self { + let v = value.as_ref().to_bytes(); + Self { body: v } + } +} + +/// Union of error types returned by API operations. +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error(transparent)] + NewQuery(#[from] NewQueryError), + #[error(transparent)] + QueryInput(#[from] QueryInputError), + #[error(transparent)] + QueryPrepare(#[from] PrepareQueryError), + #[error(transparent)] + QueryCompletion(#[from] QueryCompletionError), + #[error(transparent)] + QueryStatus(#[from] QueryStatusError), + #[error(transparent)] + DeserializationFailure(#[from] serde_json::Error), + #[error("MalformedRequest: {0}")] + BadRequest(BoxError), +} + +/// Trait for custom-handling different request types made against MPC helper parties. +/// There is a limitation for RPITIT that traits can't be made object-safe, hence the use of async_trait +#[async_trait] +pub trait RequestHandler: Send + Sync { + type Identity: TransportIdentity; + /// Handle the incoming request with metadata/headers specified in [`Addr`] and body encoded as + /// [`BodyStream`]. + async fn handle( + &self, + req: Addr, + data: BodyStream, + ) -> Result; +} + +pub fn make_owned_handler<'a, I, F, Fut>(handler: F) -> Arc + 'a> +where + I: TransportIdentity, + F: Fn(Addr, BodyStream) -> Fut + Send + Sync + 'a, + Fut: Future> + Send + 'a, +{ + struct Handler { + inner: F, + phantom: PhantomData, + } + #[async_trait] + impl RequestHandler for Handler + where + I: TransportIdentity, + F: Fn(Addr, BodyStream) -> Fut + Send + Sync, + Fut: Future> + Send, + { + type Identity = I; + + async fn handle( + &self, + req: Addr, + data: BodyStream, + ) -> Result { + (self.inner)(req, data).await + } + } + + Arc::new(Handler { + inner: handler, + phantom: PhantomData, + }) +} + +impl HandlerRef { + pub fn set_handler(&self, handler: Weak>) { + self.inner.set_handler(handler); + } +} + +#[async_trait] +impl RequestHandler for HandlerRef { + type Identity = I; + + async fn handle( + &self, + req: Addr, + data: BodyStream, + ) -> Result { + self.inner.handler().handle(req, data).await + } +} diff --git a/ipa-core/src/helpers/transport/in_memory/handlers.rs b/ipa-core/src/helpers/transport/in_memory/handlers.rs deleted file mode 100644 index 209b9d3e4..000000000 --- a/ipa-core/src/helpers/transport/in_memory/handlers.rs +++ /dev/null @@ -1,92 +0,0 @@ -use std::{collections::HashSet, future::Future}; - -use crate::{ - helpers::{ - query::{PrepareQuery, QueryConfig}, - transport::in_memory::{routing::Addr, transport::Error, InMemoryTransport}, - HelperIdentity, RouteId, Transport, TransportCallbacks, TransportIdentity, - }, - protocol::QueryId, - sharding::ShardIndex, -}; - -/// Trait for in-memory request handlers. MPC handlers need to be able to process query requests, -/// while shard traffic does not need to and therefore does not make use of it. -/// -/// See [`HelperRequestHandler`]. -pub trait RequestHandler: Send { - fn handle( - &mut self, - transport: InMemoryTransport, - addr: Addr, - ) -> impl Future>> + Send; -} - -impl RequestHandler for () { - async fn handle( - &mut self, - _transport: InMemoryTransport, - addr: Addr, - ) -> Result<(), Error> { - panic!( - "Shards can only process {:?} requests, got {:?}", - RouteId::Records, - addr.route - ) - } -} - -/// Handler that keeps track of running queries and -/// routes [`RouteId::PrepareQuery`] and [`RouteId::ReceiveQuery`] requests to the stored -/// callback instance. This handler works for MPC networks, for sharding network see -/// [`RequestHandler`] -pub struct HelperRequestHandler { - active_queries: HashSet, - callbacks: TransportCallbacks>, -} - -impl From>> for HelperRequestHandler { - fn from(callbacks: TransportCallbacks>) -> Self { - Self { - active_queries: HashSet::default(), - callbacks, - } - } -} - -impl RequestHandler for HelperRequestHandler { - async fn handle( - &mut self, - transport: InMemoryTransport, - addr: Addr, - ) -> Result<(), Error> { - let dest = transport.identity(); - match addr.route { - RouteId::ReceiveQuery => { - let qc = addr.into::(); - (self.callbacks.receive_query)(Transport::clone_ref(&transport), qc) - .await - .map(|query_id| { - assert!( - self.active_queries.insert(query_id), - "the same query id {query_id:?} is generated twice" - ); - }) - .map_err(|e| Error::Rejected { - dest, - inner: Box::new(e), - }) - } - RouteId::PrepareQuery => { - let input = addr.into::(); - (self.callbacks.prepare_query)(Transport::clone_ref(&transport), input) - .await - .map_err(|e| Error::Rejected { - dest, - inner: Box::new(e), - }) - } - RouteId::Records => unreachable!(), - } - } -} diff --git a/ipa-core/src/helpers/transport/in_memory/mod.rs b/ipa-core/src/helpers/transport/in_memory/mod.rs index 929deca2d..f3622ed22 100644 --- a/ipa-core/src/helpers/transport/in_memory/mod.rs +++ b/ipa-core/src/helpers/transport/in_memory/mod.rs @@ -1,13 +1,13 @@ -mod handlers; -mod routing; mod sharding; mod transport; +use std::array; + pub use sharding::InMemoryShardNetwork; pub use transport::Setup; use crate::{ - helpers::{transport::in_memory::transport::ListenerSetup, HelperIdentity, TransportCallbacks}, + helpers::{HandlerRef, HelperIdentity}, sync::{Arc, Weak}, }; @@ -21,17 +21,13 @@ pub struct InMemoryMpcNetwork { impl Default for InMemoryMpcNetwork { fn default() -> Self { - Self::new([ - TransportCallbacks::default(), - TransportCallbacks::default(), - TransportCallbacks::default(), - ]) + Self::new(array::from_fn(|_| None)) } } impl InMemoryMpcNetwork { #[must_use] - pub fn new(callbacks: [TransportCallbacks>; 3]) -> Self { + pub fn new(handlers: [Option; 3]) -> Self { let [mut first, mut second, mut third]: [_; 3] = HelperIdentity::make_three().map(Setup::new); @@ -39,10 +35,10 @@ impl InMemoryMpcNetwork { second.connect(&mut third); third.connect(&mut first); - let [cb1, cb2, cb3] = callbacks; + let [h1, h2, h3] = handlers; Self { - transports: [first.start(cb1), second.start(cb2), third.start(cb3)], + transports: [first.start(h1), second.start(h2), third.start(h3)], } } diff --git a/ipa-core/src/helpers/transport/in_memory/sharding.rs b/ipa-core/src/helpers/transport/in_memory/sharding.rs index 597bbd2f7..0700793cc 100644 --- a/ipa-core/src/helpers/transport/in_memory/sharding.rs +++ b/ipa-core/src/helpers/transport/in_memory/sharding.rs @@ -1,6 +1,6 @@ use crate::{ helpers::{ - transport::in_memory::transport::{InMemoryTransport, ListenerSetup, Setup}, + transport::in_memory::transport::{InMemoryTransport, Setup}, HelperIdentity, }, sharding::ShardIndex, @@ -36,7 +36,7 @@ impl InMemoryShardNetwork { shard_connections .into_iter() - .map(|s| tracing::info_span!("", ?h).in_scope(|| s.start(()))) + .map(|s| tracing::info_span!("", ?h).in_scope(|| s.start(None))) .collect::>() .into() }); @@ -74,7 +74,10 @@ mod tests { use tokio_stream::wrappers::ReceiverStream; use crate::{ - helpers::{transport::in_memory::InMemoryShardNetwork, HelperIdentity, RouteId, Transport}, + helpers::{ + transport::{in_memory::InMemoryShardNetwork, routing::RouteId}, + HelperIdentity, Transport, + }, protocol::{step::Gate, QueryId}, sharding::ShardIndex, test_executor::run, diff --git a/ipa-core/src/helpers/transport/in_memory/transport.rs b/ipa-core/src/helpers/transport/in_memory/transport.rs index 97fc45c6b..cb456a599 100644 --- a/ipa-core/src/helpers/transport/in_memory/transport.rs +++ b/ipa-core/src/helpers/transport/in_memory/transport.rs @@ -1,6 +1,5 @@ use std::{ collections::HashMap, - convert, fmt::{Debug, Formatter}, io, pin::Pin, @@ -21,22 +20,19 @@ use tracing::Instrument; use crate::{ error::BoxError, helpers::{ - transport::in_memory::{ - handlers::{HelperRequestHandler, RequestHandler}, - routing::Addr, - }, - HelperIdentity, NoResourceIdentifier, QueryIdBinding, ReceiveRecords, RouteId, RouteParams, - StepBinding, StreamCollection, Transport, TransportIdentity, + transport::routing::{Addr, RouteId}, + ApiError, BodyStream, HandlerRef, HelperResponse, NoResourceIdentifier, QueryIdBinding, + ReceiveRecords, RequestHandler, RouteParams, StepBinding, StreamCollection, Transport, + TransportIdentity, }, protocol::{step::Gate, QueryId}, - sharding::ShardIndex, sync::{Arc, Weak}, }; type Packet = ( Addr, InMemoryStream, - oneshot::Sender>>, + oneshot::Sender>, ); type ConnectionTx = Sender>; type ConnectionRx = Receiver>; @@ -55,6 +51,11 @@ pub enum Error { #[source] inner: BoxError, }, + #[error(transparent)] + DeserializationFailed { + #[from] + inner: serde_json::Error, + }, } /// In-memory implementation of [`Transport`] backed by Tokio mpsc channels. @@ -85,15 +86,10 @@ impl InMemoryTransport { /// out and processes it, the same way as query processor does. That will allow all tasks to be /// created in one place (driver). It does not affect the [`Transport`] interface, /// so I'll leave it as is for now. - fn listen>( - self: &Arc, - mut callbacks: L::Handler, - mut rx: ConnectionRx, - ) { + fn listen(self: &Arc, handler: Option>, mut rx: ConnectionRx) { tokio::spawn( { let streams = self.record_streams.clone(); - let this = Arc::downgrade(self); async move { while let Some((addr, stream, ack)) = rx.recv().await { tracing::trace!("received new message: {addr:?}"); @@ -104,14 +100,27 @@ impl InMemoryTransport { let gate = addr.gate.unwrap(); let from = addr.origin.unwrap(); streams.add_stream((query_id, from, gate), stream); - Ok(()) + Ok(HelperResponse::ok()) } - RouteId::ReceiveQuery | RouteId::PrepareQuery => { - callbacks.handle(Clone::clone(&this), addr).await + RouteId::ReceiveQuery + | RouteId::PrepareQuery + | RouteId::QueryInput + | RouteId::QueryStatus + | RouteId::CompleteQuery => { + handler + .as_ref() + .expect("Handler is set") + .handle( + addr, + BodyStream::from_infallible( + stream.map(Vec::into_boxed_slice), + ), + ) + .await } }; - ack.send(result).unwrap(); + ack.send(result).map_err(|_| "Channel closed").unwrap(); } } } @@ -164,7 +173,7 @@ impl Transport for Weak> { { let this = self.upgrade().unwrap(); let channel = this.get_channel(dest); - let addr = Addr::from_route(this.identity, route); + let addr = Addr::from_route(Some(this.identity), route); let (ack_tx, ack_rx) = oneshot::channel(); channel @@ -179,8 +188,13 @@ impl Transport for Weak> { .map_err(|_recv_error| Error::Rejected { dest, inner: "channel closed".into(), - }) - .and_then(convert::identity) + })? + .map_err(|e| Error::Rejected { + dest, + inner: e.into(), + })?; + + Ok(()) } fn receive>( @@ -283,47 +297,18 @@ impl Setup { .is_none()); } - fn into_active_conn::Handler>>( - self, - callbacks: H, - ) -> (ConnectionTx, Arc>) - where - Self: ListenerSetup, - { - let transport = Arc::new(InMemoryTransport::new(self.identity, self.connections)); - transport.listen::(callbacks.into(), self.rx); - - (self.tx, transport) - } -} - -/// Trait to tie up different transports to the requests handlers they can use inside their -/// listen loop. -pub trait ListenerSetup { - type Identity: TransportIdentity; - type Handler: RequestHandler + 'static; - type Listener; - - fn start>(self, handler: I) -> Self::Listener; -} - -impl ListenerSetup for Setup { - type Identity = HelperIdentity; - type Handler = HelperRequestHandler; - type Listener = Arc>; - - fn start>(self, handler: I) -> Self::Listener { + pub(crate) fn start(self, handler: Option>) -> Arc> { self.into_active_conn(handler).1 } -} -impl ListenerSetup for Setup { - type Identity = ShardIndex; - type Handler = (); - type Listener = Arc>; + fn into_active_conn( + self, + handler: Option>, + ) -> (ConnectionTx, Arc>) { + let transport = Arc::new(InMemoryTransport::new(self.identity, self.connections)); + transport.listen(handler, self.rx); - fn start>(self, handler: I) -> Self::Listener { - self.into_active_conn(handler).1 + (self.tx, transport) } } @@ -331,7 +316,7 @@ impl ListenerSetup for Setup { mod tests { use std::{ collections::HashMap, - convert, io, + io, io::ErrorKind, num::NonZeroUsize, panic::AssertUnwindSafe, @@ -345,15 +330,17 @@ mod tests { use crate::{ ff::{FieldType, Fp31}, helpers::{ - query::{QueryConfig, QueryType::TestMultiply}, - transport::in_memory::{ - transport::{ - Addr, ConnectionTx, Error, InMemoryStream, InMemoryTransport, ListenerSetup, + make_owned_handler, + query::{PrepareQuery, QueryConfig, QueryType::TestMultiply}, + transport::{ + in_memory::{ + transport::{Addr, ConnectionTx, Error, InMemoryStream, InMemoryTransport}, + InMemoryMpcNetwork, Setup, }, - InMemoryMpcNetwork, Setup, + routing::RouteId, }, - HelperIdentity, OrderingSender, RouteId, Transport, TransportCallbacks, - TransportIdentity, + HandlerBox, HelperIdentity, HelperResponse, OrderingSender, Role, RoleAssignment, + Transport, TransportIdentity, }, protocol::{step::Gate, QueryId}, sync::Arc, @@ -368,41 +355,49 @@ mod tests { ) { let (tx, rx) = oneshot::channel(); sender.send((addr, data, tx)).await.unwrap(); - rx.await - .map_err(|_e| Error::Io { + let _ = rx + .await + .map_err(|_e| Error::::Io { inner: io::Error::new(ErrorKind::ConnectionRefused, "channel closed"), }) - .and_then(convert::identity) + .unwrap() .unwrap(); } #[tokio::test] - async fn callback_is_called() { + async fn handler_is_called() { let (signal_tx, signal_rx) = oneshot::channel(); let signal_tx = Arc::new(Mutex::new(Some(signal_tx))); - let (tx, _transport) = - Setup::new(HelperIdentity::ONE).into_active_conn(TransportCallbacks { - receive_query: Box::new(move |_transport, query_config| { - let signal_tx = Arc::clone(&signal_tx); - Box::pin(async move { - // this works because callback is only called once - signal_tx - .lock() - .unwrap() - .take() - .expect("query callback invoked more than once") - .send(query_config) - .unwrap(); - Ok(QueryId) - }) - }), - ..Default::default() - }); + let handler = make_owned_handler(move |addr: Addr, _| { + let signal_tx = Arc::clone(&signal_tx); + async move { + let RouteId::ReceiveQuery = addr.route else { + panic!("unexpected call: {addr:?}") + }; + let query_config = addr.into::().unwrap(); + + // this works because callback is only called once + signal_tx + .lock() + .unwrap() + .take() + .expect("query callback invoked more than once") + .send(query_config) + .unwrap(); + Ok(HelperResponse::from(PrepareQuery { + query_id: QueryId, + config: query_config, + roles: RoleAssignment::try_from([Role::H1, Role::H2, Role::H3]).unwrap(), + })) + } + }); + let (tx, _) = Setup::new(HelperIdentity::ONE) + .into_active_conn(Some(HandlerBox::owning_ref(&handler))); let expected = QueryConfig::new(TestMultiply, FieldType::Fp32BitPrime, 1u32).unwrap(); send_and_ack( &tx, - Addr::from_route(HelperIdentity::TWO, &expected), + Addr::from_route(Some(HelperIdentity::TWO), expected), InMemoryStream::empty(), ) .await; @@ -412,8 +407,7 @@ mod tests { #[tokio::test] async fn receive_not_ready() { - let (tx, transport) = - Setup::new(HelperIdentity::ONE).into_active_conn(TransportCallbacks::default()); + let (tx, transport) = Setup::new(HelperIdentity::ONE).into_active_conn(None); let transport = Arc::downgrade(&transport); let expected = vec![vec![1], vec![2]]; @@ -436,8 +430,7 @@ mod tests { #[tokio::test] async fn receive_ready() { - let (tx, transport) = - Setup::new(HelperIdentity::ONE).into_active_conn(TransportCallbacks::default()); + let (tx, transport) = Setup::new(HelperIdentity::ONE).into_active_conn(None); let expected = vec![vec![1], vec![2]]; send_and_ack( @@ -500,8 +493,8 @@ mod tests { setup1.connect(&mut setup2); - let transport1 = setup1.start(TransportCallbacks::default()); - let transport2 = setup2.start(TransportCallbacks::default()); + let transport1 = setup1.start(None); + let transport2 = setup2.start(None); let transports = HashMap::from([ (HelperIdentity::ONE, Arc::downgrade(&transport1)), (HelperIdentity::TWO, Arc::downgrade(&transport2)), @@ -513,8 +506,7 @@ mod tests { #[tokio::test] async fn panic_if_stream_received_twice() { - let (tx, owned_transport) = - Setup::new(HelperIdentity::ONE).into_active_conn(TransportCallbacks::default()); + let (tx, owned_transport) = Setup::new(HelperIdentity::ONE).into_active_conn(None); let gate = Gate::from(STEP); let (stream_tx, stream_rx) = channel(1); let stream = InMemoryStream::from(stream_rx); diff --git a/ipa-core/src/helpers/transport/mod.rs b/ipa-core/src/helpers/transport/mod.rs index 458e2b5be..23c290388 100644 --- a/ipa-core/src/helpers/transport/mod.rs +++ b/ipa-core/src/helpers/transport/mod.rs @@ -8,13 +8,17 @@ use crate::{ protocol::{step::Gate, QueryId}, }; -pub mod callbacks; +mod handler; #[cfg(feature = "in-memory-infra")] mod in_memory; pub mod query; mod receive; +pub mod routing; mod stream; +pub use handler::{ + make_owned_handler, Error as ApiError, HandlerBox, HandlerRef, HelperResponse, RequestHandler, +}; #[cfg(feature = "in-memory-infra")] pub use in_memory::{InMemoryMpcNetwork, InMemoryShardNetwork, InMemoryTransport}; pub use receive::{LogErrors, ReceiveRecords}; @@ -26,7 +30,7 @@ pub use stream::{ }; use crate::{ - helpers::{Role, TransportIdentity}, + helpers::{transport::routing::RouteId, Role, TransportIdentity}, sharding::ShardIndex, }; @@ -57,13 +61,6 @@ pub struct NoResourceIdentifier; pub struct NoQueryId; pub struct NoStep; -#[derive(Debug, Copy, Clone)] -pub enum RouteId { - Records, - ReceiveQuery, - PrepareQuery, -} - impl ResourceIdentifier for NoResourceIdentifier {} impl ResourceIdentifier for RouteId {} @@ -90,6 +87,9 @@ where Option: From, Option: From, { + // This is not great and definitely not a zero-cost abstraction. We serialize parameters + // here, only to deserialize them again inside the request handler. I am not too worried + // about it as long as the data we serialize is tiny, which is the case right now. type Params: Borrow; fn resource_identifier(&self) -> R; @@ -139,6 +139,26 @@ impl RouteParams for (RouteId, QueryId, Gate) { } } +impl RouteParams for (RouteId, QueryId) { + type Params = &'static str; + + fn resource_identifier(&self) -> RouteId { + self.0 + } + + fn query_id(&self) -> QueryId { + self.1 + } + + fn gate(&self) -> NoStep { + NoStep + } + + fn extra(&self) -> Self::Params { + "" + } +} + /// Transport that supports per-query,per-step channels #[async_trait] pub trait Transport: Clone + Send + Sync + 'static { diff --git a/ipa-core/src/helpers/transport/query/mod.rs b/ipa-core/src/helpers/transport/query/mod.rs index 4d0df9df5..07c3ad922 100644 --- a/ipa-core/src/helpers/transport/query/mod.rs +++ b/ipa-core/src/helpers/transport/query/mod.rs @@ -8,8 +8,8 @@ use serde::{Deserialize, Deserializer, Serialize}; use crate::{ ff::FieldType, helpers::{ - transport::{BodyStream, NoQueryId, NoStep}, - GatewayConfig, RoleAssignment, RouteId, RouteParams, + transport::{routing::RouteId, BodyStream, NoQueryId, NoStep}, + GatewayConfig, RoleAssignment, RouteParams, }, protocol::{step::Step, QueryId}, }; @@ -102,6 +102,26 @@ pub struct PrepareQuery { pub roles: RoleAssignment, } +impl RouteParams for PrepareQuery { + type Params = String; + + fn resource_identifier(&self) -> RouteId { + RouteId::PrepareQuery + } + + fn query_id(&self) -> QueryId { + self.query_id + } + + fn gate(&self) -> NoStep { + NoStep + } + + fn extra(&self) -> Self::Params { + serde_json::to_string(self).unwrap() + } +} + impl RouteParams for &QueryConfig { type Params = String; diff --git a/ipa-core/src/helpers/transport/in_memory/routing.rs b/ipa-core/src/helpers/transport/routing.rs similarity index 64% rename from ipa-core/src/helpers/transport/in_memory/routing.rs rename to ipa-core/src/helpers/transport/routing.rs index 68c5015c0..a8da5200c 100644 --- a/ipa-core/src/helpers/transport/in_memory/routing.rs +++ b/ipa-core/src/helpers/transport/routing.rs @@ -3,24 +3,36 @@ use std::{borrow::Borrow, fmt::Debug}; use serde::de::DeserializeOwned; use crate::{ - helpers::{QueryIdBinding, RouteId, RouteParams, StepBinding, TransportIdentity}, + helpers::{QueryIdBinding, RouteParams, StepBinding, TransportIdentity}, protocol::{step::Gate, QueryId}, }; +// The type of request made to an MPC helper. +#[derive(Debug, Copy, Clone)] +pub enum RouteId { + Records, + ReceiveQuery, + PrepareQuery, + QueryInput, + QueryStatus, + CompleteQuery, +} + /// The header/metadata of the incoming request. #[derive(Debug)] -pub(super) struct Addr { +pub struct Addr { pub route: RouteId, pub origin: Option, pub query_id: Option, pub gate: Option, + // String and not vec for readability pub params: String, } impl Addr { #[allow(clippy::needless_pass_by_value)] // to avoid using double-reference at callsites pub fn from_route>( - origin: I, + origin: Option, route: R, ) -> Self where @@ -29,15 +41,19 @@ impl Addr { { Self { route: route.resource_identifier(), - origin: Some(origin), + origin, query_id: route.query_id().into(), gate: route.gate().into(), params: route.extra().borrow().to_string(), } } - pub fn into(self) -> T { - serde_json::from_str(&self.params).unwrap() + /// Deserializes JSON-encoded request parameters into a client-supplied type `T`. + /// + /// ## Errors + /// If deseserialization fails + pub fn into(self) -> Result { + serde_json::from_str(&self.params) } #[cfg(all(test, unit_test))] diff --git a/ipa-core/src/helpers/transport/stream/axum_body.rs b/ipa-core/src/helpers/transport/stream/axum_body.rs index fec8103b9..f4007cc7f 100644 --- a/ipa-core/src/helpers/transport/stream/axum_body.rs +++ b/ipa-core/src/helpers/transport/stream/axum_body.rs @@ -4,6 +4,7 @@ use std::{ }; use axum::extract::{BodyStream, FromRequest, RequestParts}; +use bytes::Bytes; use futures::{Stream, TryStreamExt}; use hyper::Body; use pin_project::pin_project; @@ -28,6 +29,11 @@ impl WrappedAxumBodyStream { pub(super) fn new_internal(inner: BodyStream) -> Self { Self(inner.map_err(axum::Error::into_inner as fn(axum::Error) -> BoxError)) } + + #[must_use] + pub fn empty() -> Self { + Self::from_body(Bytes::new()) + } } impl Stream for WrappedAxumBodyStream { diff --git a/ipa-core/src/helpers/transport/stream/box_body.rs b/ipa-core/src/helpers/transport/stream/box_body.rs index e51d86f87..aa7a25583 100644 --- a/ipa-core/src/helpers/transport/stream/box_body.rs +++ b/ipa-core/src/helpers/transport/stream/box_body.rs @@ -3,7 +3,8 @@ use std::{ task::{Context, Poll}, }; -use futures::Stream; +use bytes::Bytes; +use futures::{stream::StreamExt, Stream}; use crate::helpers::transport::stream::BoxBytesStream; @@ -16,6 +17,15 @@ impl WrappedBoxBodyStream { pub fn new(inner: axum::extract::BodyStream) -> Self { Self(Box::pin(super::WrappedAxumBodyStream::new_internal(inner))) } + + pub fn from_infallible> + Send + 'static>(input: S) -> Self { + Self(Box::pin(input.map(Bytes::from).map(Ok))) + } + + #[must_use] + pub fn empty() -> Self { + WrappedBoxBodyStream(Box::pin(futures::stream::empty())) + } } impl Stream for WrappedBoxBodyStream { diff --git a/ipa-core/src/net/client/mod.rs b/ipa-core/src/net/client/mod.rs index 67296ba63..795457718 100644 --- a/ipa-core/src/net/client/mod.rs +++ b/ipa-core/src/net/client/mod.rs @@ -431,44 +431,16 @@ pub(crate) mod tests { use crate::{ ff::{FieldType, Fp31}, helpers::{ - query::QueryType::TestMultiply, BytesStream, RoleAssignment, Transport, - TransportCallbacks, MESSAGE_PAYLOAD_SIZE_BYTES, + make_owned_handler, query::QueryType::TestMultiply, BytesStream, HelperResponse, + RequestHandler, RoleAssignment, Transport, MESSAGE_PAYLOAD_SIZE_BYTES, }, - net::{test::TestServer, HttpTransport}, + net::test::TestServer, protocol::step::StepNarrow, query::ProtocolResult, secret_sharing::replicated::semi_honest::AdditiveShare as Replicated, sync::Arc, }; - // This is a kludgy way of working around `TransportCallbacks` not being `Clone`, so - // that tests can run against both HTTP and HTTPS servers with one set. - // - // If the use grows beyond that, it's probably worth doing something more elegant, on the - // TransportCallbacks type itself (references and lifetime parameters, dyn_clone, or make it a - // trait and implement it on an `Arc` type). - fn clone_callbacks( - cb: TransportCallbacks, - ) -> (TransportCallbacks, TransportCallbacks) { - fn wrap(inner: &Arc>) -> TransportCallbacks { - let ri = Arc::clone(inner); - let pi = Arc::clone(inner); - let qi = Arc::clone(inner); - let si = Arc::clone(inner); - let ci = Arc::clone(inner); - TransportCallbacks { - receive_query: Box::new(move |t, req| (ri.receive_query)(t, req)), - prepare_query: Box::new(move |t, req| (pi.prepare_query)(t, req)), - query_input: Box::new(move |t, req| (qi.query_input)(t, req)), - query_status: Box::new(move |t, req| (si.query_status)(t, req)), - complete_query: Box::new(move |t, req| (ci.complete_query)(t, req)), - } - } - - let arc_cb = Arc::new(cb); - (wrap(&arc_cb), wrap(&arc_cb)) - } - #[tokio::test] async fn untrusted_certificate() { const ECHO_DATA: &str = "asdf"; @@ -500,21 +472,18 @@ pub(crate) mod tests { /// Also tests that the same functionality works for both `http` and `https` and all supported /// HTTP versions (HTTP 1.1 and HTTP 2 at the moment) . In order to ensure /// this, the return type of `clientf` must be `Eq + Debug` so that the results can be compared. - async fn test_query_command( + async fn test_query_command( clientf: ClientF, - server_cb: TransportCallbacks>, + server_handler: HandlerF, ) -> ClientOut where ClientOut: Eq + Debug, ClientFut: Future, ClientF: Fn(MpcHelperClient) -> ClientFut, + HandlerF: Fn() -> Arc>, { - let mut cb = server_cb; let mut results = Vec::with_capacity(4); for (use_https, use_http1) in zip([true, false], [true, false]) { - let (cur, next) = clone_callbacks(cb); - cb = next; - let mut test_server_builder = TestServer::builder(); if !use_https { test_server_builder = test_server_builder.disable_https(); @@ -524,12 +493,12 @@ pub(crate) mod tests { test_server_builder = test_server_builder.use_http1(); } - let TestServer { - client: http_client, - .. - } = test_server_builder.with_callbacks(cur).build().await; + let test_server = test_server_builder + .with_request_handler(server_handler()) + .build() + .await; - results.push(clientf(http_client).await); + results.push(clientf(test_server.client).await); } assert!(results.windows(2).all(|slice| slice[0] == slice[1])); @@ -543,7 +512,11 @@ pub(crate) mod tests { let output = test_query_command( |client| async move { client.echo(expected_output).await.unwrap() }, - TransportCallbacks::default(), + || { + make_owned_handler(move |addr, _| async move { + panic!("unexpected call: {addr:?}"); + }) + }, ) .await; assert_eq!(expected_output, &output); @@ -554,16 +527,21 @@ pub(crate) mod tests { let expected_query_id = QueryId; let expected_query_config = QueryConfig::new(TestMultiply, FieldType::Fp31, 1).unwrap(); - let cb = TransportCallbacks { - receive_query: Box::new(move |_transport, query_config| { + let handler = || { + make_owned_handler(move |addr, _| async move { + let query_config = addr.into::().unwrap(); assert_eq!(query_config, expected_query_config); - Box::pin(ready(Ok(expected_query_id))) - }), - ..Default::default() + + Ok(HelperResponse::from(PrepareQuery { + query_id: expected_query_id, + config: query_config, + roles: RoleAssignment::new(HelperIdentity::make_three()), + })) + }) }; let query_id = test_query_command( |client| async move { client.create_query(expected_query_config).await.unwrap() }, - cb, + handler, ) .await; assert_eq!(query_id, expected_query_id); @@ -571,25 +549,31 @@ pub(crate) mod tests { #[tokio::test] async fn prepare() { - let input = PrepareQuery { - query_id: QueryId, - config: QueryConfig::new(TestMultiply, FieldType::Fp31, 1).unwrap(), - roles: RoleAssignment::new(HelperIdentity::make_three()), - }; - let expected_data = input.clone(); - let cb = TransportCallbacks { - prepare_query: Box::new(move |_transport, prepare_query| { - assert_eq!(prepare_query, expected_data); - Box::pin(ready(Ok(()))) - }), - ..Default::default() + let config = QueryConfig::new(TestMultiply, FieldType::Fp31, 1).unwrap(); + let handler = move || { + make_owned_handler(move |addr, _| async move { + let input = PrepareQuery { + query_id: QueryId, + config, + roles: RoleAssignment::new(HelperIdentity::make_three()), + }; + let prepare_query = addr.into::().unwrap(); + assert_eq!(prepare_query, input); + + Ok(HelperResponse::ok()) + }) }; + test_query_command( |client| { - let req = input.clone(); + let req = PrepareQuery { + query_id: QueryId, + config, + roles: RoleAssignment::new(HelperIdentity::make_three()), + }; async move { client.prepare_query(req).await.unwrap() } }, - cb, + handler, ) .await; } @@ -598,15 +582,13 @@ pub(crate) mod tests { async fn input() { let expected_query_id = QueryId; let expected_input = &[8u8; 25]; - let cb = TransportCallbacks { - query_input: Box::new(move |_transport, query_input| { - Box::pin(async move { - assert_eq!(query_input.query_id, expected_query_id); - assert_eq!(&query_input.input_stream.to_vec().await, expected_input); - Ok(()) - }) - }), - ..Default::default() + let handler = move || { + make_owned_handler(move |addr, data| async move { + assert_eq!(addr.query_id, Some(expected_query_id)); + assert_eq!(data.to_vec().await, expected_input); + + Ok(HelperResponse::ok()) + }) }; test_query_command( |client| async move { @@ -616,7 +598,7 @@ pub(crate) mod tests { }; client.query_input(data).await.unwrap(); }, - cb, + handler, ) .await; } @@ -653,25 +635,30 @@ pub(crate) mod tests { #[tokio::test] async fn results() { - let expected_results = Box::new(vec![Replicated::from(( + let expected_results = [ Fp31::try_from(1u128).unwrap(), Fp31::try_from(2u128).unwrap(), - ))]); + ]; let expected_query_id = QueryId; - let raw_results = expected_results.to_vec(); - let cb = TransportCallbacks { - complete_query: Box::new(move |_transport, query_id| { - let results: Box = Box::new(raw_results.clone()); - assert_eq!(query_id, expected_query_id); - Box::pin(ready(Ok(results))) - }), - ..Default::default() + let handler = move || { + make_owned_handler(move |addr, _| async move { + let results: Box = Box::new( + [Replicated::from((expected_results[0], expected_results[1]))].to_vec(), + ); + assert_eq!(addr.query_id, Some(expected_query_id)); + Ok(HelperResponse::from(results)) + }) }; let results = test_query_command( |client| async move { client.query_results(expected_query_id).await.unwrap() }, - cb, + handler, ) .await; - assert_eq!(results.to_vec(), expected_results.into_bytes()); + assert_eq!( + results.to_vec(), + [Replicated::from((expected_results[0], expected_results[1]))] + .to_vec() + .to_bytes() + ); } } diff --git a/ipa-core/src/net/http_serde.rs b/ipa-core/src/net/http_serde.rs index 0606687d2..1c99ef42e 100644 --- a/ipa-core/src/net/http_serde.rs +++ b/ipa-core/src/net/http_serde.rs @@ -180,7 +180,7 @@ pub mod query { use serde::{Deserialize, Serialize}; use crate::{ - helpers::query::QueryConfig, + helpers::{query::QueryConfig, HelperResponse}, net::{ http_serde::query::{QueryConfigQueryParams, BASE_AXUM_PATH}, Error, @@ -231,6 +231,14 @@ pub mod query { pub query_id: QueryId, } + impl TryFrom for ResponseBody { + type Error = serde_json::Error; + + fn try_from(value: HelperResponse) -> Result { + value.try_into_owned() + } + } + pub const AXUM_PATH: &str = "/"; } @@ -465,13 +473,38 @@ pub mod query { use axum::extract::{FromRequest, Path, RequestParts}; use serde::{Deserialize, Serialize}; - use crate::{net::Error, protocol::QueryId, query::QueryStatus}; + use crate::{ + helpers::{routing::RouteId, HelperResponse, NoStep, RouteParams}, + net::Error, + protocol::QueryId, + query::QueryStatus, + }; - #[derive(Debug, Clone)] + #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct Request { pub query_id: QueryId, } + impl RouteParams for Request { + type Params = String; + + fn resource_identifier(&self) -> RouteId { + RouteId::QueryStatus + } + + fn query_id(&self) -> QueryId { + self.query_id + } + + fn gate(&self) -> NoStep { + NoStep + } + + fn extra(&self) -> Self::Params { + serde_json::to_string(self).unwrap() + } + } + impl Request { #[cfg(any(all(test, not(feature = "shuttle")), feature = "cli"))] // needed because client is blocking; remove when non-blocking pub fn new(query_id: QueryId) -> Self { @@ -512,6 +545,12 @@ pub mod query { pub status: QueryStatus, } + impl From for ResponseBody { + fn from(value: HelperResponse) -> Self { + serde_json::from_slice(value.into_body().as_slice()).unwrap() + } + } + pub const AXUM_PATH: &str = "/:query_id"; } @@ -519,13 +558,37 @@ pub mod query { use async_trait::async_trait; use axum::extract::{FromRequest, Path, RequestParts}; - use crate::{net::Error, protocol::QueryId}; + use crate::{ + helpers::{routing::RouteId, NoStep, RouteParams}, + net::Error, + protocol::QueryId, + }; - #[derive(Debug, Clone)] + #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct Request { pub query_id: QueryId, } + impl RouteParams for Request { + type Params = String; + + fn resource_identifier(&self) -> RouteId { + RouteId::CompleteQuery + } + + fn query_id(&self) -> QueryId { + self.query_id + } + + fn gate(&self) -> NoStep { + NoStep + } + + fn extra(&self) -> Self::Params { + serde_json::to_string(self).unwrap() + } + } + impl Request { #[cfg(any(all(test, not(feature = "shuttle")), feature = "cli"))] // needed because client is blocking; remove when non-blocking pub fn new(query_id: QueryId) -> Self { diff --git a/ipa-core/src/net/server/handlers/query/create.rs b/ipa-core/src/net/server/handlers/query/create.rs index 903fbe10f..3fc7bc641 100644 --- a/ipa-core/src/net/server/handlers/query/create.rs +++ b/ipa-core/src/net/server/handlers/query/create.rs @@ -2,7 +2,7 @@ use axum::{routing::post, Extension, Json, Router}; use hyper::StatusCode; use crate::{ - helpers::Transport, + helpers::{ApiError, BodyStream, Transport}, net::{http_serde, Error, HttpTransport}, query::NewQueryError, sync::Arc, @@ -15,9 +15,12 @@ async fn handler( req: http_serde::query::create::Request, ) -> Result, Error> { let transport = Transport::clone_ref(&*transport); - match transport.receive_query(req.query_config).await { - Ok(query_id) => Ok(Json(http_serde::query::create::ResponseBody { query_id })), - Err(err @ NewQueryError::State { .. }) => { + match transport + .dispatch(req.query_config, BodyStream::empty()) + .await + { + Ok(resp) => Ok(Json(resp.try_into()?)), + Err(err @ ApiError::NewQuery(NewQueryError::State { .. })) => { Err(Error::application(StatusCode::CONFLICT, err)) } Err(err) => Err(Error::application(StatusCode::INTERNAL_SERVER_ERROR, err)), @@ -32,7 +35,7 @@ pub fn router(transport: Arc) -> Router { #[cfg(all(test, unit_test))] mod tests { - use std::{future::ready, num::NonZeroU32}; + use std::num::NonZeroU32; use axum::http::Request; use hyper::{ @@ -43,8 +46,10 @@ mod tests { use crate::{ ff::FieldType, helpers::{ - query::{IpaQueryConfig, QueryConfig, QueryType}, - TransportCallbacks, + make_owned_handler, + query::{IpaQueryConfig, PrepareQuery, QueryConfig, QueryType}, + routing::{Addr, RouteId}, + HelperIdentity, HelperResponse, Role, RoleAssignment, }, net::{ http_serde, @@ -55,19 +60,29 @@ mod tests { }; async fn create_test(expected_query_config: QueryConfig) { - let cb = TransportCallbacks { - receive_query: Box::new(move |_transport, query_config| { - assert_eq!(query_config, expected_query_config); - Box::pin(ready(Ok(QueryId))) - }), - ..Default::default() - }; - let TestServer { server, .. } = TestServer::builder().with_callbacks(cb).build().await; + let test_server = TestServer::builder() + .with_request_handler(make_owned_handler( + move |addr: Addr, _| async move { + let RouteId::ReceiveQuery = addr.route else { + panic!("unexpected call"); + }; + + let query_config = addr.into().unwrap(); + assert_eq!(query_config, expected_query_config); + Ok(HelperResponse::from(PrepareQuery { + query_id: QueryId, + config: query_config, + roles: RoleAssignment::try_from([Role::H1, Role::H2, Role::H3]).unwrap(), + })) + }, + )) + .build() + .await; let req = http_serde::query::create::Request::new(expected_query_config); let req = req .try_into_http_request(Scheme::HTTP, Authority::from_static("localhost")) .unwrap(); - let resp = server.handle_req(req).await; + let resp = test_server.server.handle_req(req).await; let status = resp.status(); let body_bytes = hyper::body::to_bytes(resp.into_body()).await.unwrap(); diff --git a/ipa-core/src/net/server/handlers/query/input.rs b/ipa-core/src/net/server/handlers/query/input.rs index f926f4e33..f03418c1a 100644 --- a/ipa-core/src/net/server/handlers/query/input.rs +++ b/ipa-core/src/net/server/handlers/query/input.rs @@ -2,7 +2,7 @@ use axum::{routing::post, Extension, Router}; use hyper::StatusCode; use crate::{ - helpers::Transport, + helpers::{routing::RouteId, Transport}, net::{http_serde, Error, HttpTransport}, sync::Arc, }; @@ -12,10 +12,15 @@ async fn handler( req: http_serde::query::input::Request, ) -> Result<(), Error> { let transport = Transport::clone_ref(&*transport); - transport - .query_input(req.query_input) + let _ = transport + .dispatch( + (RouteId::QueryInput, req.query_input.query_id), + req.query_input.input_stream, + ) .await - .map_err(|e| Error::application(StatusCode::INTERNAL_SERVER_ERROR, e)) + .map_err(|e| Error::application(StatusCode::INTERNAL_SERVER_ERROR, e))?; + + Ok(()) } pub fn router(transport: Arc) -> Router { @@ -26,11 +31,15 @@ pub fn router(transport: Arc) -> Router { #[cfg(all(test, unit_test))] mod tests { + use axum::{http::Request, Extension}; use hyper::{Body, StatusCode}; + use tokio::runtime::Handle; use crate::{ - helpers::{query::QueryInput, BytesStream, TransportCallbacks}, + helpers::{ + make_owned_handler, query::QueryInput, routing::RouteId, BytesStream, HelperResponse, + }, net::{ http_serde, server::handlers::query::{ @@ -42,26 +51,37 @@ mod tests { protocol::QueryId, }; - #[tokio::test] + #[tokio::test(flavor = "multi_thread")] async fn input_test() { let expected_query_id = QueryId; let expected_input = &[4u8; 4]; - let cb = TransportCallbacks { - query_input: Box::new(move |_transport, query_input| { - Box::pin(async move { - assert_eq!(query_input.query_id, expected_query_id); - assert_eq!(&query_input.input_stream.to_vec().await, expected_input); - Ok(()) - }) - }), - ..Default::default() - }; - let TestServer { transport, .. } = TestServer::builder().with_callbacks(cb).build().await; + let req_handler = make_owned_handler(move |addr, data| async move { + let RouteId::QueryInput = addr.route else { + panic!("unexpected call"); + }; + + assert_eq!(addr.query_id, Some(expected_query_id)); + assert_eq!( + tokio::task::block_in_place(move || { + Handle::current().block_on(async move { data.to_vec().await }) + }), + expected_input + ); + + Ok(HelperResponse::ok()) + }); + + let test_server = TestServer::builder() + .with_request_handler(req_handler) + .build() + .await; let req = http_serde::query::input::Request::new(QueryInput { query_id: expected_query_id, input_stream: expected_input.to_vec().into(), }); - handler(Extension(transport), req).await.unwrap(); + handler(Extension(test_server.transport), req) + .await + .unwrap(); } struct OverrideReq { diff --git a/ipa-core/src/net/server/handlers/query/prepare.rs b/ipa-core/src/net/server/handlers/query/prepare.rs index bdb746bed..ceb2f0840 100644 --- a/ipa-core/src/net/server/handlers/query/prepare.rs +++ b/ipa-core/src/net/server/handlers/query/prepare.rs @@ -2,7 +2,8 @@ use axum::{response::IntoResponse, routing::post, Extension, Router}; use hyper::StatusCode; use crate::{ - net::{http_serde, server::ClientIdentity, HttpTransport}, + helpers::{BodyStream, Transport}, + net::{http_serde, server::ClientIdentity, Error, HttpTransport}, query::PrepareQueryError, sync::Arc, }; @@ -13,8 +14,14 @@ async fn handler( transport: Extension>, _: Extension, // require that client is an authenticated helper req: http_serde::query::prepare::Request, -) -> Result<(), PrepareQueryError> { - Arc::clone(&transport).prepare_query(req.data).await +) -> Result<(), Error> { + let transport = Transport::clone_ref(&*transport); + let _ = transport + .dispatch(req.data, BodyStream::empty()) + .await + .map_err(|e| Error::application(StatusCode::INTERNAL_SERVER_ERROR, e))?; + + Ok(()) } impl IntoResponse for PrepareQueryError { @@ -31,7 +38,6 @@ pub fn router(transport: Arc) -> Router { #[cfg(all(test, unit_test))] mod tests { - use std::future::ready; use axum::{http::Request, Extension}; use hyper::{Body, StatusCode}; @@ -39,8 +45,10 @@ mod tests { use crate::{ ff::FieldType, helpers::{ + make_owned_handler, query::{PrepareQuery, QueryConfig, QueryType::TestMultiply}, - HelperIdentity, RoleAssignment, TransportCallbacks, + routing::{Addr, RouteId}, + BodyStream, HelperIdentity, HelperResponse, RoleAssignment, }, net::{ http_serde, @@ -65,17 +73,26 @@ mod tests { roles: RoleAssignment::new(HelperIdentity::make_three()), }); let expected_prepare_query = req.data.clone(); + let test_server = TestServer::builder() + .with_request_handler(make_owned_handler( + move |addr: Addr, _: BodyStream| { + let expected_prepare_query = expected_prepare_query.clone(); + async move { + let RouteId::PrepareQuery = addr.route else { + panic!("unexpected call"); + }; + + let actual_prepare_query = addr.into::().unwrap(); + assert_eq!(actual_prepare_query, expected_prepare_query); + Ok(HelperResponse::ok()) + } + }, + )) + .build() + .await; - let cb = TransportCallbacks { - prepare_query: Box::new(move |_transport, prepare_query| { - assert_eq!(prepare_query, expected_prepare_query); - Box::pin(ready(Ok(()))) - }), - ..Default::default() - }; - let TestServer { transport, .. } = TestServer::builder().with_callbacks(cb).build().await; handler( - Extension(transport), + Extension(test_server.transport), Extension(ClientIdentity(HelperIdentity::TWO)), req.clone(), ) diff --git a/ipa-core/src/net/server/handlers/query/results.rs b/ipa-core/src/net/server/handlers/query/results.rs index cb56e9315..8e6cad2f6 100644 --- a/ipa-core/src/net/server/handlers/query/results.rs +++ b/ipa-core/src/net/server/handlers/query/results.rs @@ -2,7 +2,7 @@ use axum::{routing::get, Extension, Router}; use hyper::StatusCode; use crate::{ - helpers::Transport, + helpers::{BodyStream, Transport}, net::{http_serde, server::Error, HttpTransport}, sync::Arc, }; @@ -14,8 +14,8 @@ async fn handler( ) -> Result, Error> { // TODO: we may be able to stream the response let transport = Transport::clone_ref(&*transport); - match transport.complete_query(req.query_id).await { - Ok(result) => Ok(result.into_bytes()), + match transport.dispatch(req, BodyStream::empty()).await { + Ok(resp) => Ok(resp.into_body()), Err(e) => Err(Error::application(StatusCode::INTERNAL_SERVER_ERROR, e)), } } @@ -28,14 +28,17 @@ pub fn router(transport: Arc) -> Router { #[cfg(all(test, unit_test))] mod tests { - use std::future::ready; use axum::{http::Request, Extension}; use hyper::StatusCode; use crate::{ ff::Fp31, - helpers::TransportCallbacks, + helpers::{ + make_owned_handler, + routing::{Addr, RouteId}, + BodyStream, HelperIdentity, HelperResponse, + }, net::{ http_serde, server::handlers::query::{ @@ -57,18 +60,27 @@ mod tests { ))]); let expected_query_id = QueryId; let raw_results = expected_results.to_vec(); - let cb = TransportCallbacks { - complete_query: Box::new(move |_transport, query_id| { - let results: Box = Box::new(raw_results.clone()); - assert_eq!(query_id, expected_query_id); - Box::pin(ready(Ok(results))) - }), - ..Default::default() - }; - let TestServer { transport, .. } = TestServer::builder().with_callbacks(cb).build().await; + let test_server = TestServer::builder() + .with_request_handler(make_owned_handler( + move |addr: Addr, _: BodyStream| { + let raw_results = raw_results.clone(); + async move { + let RouteId::CompleteQuery = addr.route else { + panic!("unexpected call"); + }; + let results = Box::new(raw_results.clone()) as Box; + assert_eq!(addr.query_id, Some(expected_query_id)); + Ok(HelperResponse::from(results)) + } + }, + )) + .build() + .await; let req = http_serde::query::results::Request::new(QueryId); - let results = handler(Extension(transport), req.clone()).await.unwrap(); - assert_eq!(results, expected_results.into_bytes()); + let results = handler(Extension(test_server.transport), req.clone()) + .await + .unwrap(); + assert_eq!(results, expected_results.to_bytes()); } struct OverrideReq { diff --git a/ipa-core/src/net/server/handlers/query/status.rs b/ipa-core/src/net/server/handlers/query/status.rs index f08a475e9..20eb94318 100644 --- a/ipa-core/src/net/server/handlers/query/status.rs +++ b/ipa-core/src/net/server/handlers/query/status.rs @@ -2,7 +2,7 @@ use axum::{routing::get, Extension, Json, Router}; use hyper::StatusCode; use crate::{ - helpers::Transport, + helpers::{BodyStream, Transport}, net::{http_serde::query::status, server::Error, HttpTransport}, sync::Arc, }; @@ -12,8 +12,8 @@ async fn handler( req: status::Request, ) -> Result, Error> { let transport = Transport::clone_ref(&*transport); - match transport.query_status(req.query_id).await { - Ok(state) => Ok(Json(status::ResponseBody { status: state })), + match transport.dispatch(req, BodyStream::empty()).await { + Ok(state) => Ok(Json(status::ResponseBody::from(state))), Err(e) => Err(Error::application(StatusCode::INTERNAL_SERVER_ERROR, e)), } } @@ -26,13 +26,16 @@ pub fn router(transport: Arc) -> Router { #[cfg(all(test, unit_test))] mod tests { - use std::future::ready; use axum::{http::Request, Extension, Json}; use hyper::StatusCode; use crate::{ - helpers::TransportCallbacks, + helpers::{ + make_owned_handler, + routing::{Addr, RouteId}, + BodyStream, HelperIdentity, HelperResponse, + }, net::{ http_serde, server::handlers::query::{ @@ -49,16 +52,22 @@ mod tests { async fn status_test() { let expected_status = QueryStatus::Running; let expected_query_id = QueryId; - let cb = TransportCallbacks { - query_status: Box::new(move |_transport, query_id| { - assert_eq!(query_id, expected_query_id); - Box::pin(ready(Ok(expected_status))) - }), - ..Default::default() - }; - let TestServer { transport, .. } = TestServer::builder().with_callbacks(cb).build().await; + let test_server = TestServer::builder() + .with_request_handler(make_owned_handler( + move |addr: Addr, _data: BodyStream| async move { + let RouteId::QueryStatus = addr.route else { + panic!("unexpected call"); + }; + assert_eq!(addr.query_id, Some(expected_query_id)); + Ok(HelperResponse::from(expected_status)) + }, + )) + .build() + .await; let req = http_serde::query::status::Request::new(QueryId); - let response = handler(Extension(transport), req.clone()).await.unwrap(); + let response = handler(Extension(test_server.transport), req.clone()) + .await + .unwrap(); let Json(http_serde::query::status::ResponseBody { status }) = response; assert_eq!(status, expected_status); diff --git a/ipa-core/src/net/test.rs b/ipa-core/src/net/test.rs index c66a8d72c..3cd0221b9 100644 --- a/ipa-core/src/net/test.rs +++ b/ipa-core/src/net/test.rs @@ -8,7 +8,6 @@ //! `net::transport::tests`. #![allow(clippy::missing_panics_doc)] - use std::{ array, net::{SocketAddr, TcpListener}, @@ -23,7 +22,7 @@ use crate::{ ClientConfig, HpkeClientConfig, HpkeServerConfig, NetworkConfig, PeerConfig, ServerConfig, TlsConfig, }, - helpers::{HelperIdentity, TransportCallbacks}, + helpers::{HandlerBox, HelperIdentity, RequestHandler}, hpke::{Deserializable as _, IpaPublicKey}, net::{ClientIdentity, HttpTransport, MpcHelperClient, MpcHelperServer}, sync::Arc, @@ -204,14 +203,13 @@ impl TestConfigBuilder { } } -type HttpTransportCallbacks = TransportCallbacks>; - pub struct TestServer { pub addr: SocketAddr, pub handle: JoinHandle<()>, pub transport: Arc, pub server: MpcHelperServer, pub client: MpcHelperClient, + pub request_handler: Option>>, } impl TestServer { @@ -232,7 +230,7 @@ impl TestServer { #[derive(Default)] pub struct TestServerBuilder { - callbacks: Option, + handler: Option>>, metrics: Option, disable_https: bool, use_http1: bool, @@ -241,8 +239,11 @@ pub struct TestServerBuilder { impl TestServerBuilder { #[must_use] - pub fn with_callbacks(mut self, callbacks: HttpTransportCallbacks) -> Self { - self.callbacks = Some(callbacks); + pub fn with_request_handler( + mut self, + handler: Arc>, + ) -> Self { + self.handler = Some(handler); self } @@ -295,12 +296,13 @@ impl TestServerBuilder { panic!("TestConfig should have allocated ports"); }; let clients = MpcHelperClient::from_conf(&network_config, identity.clone()); + let handler = self.handler.as_ref().map(HandlerBox::owning_ref); let (transport, server) = HttpTransport::new( HelperIdentity::ONE, server_config, network_config.clone(), clients, - self.callbacks.unwrap_or_default(), + handler, ); let (addr, handle) = server.start_on(Some(server_socket), self.metrics).await; // Get the config for HelperIdentity::ONE @@ -315,6 +317,7 @@ impl TestServerBuilder { transport, server, client, + request_handler: self.handler, } } } diff --git a/ipa-core/src/net/transport.rs b/ipa-core/src/net/transport.rs index e26c567a1..8e9dbca8e 100644 --- a/ipa-core/src/net/transport.rs +++ b/ipa-core/src/net/transport.rs @@ -8,16 +8,17 @@ use std::{ use async_trait::async_trait; use bytes::Bytes; use futures::{Stream, TryFutureExt}; +use pin_project::{pin_project, pinned_drop}; use crate::{ config::{NetworkConfig, ServerConfig}, error::BoxError, helpers::{ - query::{PrepareQuery, QueryConfig, QueryInput}, - BodyStream, CompleteQueryResult, HelperIdentity, LogErrors, NoResourceIdentifier, - PrepareQueryResult, QueryIdBinding, QueryInputResult, QueryStatusResult, - ReceiveQueryResult, ReceiveRecords, RouteId, RouteParams, StepBinding, StreamCollection, - Transport, TransportCallbacks, + query::QueryConfig, + routing::{Addr, RouteId}, + ApiError, BodyStream, HandlerRef, HelperIdentity, HelperResponse, LogErrors, NoQueryId, + NoResourceIdentifier, NoStep, QueryIdBinding, ReceiveRecords, RequestHandler, RouteParams, + StepBinding, StreamCollection, Transport, }, net::{client::MpcHelperClient, error::Error, MpcHelperServer}, protocol::{step::Gate, QueryId}, @@ -29,11 +30,31 @@ type LogHttpErrors = LogErrors; /// HTTP transport for IPA helper service. pub struct HttpTransport { identity: HelperIdentity, - callbacks: TransportCallbacks>, clients: [MpcHelperClient; 3], // TODO(615): supporting multiple queries likely require a hashmap here. It will be ok if we // only allow one query at a time. record_streams: StreamCollection, + handler: Option, +} + +impl RouteParams for QueryConfig { + type Params = String; + + fn resource_identifier(&self) -> RouteId { + RouteId::ReceiveQuery + } + + fn query_id(&self) -> NoQueryId { + NoQueryId + } + + fn gate(&self) -> NoStep { + NoStep + } + + fn extra(&self) -> Self::Params { + serde_json::to_string(self).unwrap() + } } impl HttpTransport { @@ -43,9 +64,9 @@ impl HttpTransport { server_config: ServerConfig, network_config: NetworkConfig, clients: [MpcHelperClient; 3], - callbacks: TransportCallbacks>, + handler: Option, ) -> (Arc, MpcHelperServer) { - let transport = Self::new_internal(identity, clients, callbacks); + let transport = Self::new_internal(identity, clients, handler); let server = MpcHelperServer::new(Arc::clone(&transport), server_config, network_config); (transport, server) } @@ -53,58 +74,74 @@ impl HttpTransport { fn new_internal( identity: HelperIdentity, clients: [MpcHelperClient; 3], - callbacks: TransportCallbacks>, + handler: Option, ) -> Arc { Arc::new(Self { identity, - callbacks, clients, + handler, record_streams: StreamCollection::default(), }) } - pub fn receive_query(self: Arc, req: QueryConfig) -> ReceiveQueryResult { - (Arc::clone(&self).callbacks.receive_query)(self, req) - } - - pub fn prepare_query(self: Arc, req: PrepareQuery) -> PrepareQueryResult { - (Arc::clone(&self).callbacks.prepare_query)(self, req) - } - - pub fn query_input(self: Arc, req: QueryInput) -> QueryInputResult { - (Arc::clone(&self).callbacks.query_input)(self, req) - } - - pub fn query_status(self: Arc, query_id: QueryId) -> QueryStatusResult { - (Arc::clone(&self).callbacks.query_status)(self, query_id) - } - - pub fn complete_query(self: Arc, query_id: QueryId) -> CompleteQueryResult { + /// Dispatches the given request to the [`RequestHandler`] connected to this transport. + /// + /// ## Errors + /// Returns an error, if handler rejects the request for any reason. + /// + /// ## Panics + /// This will panic if request handler hasn't been previously set for this transport. + pub async fn dispatch>( + self: Arc, + req: R, + body: BodyStream, + ) -> Result + where + Option: From, + { /// Cleans up the `records_stream` collection after drop to ensure this transport /// can process the next query even in case of a panic. - struct ClearOnDrop { + /// + /// This implementation is a poor man's safety net and only works because we run + /// one query at a time and don't use query identifiers. + #[pin_project(PinnedDrop)] + struct ClearOnDrop { transport: Arc, - qr: CompleteQueryResult, + #[pin] + inner: F, } - impl Future for ClearOnDrop { - type Output = ::Output; + impl Future for ClearOnDrop { + type Output = F::Output; - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - self.qr.as_mut().poll(cx) + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + self.project().inner.poll(cx) } } - impl Drop for ClearOnDrop { - fn drop(&mut self) { + #[pinned_drop] + impl PinnedDrop for ClearOnDrop { + fn drop(self: Pin<&mut Self>) { self.transport.record_streams.clear(); } } - Box::pin(ClearOnDrop { - transport: Arc::clone(&self), - qr: Box::pin((Arc::clone(&self).callbacks.complete_query)(self, query_id)), - }) + let route_id = req.resource_identifier(); + let r = self + .handler + .as_ref() + .expect("Handler is set") + .handle(Addr::from_route(None, req), body); + + if let RouteId::CompleteQuery = route_id { + ClearOnDrop { + transport: Arc::clone(&self), + inner: r, + } + .await + } else { + r.await + } } /// Connect an inbound stream of MPC record data. @@ -168,8 +205,13 @@ impl Transport for Arc { let req = serde_json::from_str(route.extra().borrow()).unwrap(); self.clients[dest].prepare_query(req).await } - RouteId::ReceiveQuery => { - unimplemented!("attempting to send ReceiveQuery to another helper") + evt @ (RouteId::QueryInput + | RouteId::ReceiveQuery + | RouteId::QueryStatus + | RouteId::CompleteQuery) => { + unimplemented!( + "attempting to send client-specific request {evt:?} to another helper" + ) } } } @@ -202,7 +244,7 @@ mod tests { use crate::{ config::{NetworkConfig, ServerConfig}, ff::{FieldType, Fp31, Serializable}, - helpers::query::QueryType::TestMultiply, + helpers::query::{QueryInput, QueryType::TestMultiply}, net::{ client::ClientIdentity, test::{get_test_identity, TestConfig, TestConfigBuilder, TestServer}, @@ -272,14 +314,14 @@ mod tests { } else { get_test_identity(id) }; - let (setup, callbacks) = AppSetup::new(); + let (setup, handler) = AppSetup::new(); let clients = MpcHelperClient::from_conf(network_config, identity); let (transport, server) = HttpTransport::new( id, server_config, network_config.clone(), clients, - callbacks, + Some(handler), ); server.start_on(Some(socket), ()).await; diff --git a/ipa-core/src/query/executor.rs b/ipa-core/src/query/executor.rs index b2085980e..c5977e7df 100644 --- a/ipa-core/src/query/executor.rs +++ b/ipa-core/src/query/executor.rs @@ -36,7 +36,7 @@ use crate::{ }; pub trait Result: Send + Debug { - fn into_bytes(self: Box) -> Vec; + fn to_bytes(&self) -> Vec; } impl Result for Vec @@ -44,9 +44,9 @@ where T: Serializable, Vec: Debug + Send, { - fn into_bytes(self: Box) -> Vec { + fn to_bytes(&self) -> Vec { let mut r = vec![0u8; self.len() * T::Size::USIZE]; - for (i, row) in self.into_iter().enumerate() { + for (i, row) in self.iter().enumerate() { row.serialize(GenericArray::from_mut_slice( &mut r[(i * T::Size::USIZE)..((i + 1) * T::Size::USIZE)], )); @@ -156,10 +156,10 @@ mod tests { fn serialize_result() { let [input, ..] = (0u128..=3).map(Fp31::truncate_from).share(); let expected = input.clone(); - let bytes = Box::new(input).into_bytes(); + let bytes = &input.to_bytes(); assert_eq!( expected, - AdditiveShare::::from_byte_slice(&bytes) + AdditiveShare::::from_byte_slice(bytes) .collect::, _>>() .unwrap() ); diff --git a/ipa-core/src/query/processor.rs b/ipa-core/src/query/processor.rs index fb01aa8ac..a003e95ac 100644 --- a/ipa-core/src/query/processor.rs +++ b/ipa-core/src/query/processor.rs @@ -154,8 +154,8 @@ impl Processor { // Inform other parties about new query. If any of them rejects it, this join will fail try_join( - transport.send(left, &prepare_request, stream::empty()), - transport.send(right, &prepare_request, stream::empty()), + transport.send(left, prepare_request.clone(), stream::empty()), + transport.send(right, prepare_request.clone(), stream::empty()), ) .await .map_err(NewQueryError::Transport)?; @@ -204,7 +204,7 @@ impl Processor { /// if query is not registered on this helper. /// /// ## Panics - /// If failed to obtain an exclusive access to the query collection. + /// If failed to obtain exclusive access to the query collection. pub fn receive_inputs( &self, transport: TransportImpl, @@ -278,7 +278,7 @@ impl Processor { /// if query is not registered on this helper. /// /// ## Panics - /// If failed to obtain an exclusive access to the query collection. + /// If failed to obtain exclusive access to the query collection. pub async fn complete( &self, query_id: QueryId, @@ -321,9 +321,10 @@ mod tests { use crate::{ ff::FieldType, helpers::{ + make_owned_handler, query::{PrepareQuery, QueryConfig, QueryType::TestMultiply}, - HelperIdentity, InMemoryMpcNetwork, PrepareQueryCallback, RoleAssignment, Transport, - TransportCallbacks, + ApiError, HandlerBox, HelperIdentity, HelperResponse, InMemoryMpcNetwork, + RequestHandler, RoleAssignment, Transport, }, protocol::QueryId, query::{ @@ -331,12 +332,19 @@ mod tests { }, }; - fn prepare_query_callback(cb: F) -> Box> + fn prepare_query_handler(cb: F) -> Arc> where - F: Fn(T, PrepareQuery) -> Fut + Send + Sync + 'static, - Fut: Future> + Send + 'static, + F: Fn(PrepareQuery) -> Fut + Send + Sync + 'static, + Fut: Future> + Send + Sync + 'static, { - Box::new(move |transport, prepare_query| Box::pin(cb(transport, prepare_query))) + make_owned_handler(move |req, _| { + let prepare_query = req.into().unwrap(); + cb(prepare_query) + }) + } + + fn respond_ok() -> Arc> { + prepare_query_handler(move |_| async move { Ok(HelperResponse::ok()) }) } fn test_multiply_config() -> QueryConfig { @@ -346,29 +354,27 @@ mod tests { #[tokio::test] async fn new_query() { let barrier = Arc::new(Barrier::new(3)); - let cb2_barrier = Arc::clone(&barrier); - let cb3_barrier = Arc::clone(&barrier); - let cb2 = TransportCallbacks { - prepare_query: prepare_query_callback(move |_, _| { - let barrier = Arc::clone(&cb2_barrier); - async move { - barrier.wait().await; - Ok(()) - } - }), - ..Default::default() - }; - let cb3 = TransportCallbacks { - prepare_query: prepare_query_callback(move |_, _| { - let barrier = Arc::clone(&cb3_barrier); - async move { - barrier.wait().await; - Ok(()) - } - }), - ..Default::default() - }; - let network = InMemoryMpcNetwork::new([TransportCallbacks::default(), cb2, cb3]); + let h2_barrier = Arc::clone(&barrier); + let h3_barrier = Arc::clone(&barrier); + let h2 = prepare_query_handler(move |_| { + let barrier = Arc::clone(&h2_barrier); + async move { + barrier.wait().await; + Ok(HelperResponse::ok()) + } + }); + let h3 = prepare_query_handler(move |_| { + let barrier = Arc::clone(&h3_barrier); + async move { + barrier.wait().await; + Ok(HelperResponse::ok()) + } + }); + let network = InMemoryMpcNetwork::new([ + None, + Some(HandlerBox::owning_ref(&h2)), + Some(HandlerBox::owning_ref(&h3)), + ]); let [t0, _, _] = network.transports(); let p0 = Processor::default(); let request = test_multiply_config(); @@ -402,11 +408,10 @@ mod tests { #[tokio::test] async fn rejects_duplicate_query_id() { - let cb = array::from_fn(|_| TransportCallbacks { - prepare_query: prepare_query_callback(|_, _| async { Ok(()) }), - ..Default::default() - }); - let network = InMemoryMpcNetwork::new(cb); + let handlers = + array::from_fn(|_| prepare_query_handler(|_| async { Ok(HelperResponse::ok()) })); + let network = + InMemoryMpcNetwork::new(handlers.each_ref().map(HandlerBox::owning_ref).map(Some)); let [t0, _, _] = network.transports(); let p0 = Processor::default(); let request = test_multiply_config(); @@ -423,17 +428,15 @@ mod tests { #[tokio::test] async fn prepare_error() { - let cb2 = TransportCallbacks { - prepare_query: prepare_query_callback(|_, _| async { Ok(()) }), - ..Default::default() - }; - let cb3 = TransportCallbacks { - prepare_query: prepare_query_callback(|_, _| async { - Err(PrepareQueryError::WrongTarget) - }), - ..Default::default() - }; - let network = InMemoryMpcNetwork::new([TransportCallbacks::default(), cb2, cb3]); + let h2 = respond_ok(); + let h3 = prepare_query_handler(|_| async move { + Err(ApiError::QueryPrepare(PrepareQueryError::WrongTarget)) + }); + let network = InMemoryMpcNetwork::new([ + None, + Some(HandlerBox::owning_ref(&h2)), + Some(HandlerBox::owning_ref(&h3)), + ]); let [t0, _, _] = network.transports(); let p0 = Processor::default(); let request = test_multiply_config(); @@ -446,17 +449,15 @@ mod tests { #[tokio::test] async fn can_recover_from_prepare_error() { - let cb2 = TransportCallbacks { - prepare_query: prepare_query_callback(|_, _| async { Ok(()) }), - ..Default::default() - }; - let cb3 = TransportCallbacks { - prepare_query: prepare_query_callback(|_, _| async { - Err(PrepareQueryError::WrongTarget) - }), - ..Default::default() - }; - let network = InMemoryMpcNetwork::new([TransportCallbacks::default(), cb2, cb3]); + let h2 = respond_ok(); + let h3 = prepare_query_handler(|_| async move { + Err(ApiError::QueryPrepare(PrepareQueryError::WrongTarget)) + }); + let network = InMemoryMpcNetwork::new([ + None, + Some(HandlerBox::owning_ref(&h2)), + Some(HandlerBox::owning_ref(&h3)), + ]); let [t0, _, _] = network.transports(); let p0 = Processor::default(); let request = test_multiply_config(); diff --git a/ipa-core/src/test_fixture/app.rs b/ipa-core/src/test_fixture/app.rs index 6fda9c056..96d09fe59 100644 --- a/ipa-core/src/test_fixture/app.rs +++ b/ipa-core/src/test_fixture/app.rs @@ -1,14 +1,13 @@ -use std::iter::zip; +use std::{array, iter::zip}; use generic_array::GenericArray; use typenum::Unsigned; use crate::{ - app::Error, ff::Serializable, helpers::{ query::{QueryConfig, QueryInput}, - InMemoryMpcNetwork, + ApiError, InMemoryMpcNetwork, }, protocol::QueryId, query::QueryStatus, @@ -60,10 +59,9 @@ fn unzip_tuple_array(input: [(T, U); 3]) -> ([T; 3], [U; 3]) { impl Default for TestApp { fn default() -> Self { - let (setup, callbacks) = - unzip_tuple_array([AppSetup::new(), AppSetup::new(), AppSetup::new()]); + let (setup, handlers) = unzip_tuple_array(array::from_fn(|_| AppSetup::new())); - let network = InMemoryMpcNetwork::new(callbacks); + let network = InMemoryMpcNetwork::new(handlers.map(Some)); let drivers = network .transports() .iter() @@ -84,11 +82,12 @@ impl TestApp { /// ## Errors /// Returns an error if it can't start a query or send query input. #[allow(clippy::missing_panics_doc)] + pub async fn start_query( &self, input: I, query_config: QueryConfig, - ) -> Result + ) -> Result where I: IntoShares, A: IntoBuf, @@ -117,7 +116,7 @@ impl TestApp { /// Propagates errors retrieving the query status. /// ## Panics /// Never. - pub fn query_status(&self, query_id: QueryId) -> Result<[QueryStatus; 3], Error> { + pub fn query_status(&self, query_id: QueryId) -> Result<[QueryStatus; 3], ApiError> { Ok((0..3) .map(|i| self.drivers[i].query_status(query_id)) .collect::, _>>()? @@ -129,7 +128,7 @@ impl TestApp { /// Returns an error if one or more helpers can't finish the processing. /// ## Panics /// Never. - pub async fn complete_query(&self, query_id: QueryId) -> Result<[Vec; 3], Error> { + pub async fn complete_query(&self, query_id: QueryId) -> Result<[Vec; 3], ApiError> { let results = try_join3_array([0, 1, 2].map(|i| self.drivers[i].complete_query(query_id))).await; self.network.reset(); @@ -145,7 +144,7 @@ impl TestApp { &self, input: I, query_config: QueryConfig, - ) -> Result<[Vec; 3], Error> + ) -> Result<[Vec; 3], ApiError> where I: IntoShares, A: IntoBuf, From 4fb18b1b67988115243cf84a49e72ff3b3d3f284 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Wed, 3 Apr 2024 13:53:53 -0700 Subject: [PATCH 118/135] Use `BytesStream` inside `Transport` trait This change is to unify stream handling between in-memory and real-world implementations. Before, in memory streams yielded `Vec` and HTTP streams operated on `Result`. This discrepancy required us to build a compatibility layer, and it makes sense now to unify both implementations. The main motivator for this change is to be able to use `RecordsStream` inside shard receivers - `UnorderedReceiver` use case fits MPC model well, but is clunky to use inside shard channels. --- ipa-core/src/helpers/gateway/mod.rs | 10 +-- ipa-core/src/helpers/gateway/receive.rs | 9 +-- .../helpers/transport/in_memory/sharding.rs | 1 + .../helpers/transport/in_memory/transport.rs | 72 +++++++++---------- ipa-core/src/helpers/transport/mod.rs | 2 +- ipa-core/src/helpers/transport/receive.rs | 11 +++ .../src/helpers/transport/stream/box_body.rs | 6 +- .../src/helpers/transport/stream/input.rs | 12 ++-- ipa-core/src/helpers/transport/stream/mod.rs | 6 +- ipa-core/src/net/client/mod.rs | 5 +- .../src/net/server/handlers/query/step.rs | 4 +- ipa-core/src/net/transport.rs | 18 +++-- 12 files changed, 85 insertions(+), 71 deletions(-) diff --git a/ipa-core/src/helpers/gateway/mod.rs b/ipa-core/src/helpers/gateway/mod.rs index 151a920c6..d973d6c6f 100644 --- a/ipa-core/src/helpers/gateway/mod.rs +++ b/ipa-core/src/helpers/gateway/mod.rs @@ -20,7 +20,7 @@ use crate::{ receive::GatewayReceivers, send::GatewaySenders, transport::RoleResolvingTransport, }, transport::routing::RouteId, - HelperChannelId, Message, Role, RoleAssignment, TotalRecords, Transport, + HelperChannelId, LogErrors, Message, Role, RoleAssignment, TotalRecords, Transport, }, protocol::QueryId, }; @@ -142,10 +142,10 @@ impl Gateway { channel_id.clone(), self.inner.receivers.get_or_create(channel_id, || { UnorderedReceiver::new( - Box::pin( - self.transport - .receive(channel_id.peer, (self.query_id, channel_id.gate.clone())), - ), + Box::pin(LogErrors::new(self.transport.receive( + channel_id.peer, + (self.query_id, channel_id.gate.clone()), + ))), self.config.active_work(), ) }), diff --git a/ipa-core/src/helpers/gateway/receive.rs b/ipa-core/src/helpers/gateway/receive.rs index 6e37f05d8..a98166e9f 100644 --- a/ipa-core/src/helpers/gateway/receive.rs +++ b/ipa-core/src/helpers/gateway/receive.rs @@ -1,12 +1,13 @@ use std::marker::PhantomData; +use bytes::Bytes; use dashmap::{mapref::entry::Entry, DashMap}; -use futures::Stream; use crate::{ + error::BoxError, helpers::{ buffers::UnorderedReceiver, gateway::transport::RoleResolvingTransport, Error, - HelperChannelId, Message, Role, Transport, + HelperChannelId, LogErrors, Message, Role, Transport, }, protocol::RecordId, }; @@ -25,8 +26,8 @@ pub(super) struct GatewayReceivers { } pub(super) type UR = UnorderedReceiver< - ::RecordsStream, - <::RecordsStream as Stream>::Item, + LogErrors<::RecordsStream, Bytes, BoxError>, + Vec, >; impl ReceivingEnd { diff --git a/ipa-core/src/helpers/transport/in_memory/sharding.rs b/ipa-core/src/helpers/transport/in_memory/sharding.rs index 0700793cc..23175e375 100644 --- a/ipa-core/src/helpers/transport/in_memory/sharding.rs +++ b/ipa-core/src/helpers/transport/in_memory/sharding.rs @@ -122,6 +122,7 @@ mod tests { sum += shard_network .transport(identity, a) .receive(b, (QueryId, Gate::default())) + .into_bytes_stream() .collect::>() .await .into_iter() diff --git a/ipa-core/src/helpers/transport/in_memory/transport.rs b/ipa-core/src/helpers/transport/in_memory/transport.rs index cb456a599..4c8962e61 100644 --- a/ipa-core/src/helpers/transport/in_memory/transport.rs +++ b/ipa-core/src/helpers/transport/in_memory/transport.rs @@ -11,6 +11,7 @@ use ::tokio::sync::{ oneshot, }; use async_trait::async_trait; +use bytes::Bytes; use futures::{Stream, StreamExt}; #[cfg(all(feature = "shuttle", test))] use shuttle::future as tokio; @@ -36,7 +37,7 @@ type Packet = ( ); type ConnectionTx = Sender>; type ConnectionRx = Receiver>; -type StreamItem = Vec; +type StreamItem = Result; #[derive(Debug, thiserror::Error)] pub enum Error { @@ -110,12 +111,7 @@ impl InMemoryTransport { handler .as_ref() .expect("Handler is set") - .handle( - addr, - BodyStream::from_infallible( - stream.map(Vec::into_boxed_slice), - ), - ) + .handle(addr, BodyStream::from_bytes_stream(stream)) .await } }; @@ -177,7 +173,11 @@ impl Transport for Weak> { let (ack_tx, ack_rx) = oneshot::channel(); channel - .send((addr, InMemoryStream::wrap(data), ack_tx)) + .send(( + addr, + InMemoryStream::wrap(data.map(Bytes::from).map(Ok)), + ack_tx, + )) .await .map_err(|_e| { io::Error::new::(io::ErrorKind::ConnectionAborted, "channel closed".into()) @@ -216,28 +216,11 @@ pub struct InMemoryStream { } impl InMemoryStream { - #[cfg(all(test, unit_test))] - fn empty() -> Self { - Self::from_iter(std::iter::empty()) - } - fn wrap + Send + 'static>(value: S) -> Self { Self { inner: Box::pin(value), } } - - #[cfg(all(test, unit_test))] - fn from_iter(input: I) -> Self - where - I: IntoIterator, - I::IntoIter: Send + 'static, - { - use futures_util::stream; - Self { - inner: Box::pin(stream::iter(input)), - } - } } impl From> for InMemoryStream { @@ -324,8 +307,11 @@ mod tests { task::Poll, }; + use bytes::Bytes; + use futures::{stream, Stream}; use futures_util::{stream::poll_immediate, FutureExt, StreamExt}; use tokio::sync::{mpsc::channel, oneshot}; + use tokio_stream::wrappers::ReceiverStream; use crate::{ ff::{FieldType, Fp31}, @@ -348,11 +334,12 @@ mod tests { const STEP: &str = "in-memory-transport"; - async fn send_and_ack( + async fn send_and_ack> + Send + 'static>( sender: &ConnectionTx, addr: Addr, - data: InMemoryStream, + data: S, ) { + let data = InMemoryStream::wrap(data.map(Bytes::from).map(Ok)); let (tx, rx) = oneshot::channel(); sender.send((addr, data, tx)).await.unwrap(); let _ = rx @@ -398,7 +385,7 @@ mod tests { send_and_ack( &tx, Addr::from_route(Some(HelperIdentity::TWO), expected), - InMemoryStream::empty(), + stream::empty(), ) .await; @@ -411,7 +398,9 @@ mod tests { let transport = Arc::downgrade(&transport); let expected = vec![vec![1], vec![2]]; - let mut stream = transport.receive(HelperIdentity::TWO, (QueryId, Gate::from(STEP))); + let mut stream = transport + .receive(HelperIdentity::TWO, (QueryId, Gate::from(STEP))) + .into_bytes_stream(); // make sure it is not ready as it hasn't received the records stream yet. assert!(matches!( @@ -421,7 +410,7 @@ mod tests { send_and_ack( &tx, Addr::records(HelperIdentity::TWO, QueryId, Gate::from(STEP)), - InMemoryStream::from_iter(expected.clone()), + stream::iter(expected.clone()), ) .await; @@ -436,12 +425,13 @@ mod tests { send_and_ack( &tx, Addr::records(HelperIdentity::TWO, QueryId, Gate::from(STEP)), - InMemoryStream::from_iter(expected.clone()), + stream::iter(expected.clone()), ) .await; - let stream = - Arc::downgrade(&transport).receive(HelperIdentity::TWO, (QueryId, Gate::from(STEP))); + let stream = Arc::downgrade(&transport) + .receive(HelperIdentity::TWO, (QueryId, Gate::from(STEP))) + .into_bytes_stream(); assert_eq!(expected, stream.collect::>().await); } @@ -454,13 +444,15 @@ mod tests { transports: &HashMap>>, ) { let (stream_tx, stream_rx) = channel(1); - let stream = InMemoryStream::from(stream_rx); + let stream = ReceiverStream::new(stream_rx); let from_transport = transports.get(&from).unwrap(); let to_transport = transports.get(&to).unwrap(); let gate = Gate::from(STEP); - let mut recv = to_transport.receive(from, (QueryId, gate.clone())); + let mut recv = to_transport + .receive(from, (QueryId, gate.clone())) + .into_bytes_stream(); assert!(matches!( poll_immediate(&mut recv).next().await, Some(Poll::Pending) @@ -509,10 +501,12 @@ mod tests { let (tx, owned_transport) = Setup::new(HelperIdentity::ONE).into_active_conn(None); let gate = Gate::from(STEP); let (stream_tx, stream_rx) = channel(1); - let stream = InMemoryStream::from(stream_rx); + let stream = ReceiverStream::from(stream_rx); let transport = Arc::downgrade(&owned_transport); - let mut recv_stream = transport.receive(HelperIdentity::TWO, (QueryId, gate.clone())); + let mut recv_stream = transport + .receive(HelperIdentity::TWO, (QueryId, gate.clone())) + .into_bytes_stream(); send_and_ack( &tx, Addr::records(HelperIdentity::TWO, QueryId, gate.clone()), @@ -562,7 +556,9 @@ mod tests { ) .await .unwrap(); - let mut recv = transport2.receive(HelperIdentity::ONE, (QueryId, gate)); + let mut recv = transport2 + .receive(HelperIdentity::ONE, (QueryId, gate)) + .into_bytes_stream(); tx.send(0, Fp31::try_from(0_u128).unwrap()).await; // can't receive the value at index 0 because of buffering inside the sender diff --git a/ipa-core/src/helpers/transport/mod.rs b/ipa-core/src/helpers/transport/mod.rs index 23c290388..202d9fbad 100644 --- a/ipa-core/src/helpers/transport/mod.rs +++ b/ipa-core/src/helpers/transport/mod.rs @@ -163,7 +163,7 @@ impl RouteParams for (RouteId, QueryId) { #[async_trait] pub trait Transport: Clone + Send + Sync + 'static { type Identity: TransportIdentity; - type RecordsStream: Stream> + Send + Unpin; + type RecordsStream: BytesStream; type Error: std::fmt::Debug; fn identity(&self) -> Self::Identity; diff --git a/ipa-core/src/helpers/transport/receive.rs b/ipa-core/src/helpers/transport/receive.rs index fec775d0b..15fa7d4d9 100644 --- a/ipa-core/src/helpers/transport/receive.rs +++ b/ipa-core/src/helpers/transport/receive.rs @@ -84,6 +84,17 @@ impl ReceiveRecords { } } +#[cfg(all(test, any(unit_test, web_test)))] +impl ReceiveRecords { + /// Converts this into a stream that yields owned byte chunks. + /// + /// ## Panics + /// If inner stream yields an [`Err`] chunk. + pub(crate) fn into_bytes_stream(self) -> impl Stream> { + self.inner.map(Result::unwrap).map(Into::into) + } +} + impl Stream for ReceiveRecords { type Item = S::Item; diff --git a/ipa-core/src/helpers/transport/stream/box_body.rs b/ipa-core/src/helpers/transport/stream/box_body.rs index aa7a25583..d59a43295 100644 --- a/ipa-core/src/helpers/transport/stream/box_body.rs +++ b/ipa-core/src/helpers/transport/stream/box_body.rs @@ -6,7 +6,7 @@ use std::{ use bytes::Bytes; use futures::{stream::StreamExt, Stream}; -use crate::helpers::transport::stream::BoxBytesStream; +use crate::helpers::{transport::stream::BoxBytesStream, BytesStream}; pub struct WrappedBoxBodyStream(BoxBytesStream); @@ -22,6 +22,10 @@ impl WrappedBoxBodyStream { Self(Box::pin(input.map(Bytes::from).map(Ok))) } + pub fn from_bytes_stream(input: S) -> Self { + Self(Box::pin(input)) + } + #[must_use] pub fn empty() -> Self { WrappedBoxBodyStream(Box::pin(futures::stream::empty())) diff --git a/ipa-core/src/helpers/transport/stream/input.rs b/ipa-core/src/helpers/transport/stream/input.rs index 2eb1ca355..4e34d1400 100644 --- a/ipa-core/src/helpers/transport/stream/input.rs +++ b/ipa-core/src/helpers/transport/stream/input.rs @@ -154,12 +154,12 @@ enum ExtendResult { Error(io::Error), } -/// Parse a [`Stream`] of [`Bytes`] into a stream of records of some +/// Parse a [`Stream`] of bytes into a stream of records of some /// fixed-length-[`Serializable`] type `T`. #[pin_project] -pub struct RecordsStream +pub struct RecordsStream = Bytes> where - S: BytesStream, + S: BytesStream, T: Serializable, { // Our implementation of `poll_next` turns a `None` from the inner stream into `Some(Err(_))` if @@ -169,12 +169,12 @@ where #[pin] stream: Fuse, buffer: BufDeque, - phantom_data: PhantomData, + phantom_data: PhantomData<(T, R)>, } -impl RecordsStream +impl> RecordsStream where - S: BytesStream, + S: BytesStream, T: Serializable, { #[must_use] diff --git a/ipa-core/src/helpers/transport/stream/mod.rs b/ipa-core/src/helpers/transport/stream/mod.rs index 053b6033c..16a6666e2 100644 --- a/ipa-core/src/helpers/transport/stream/mod.rs +++ b/ipa-core/src/helpers/transport/stream/mod.rs @@ -16,7 +16,7 @@ pub use input::{LengthDelimitedStream, RecordsStream}; use crate::error::BoxError; -pub trait BytesStream: Stream> + Send { +pub trait BytesStream = Bytes>: Stream> + Send { /// Collects the entire stream into a vec; only intended for use in tests /// # Panics /// if the stream has any failure @@ -27,11 +27,11 @@ pub trait BytesStream: Stream> + Send { { use futures::StreamExt; - Box::pin(self.map(|item| item.unwrap().to_vec()).concat()) + Box::pin(self.map(|item| item.unwrap().as_ref().to_vec()).concat()) } } -impl> + Send> BytesStream for S {} +impl, S: Stream> + Send> BytesStream for S {} pub type BoxBytesStream = Pin>; diff --git a/ipa-core/src/net/client/mod.rs b/ipa-core/src/net/client/mod.rs index 795457718..fe25c32d4 100644 --- a/ipa-core/src/net/client/mod.rs +++ b/ipa-core/src/net/client/mod.rs @@ -624,8 +624,9 @@ pub(crate) mod tests { MpcHelperClient::resp_ok(resp).await.unwrap(); - let mut stream = - Arc::clone(&transport).receive(HelperIdentity::ONE, (QueryId, expected_step.clone())); + let mut stream = Arc::clone(&transport) + .receive(HelperIdentity::ONE, (QueryId, expected_step.clone())) + .into_bytes_stream(); assert_eq!( poll_immediate(&mut stream).next().await, diff --git a/ipa-core/src/net/server/handlers/query/step.rs b/ipa-core/src/net/server/handlers/query/step.rs index 223dbbff6..00a0de9d2 100644 --- a/ipa-core/src/net/server/handlers/query/step.rs +++ b/ipa-core/src/net/server/handlers/query/step.rs @@ -70,7 +70,9 @@ mod tests { .await .unwrap(); - let mut stream = Arc::clone(&transport).receive(HelperIdentity::TWO, (QueryId, step)); + let mut stream = Arc::clone(&transport) + .receive(HelperIdentity::TWO, (QueryId, step)) + .into_bytes_stream(); assert_eq!( poll_immediate(&mut stream).next().await, diff --git a/ipa-core/src/net/transport.rs b/ipa-core/src/net/transport.rs index 8e9dbca8e..79a80bea7 100644 --- a/ipa-core/src/net/transport.rs +++ b/ipa-core/src/net/transport.rs @@ -6,17 +6,15 @@ use std::{ }; use async_trait::async_trait; -use bytes::Bytes; use futures::{Stream, TryFutureExt}; use pin_project::{pin_project, pinned_drop}; use crate::{ config::{NetworkConfig, ServerConfig}, - error::BoxError, helpers::{ query::QueryConfig, routing::{Addr, RouteId}, - ApiError, BodyStream, HandlerRef, HelperIdentity, HelperResponse, LogErrors, NoQueryId, + ApiError, BodyStream, HandlerRef, HelperIdentity, HelperResponse, NoQueryId, NoResourceIdentifier, NoStep, QueryIdBinding, ReceiveRecords, RequestHandler, RouteParams, StepBinding, StreamCollection, Transport, }, @@ -25,15 +23,13 @@ use crate::{ sync::Arc, }; -type LogHttpErrors = LogErrors; - /// HTTP transport for IPA helper service. pub struct HttpTransport { identity: HelperIdentity, clients: [MpcHelperClient; 3], // TODO(615): supporting multiple queries likely require a hashmap here. It will be ok if we // only allow one query at a time. - record_streams: StreamCollection, + record_streams: StreamCollection, handler: Option, } @@ -155,14 +151,14 @@ impl HttpTransport { stream: BodyStream, ) { self.record_streams - .add_stream((query_id, from, gate), LogErrors::new(stream)); + .add_stream((query_id, from, gate), stream); } } #[async_trait] impl Transport for Arc { type Identity = HelperIdentity; - type RecordsStream = ReceiveRecords; + type RecordsStream = ReceiveRecords; type Error = Error; fn identity(&self) -> HelperIdentity { @@ -232,6 +228,7 @@ impl Transport for Arc { mod tests { use std::{iter::zip, net::TcpListener, task::Poll}; + use bytes::Bytes; use futures::stream::{poll_immediate, StreamExt}; use futures_util::future::{join_all, try_join_all}; use generic_array::GenericArray; @@ -272,8 +269,9 @@ mod tests { Arc::clone(&transport).receive_stream(QueryId, STEP.clone(), HelperIdentity::TWO, body); // Request step data reception (normally called by protocol) - let mut stream = - Arc::clone(&transport).receive(HelperIdentity::TWO, (QueryId, STEP.clone())); + let mut stream = Arc::clone(&transport) + .receive(HelperIdentity::TWO, (QueryId, STEP.clone())) + .into_bytes_stream(); // make sure it is not ready as it hasn't received any data yet. assert!(matches!( From 45b8fa015dd62a1af418cf0ae185ff99215a094d Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Fri, 5 Apr 2024 09:30:13 -0700 Subject: [PATCH 119/135] Update async-trait --- ipa-core/Cargo.toml | 2 +- ipa-core/src/test_fixture/world.rs | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/ipa-core/Cargo.toml b/ipa-core/Cargo.toml index 8bf015974..b194fa13f 100644 --- a/ipa-core/Cargo.toml +++ b/ipa-core/Cargo.toml @@ -76,7 +76,7 @@ ipa-prf = [] ipa-macros = { version = "*", path = "../ipa-macros" } aes = "0.8.3" -async-trait = "0.1.68" +async-trait = "0.1.79" async-scoped = { version = "0.9.0", features = ["use-tokio"], optional = true } axum = { version = "0.5.17", optional = true, features = ["http2"] } axum-server = { version = "0.5.1", optional = true, features = [ diff --git a/ipa-core/src/test_fixture/world.rs b/ipa-core/src/test_fixture/world.rs index 654fc811e..3cd252fae 100644 --- a/ipa-core/src/test_fixture/world.rs +++ b/ipa-core/src/test_fixture/world.rs @@ -403,7 +403,6 @@ impl Runner> for TestWorld(&'a self, _input: I, _helper_fn: H) -> [O; 3] where I: IntoShares + Send + 'static, @@ -415,7 +414,6 @@ impl Runner> for TestWorld( &'a self, _input: I, From 10040b83d0bc5620a90fc99b98cba7adb54b103a Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 4 Apr 2024 13:46:57 -0700 Subject: [PATCH 120/135] Add BooleanProtocols rollup trait --- ipa-core/src/protocol/basics/mod.rs | 21 +++++++++++++++++-- .../boolean_ops/addition_sequential.rs | 17 +++++++++------ .../comparison_and_subtraction_sequential.rs | 16 +++++++------- .../boolean_ops/share_conversion_aby.rs | 18 +++++++--------- ipa-core/src/protocol/ipa_prf/prf_eval.rs | 7 +++---- 5 files changed, 48 insertions(+), 31 deletions(-) diff --git a/ipa-core/src/protocol/basics/mod.rs b/ipa-core/src/protocol/basics/mod.rs index f7536d606..5c4cb7929 100644 --- a/ipa-core/src/protocol/basics/mod.rs +++ b/ipa-core/src/protocol/basics/mod.rs @@ -8,6 +8,8 @@ mod reveal; mod share_known_value; pub mod sum_of_product; +use std::ops::Not; + #[cfg(feature = "descriptive-gate")] pub use check_zero::check_zero; pub use if_else::{if_else, select}; @@ -18,8 +20,8 @@ pub use share_known_value::ShareKnownValue; pub use sum_of_product::SumOfProducts; use crate::{ - ff::Field, - protocol::context::Context, + ff::{boolean::Boolean, Field}, + protocol::{context::Context, ipa_prf::PRF_CHUNK}, secret_sharing::{ replicated::semi_honest::AdditiveShare, SecretSharing, SharedValue, Vectorizable, }, @@ -42,8 +44,23 @@ pub trait BasicProtocols, const N: { } +pub trait BooleanProtocols, const N: usize = 1>: + SecretSharing + + Reveal>::Array> + + SecureMul + + Not +{ +} + impl BasicProtocols for AdditiveShare {} +impl BooleanProtocols for AdditiveShare {} + +impl BooleanProtocols for AdditiveShare {} + +// Used by semi_honest_compare_gt_vec test. +impl BooleanProtocols for AdditiveShare {} + #[cfg(feature = "descriptive-gate")] impl<'a, F: ExtendableField> BasicProtocols, F> for MaliciousReplicated diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs index b4dc09bce..1cd04e2b9 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/addition_sequential.rs @@ -1,4 +1,4 @@ -use std::{borrow::Borrow, iter::repeat, ops::Not}; +use std::{borrow::Borrow, iter::repeat}; #[cfg(all(test, unit_test))] use ipa_macros::Step; @@ -6,7 +6,12 @@ use ipa_macros::Step; use crate::{ error::Error, ff::{ArrayAccessRef, ArrayBuild, ArrayBuilder, Field}, - protocol::{basics::SecureMul, context::Context, step::BitOpStep, RecordId}, + protocol::{ + basics::{BooleanProtocols, SecureMul}, + context::Context, + step::BitOpStep, + RecordId, + }, secret_sharing::{replicated::semi_honest::AdditiveShare, FieldSimd}, }; #[cfg(all(test, unit_test))] @@ -41,7 +46,7 @@ where F: Field + FieldSimd, XS: ArrayAccessRef> + ArrayBuild>, YS: ArrayAccessRef>, - AdditiveShare: SecureMul + Not>, + AdditiveShare: BooleanProtocols, { let mut carry = AdditiveShare::::ZERO; let sum = addition_circuit(ctx, record_id, x, y, &mut carry).await?; @@ -65,7 +70,7 @@ where C: Context, S: SharedValue + CustomArray, AdditiveShare: From> + Into>, - AdditiveShare: Not>, + AdditiveShare: BooleanProtocols, { use crate::{ff::Expand, protocol::basics::if_else}; let mut carry = AdditiveShare::::ZERO; @@ -114,7 +119,7 @@ where F: Field + FieldSimd, XS: ArrayAccessRef> + ArrayBuild>, YS: ArrayAccessRef>, - AdditiveShare: SecureMul + Not>, + AdditiveShare: BooleanProtocols, { let x = x.iter(); let y = y.iter(); @@ -168,7 +173,7 @@ async fn bit_adder( where C: Context, F: Field + FieldSimd, - AdditiveShare: SecureMul + Not>, + AdditiveShare: BooleanProtocols, { let output = x + y + &*carry; diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs index cee540964..cba927c04 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/comparison_and_subtraction_sequential.rs @@ -4,7 +4,7 @@ //! the bit-width of the first (x) operand, then the excess bits of y must be zero. This condition //! is abbreviated below as `length(x) >= log2(y)`. -use std::{borrow::Borrow, iter::repeat, ops::Not}; +use std::{borrow::Borrow, iter::repeat}; #[cfg(all(test, unit_test))] use ipa_macros::Step; @@ -15,7 +15,7 @@ use crate::{ error::Error, ff::{ArrayAccessRef, ArrayBuild, ArrayBuilder, Field}, protocol::{ - basics::{SecureMul, ShareKnownValue}, + basics::{BooleanProtocols, SecureMul, ShareKnownValue}, context::Context, step::BitOpStep, RecordId, @@ -52,7 +52,7 @@ where F: Field, XS: ArrayAccessRef> + ArrayBuild>, YS: ArrayAccessRef>, - AdditiveShare: SecureMul + Not>, + AdditiveShare: BooleanProtocols, { // we need to initialize carry to 1 for x>=y, let mut carry = AdditiveShare::::share_known_value(&ctx, F::ONE); @@ -77,7 +77,7 @@ where F: Field + FieldSimd, XS: ArrayAccessRef> + ArrayBuild>, YS: ArrayAccessRef>, - AdditiveShare: SecureMul + Not>, + AdditiveShare: BooleanProtocols, { // we need to initialize carry to 0 for x>y let mut carry = AdditiveShare::::ZERO; @@ -102,7 +102,7 @@ where F: Field, XS: ArrayAccessRef> + ArrayBuild>, YS: ArrayAccessRef>, - AdditiveShare: SecureMul + Not>, + AdditiveShare: BooleanProtocols, { // we need to initialize carry to 1 for a subtraction let mut carry = AdditiveShare::::share_known_value(&ctx, F::ONE); @@ -127,7 +127,7 @@ where S: SharedValue + CustomArray, AdditiveShare: ArrayAccessRef> + ArrayBuild>, - AdditiveShare: SecureMul + Not>, + AdditiveShare: BooleanProtocols, AdditiveShare: From> + Into>, { let mut carry = AdditiveShare::::share_known_value(&ctx, F::ONE); @@ -170,7 +170,7 @@ where F: Field + FieldSimd, XS: ArrayAccessRef> + ArrayBuild>, YS: ArrayAccessRef>, - AdditiveShare: SecureMul + Not>, + AdditiveShare: BooleanProtocols, { let x = x.iter(); let y = y.iter(); @@ -220,7 +220,7 @@ async fn bit_subtractor( where C: Context, F: Field + FieldSimd, - AdditiveShare: SecureMul + Not>, + AdditiveShare: BooleanProtocols, { let output = x + !(y + &*carry); diff --git a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs index b75660d4d..c92b430b2 100644 --- a/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs +++ b/ipa-core/src/protocol/ipa_prf/boolean_ops/share_conversion_aby.rs @@ -1,8 +1,4 @@ -use std::{ - borrow::Borrow, - convert::Infallible, - ops::{Neg, Not}, -}; +use std::{borrow::Borrow, convert::Infallible, ops::Neg}; use ipa_macros::Step; @@ -14,7 +10,7 @@ use crate::{ }, helpers::Role, protocol::{ - basics::{partial_reveal, Reveal, SecureMul}, + basics::{partial_reveal, BooleanProtocols}, context::Context, ipa_prf::boolean_ops::addition_sequential::integer_add, prss::{FromPrss, SharedRandomness}, @@ -22,7 +18,7 @@ use crate::{ }, secret_sharing::{ replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, - FieldSimd, FieldVectorizable, SharedValue, SharedValueArray, TransposeFrom, Vectorizable, + FieldSimd, SharedValue, SharedValueArray, TransposeFrom, Vectorizable, }, }; @@ -119,9 +115,7 @@ where YS: ArrayAccessRef> + ArrayBuild> + FromPrss, - AdditiveShare: SecureMul - + Reveal>::ArrayAlias> - + Not>, + AdditiveShare: BooleanProtocols, Vec>: for<'a> TransposeFrom<&'a YS>, Vec: for<'a> TransposeFrom<&'a [>::Array; 256], Error = Infallible>, @@ -354,6 +348,7 @@ mod tests { use crate::{ ff::{boolean_array::BA64, Serializable}, helpers::stream::{ProcessChunks, TryFlattenItersExt}, + protocol::context::SemiHonestContext, rand::thread_rng, seq_join::{seq_join, SeqJoin}, test_executor::run, @@ -379,7 +374,8 @@ mod tests { + 'static, for<'a> ::Ref<'a>: Send, for<'a> ::Ref<'a>: Send, - AdditiveShare: Not>, + AdditiveShare: + for<'a> BooleanProtocols, Boolean, CHUNK>, Vec>: for<'a> TransposeFrom<&'a YS>, Vec: for<'a> TransposeFrom< &'a [>::Array; 256], diff --git a/ipa-core/src/protocol/ipa_prf/prf_eval.rs b/ipa-core/src/protocol/ipa_prf/prf_eval.rs index a10a9a0e2..854e0baaa 100644 --- a/ipa-core/src/protocol/ipa_prf/prf_eval.rs +++ b/ipa-core/src/protocol/ipa_prf/prf_eval.rs @@ -6,14 +6,13 @@ use crate::{ error::Error, ff::{boolean::Boolean, curve_points::RP25519, ec_prime_field::Fp25519, Expand}, protocol::{ - basics::{Reveal, SecureMul}, + basics::{BooleanProtocols, Reveal, SecureMul}, context::Context, prss::{FromPrss, SharedRandomness}, RecordId, }, secret_sharing::{ - replicated::semi_honest::AdditiveShare, FieldSimd, FieldVectorizable, Sendable, StdArray, - Vectorizable, + replicated::semi_honest::AdditiveShare, FieldSimd, Sendable, StdArray, Vectorizable, }, }; @@ -92,7 +91,7 @@ where Fp25519: Vectorizable, RP25519: Vectorizable>, Boolean: FieldSimd, - AdditiveShare: Reveal>::ArrayAlias>, + AdditiveShare: BooleanProtocols, AdditiveShare: SecureMul + FromPrss, StdArray: Sendable, { From 90b3d98cb908b28bdcdcc59ede262e7cc008b21a Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Fri, 5 Apr 2024 13:08:19 -0700 Subject: [PATCH 121/135] Enable dual-mode for `RecordsStream` (#1002) * Enable dual-mode for `RecordsStream` `RecordsStream` is a convenient abstraction that takes care of polling the underlying raw byte stream, buffering enough data and deserializing them into a client-provided type `T`. It also handles padding and unaligned errors. Before this change, stream element could only be a `Vec` which means an extra allocation for clients that want to handle items one by one. This is the case for shard receiving streams. Shard receiving streams are polled by MPC protocols that get records out of them one-by-one. The key difference between MPC receiving streams and shard receiving streams is that the former wants the ability to receive elements out of order. For shard streams, it is not required. Shard streams can benefit from using `RecordsStream` abstraction quite a lot. I have it in my private branch and it works well. This change enables `RecordsStream` to be used in mode where they yield only one element --- .../src/helpers/transport/stream/input.rs | 135 +++++++++++++++--- 1 file changed, 118 insertions(+), 17 deletions(-) diff --git a/ipa-core/src/helpers/transport/stream/input.rs b/ipa-core/src/helpers/transport/stream/input.rs index 2eb1ca355..ee90088b0 100644 --- a/ipa-core/src/helpers/transport/stream/input.rs +++ b/ipa-core/src/helpers/transport/stream/input.rs @@ -107,15 +107,25 @@ impl BufDeque { }) } - /// Deserialize fixed-length items from the buffer. + /// Deserialize a single instance of `T` from the buffer with the guarantee that deserialization + /// cannot fail, if there is enough bytes in the buffer. /// - /// Deserializes a single instance of fixed-length-[`Serializable`] type `T` from the stream. /// Returns `None` if there is insufficient data available. - fn read>(&mut self) -> Option { + fn read_infallible>(&mut self) -> Option { self.read_bytes(T::Size::USIZE) .map(|bytes| T::deserialize_infallible(GenericArray::from_slice(&bytes))) } + /// Attempts to deserialize a single instance of `T` from the buffer. + /// Returns `None` if there is insufficient data available + /// + /// ## Errors + /// Returns a deserialization error if `T` rejects the bytes from this buffer. + fn try_read(&mut self) -> Option> { + self.read_bytes(T::Size::USIZE) + .map(|bytes| T::deserialize(GenericArray::from_slice(&bytes))) + } + /// Update the buffer with the result of polling a stream. fn extend(&mut self, bytes: Option>) -> ExtendResult { match bytes { @@ -154,13 +164,51 @@ enum ExtendResult { Error(io::Error), } +pub trait Mode { + type Output; + + fn read_from( + buf: &mut BufDeque, + ) -> Option, T::DeserializationError>>; +} + +/// Makes [`RecordsStream`] return one record per poll. +pub struct Single; + +/// Makes [`RecordsStream`] return a vector of elements per poll. +pub struct Batch; + +impl Mode for Single { + type Output = T; + + fn read_from( + buf: &mut BufDeque, + ) -> Option, T::DeserializationError>> { + buf.try_read() + } +} +impl Mode for Batch { + type Output = Vec; + + fn read_from( + buf: &mut BufDeque, + ) -> Option, T::DeserializationError>> { + let count = max(1, buf.contiguous_len() / T::Size::USIZE); + buf.read_multi(count) + } +} + /// Parse a [`Stream`] of [`Bytes`] into a stream of records of some /// fixed-length-[`Serializable`] type `T`. +/// +/// Depending on `M`, the provided stream can yield a single record `T` or multiples of `T`. See +/// [`Single`], [`Batch`] and [`Mode`] #[pin_project] -pub struct RecordsStream +pub struct RecordsStream where S: BytesStream, T: Serializable, + M: Mode, { // Our implementation of `poll_next` turns a `None` from the inner stream into `Some(Err(_))` if // there is extra trailing data. We do not expect to be polled again after that happens, but @@ -169,13 +217,14 @@ where #[pin] stream: Fuse, buffer: BufDeque, - phantom_data: PhantomData, + phantom_data: PhantomData<(T, M)>, } -impl RecordsStream +impl RecordsStream where S: BytesStream, T: Serializable, + M: Mode, { #[must_use] pub fn new(stream: S) -> Self { @@ -187,19 +236,19 @@ where } } -impl Stream for RecordsStream +impl Stream for RecordsStream where S: BytesStream, T: Serializable, + M: Mode, { - type Item = Result, crate::error::Error>; + type Item = Result, crate::error::Error>; fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { let mut this = self.project(); loop { - let count = max(1, this.buffer.contiguous_len() / T::Size::USIZE); - if let Some(items) = this.buffer.read_multi(count) { - return Poll::Ready(Some(items.map_err(|e: T::DeserializationError| { + if let Some(v) = M::read_from(this.buffer) { + return Poll::Ready(Some(v.map_err(|e: T::DeserializationError| { crate::error::Error::ParseError(e.into()) }))); } @@ -218,20 +267,22 @@ where } } -impl FusedStream for RecordsStream +impl FusedStream for RecordsStream where S: BytesStream, T: Serializable, + M: Mode, { fn is_terminated(&self) -> bool { self.stream.is_terminated() } } -impl Debug for RecordsStream +impl Debug for RecordsStream where S: BytesStream, T: Serializable, + M: Mode, { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( @@ -248,13 +299,14 @@ impl From> for RecordsStream From - for RecordsStream, fn(Buf) -> Result>> +impl From + for RecordsStream, fn(Buf) -> Result>, M> where T: Serializable, Buf: Into, I: IntoIterator, ::IntoIter: Send, + M: Mode, { fn from(value: I) -> Self { RecordsStream::new(iter(value).map(|buf| Ok(buf.into()))) @@ -335,7 +387,7 @@ where let mut items = Vec::new(); loop { if this.pending_len.is_none() { - if let Some(len) = this.buffer.read::().map(Into::into) { + if let Some(len) = this.buffer.read_infallible::().map(Into::into) { *this.pending_len = Some(len); consumed_len += ::Size::USIZE; } @@ -598,6 +650,41 @@ mod test { } } + mod single_record { + use std::iter; + + use bytes::Bytes; + use futures_util::{FutureExt, StreamExt, TryStreamExt}; + + use crate::{ + ff::{Fp31, Fp32BitPrime}, + helpers::{transport::stream::input::Single, RecordsStream}, + secret_sharing::SharedValue, + }; + + #[tokio::test] + async fn fp31() { + let vec = vec![3; 10]; + let stream = RecordsStream::::from(iter::once(Bytes::from(vec))); + let collected = stream.try_collect::>().await.unwrap(); + + assert_eq!(collected, vec![Fp31::try_from(3).unwrap(); 10]); + } + + #[tokio::test] + #[should_panic(expected = "stream terminated with 3 extra bytes")] + async fn fp32_bit() { + let vec = vec![0; 7]; + let mut stream = + RecordsStream::::from(iter::once(Bytes::from(vec))); + assert_eq!( + Fp32BitPrime::ZERO, + stream.next().now_or_never().flatten().unwrap().unwrap() + ); + stream.next().now_or_never().flatten().unwrap().unwrap(); + } + } + mod delimited { use futures::TryStreamExt; @@ -719,7 +806,7 @@ mod test { proptest::proptest! { #[test] - fn test_records_stream_works_with_any_chunks( + fn batch_test_records_stream_works_with_any_chunks( (expected_bytes, chunked_bytes, _seed) in arb_expected_and_chunked_body(100) ) { tokio::runtime::Runtime::new().unwrap().block_on(async { @@ -732,6 +819,20 @@ mod test { assert_eq!(collected_bytes, expected_bytes); }); } + + #[test] + fn single_test_records_stream_works_with_any_chunks( + (expected_bytes, chunked_bytes, _seed) in arb_expected_and_chunked_body(100) + ) { + tokio::runtime::Runtime::new().unwrap().block_on(async { + let collected_bytes = RecordsStream::::from(chunked_bytes) + .try_collect::>() + .await + .unwrap(); + + assert_eq!(collected_bytes, expected_bytes); + }); + } } } From 5f3967d77550da3f78d7fb6ec407685052158912 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Fri, 5 Apr 2024 13:24:14 -0700 Subject: [PATCH 122/135] Small fix --- ipa-core/src/helpers/transport/stream/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipa-core/src/helpers/transport/stream/mod.rs b/ipa-core/src/helpers/transport/stream/mod.rs index a5991a665..053b6033c 100644 --- a/ipa-core/src/helpers/transport/stream/mod.rs +++ b/ipa-core/src/helpers/transport/stream/mod.rs @@ -27,7 +27,7 @@ pub trait BytesStream: Stream> + Send { { use futures::StreamExt; - Box::pin(self.map(|item| item.unwrap().as_ref().to_vec()).concat()) + Box::pin(self.map(|item| item.unwrap().to_vec()).concat()) } } From 7dc303261a32f6eea8428d2b148195ff599cd11c Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Fri, 5 Apr 2024 14:58:13 -0700 Subject: [PATCH 123/135] Make flatten_iters terminate after the first error. --- ipa-core/src/helpers/stream/chunks.rs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/ipa-core/src/helpers/stream/chunks.rs b/ipa-core/src/helpers/stream/chunks.rs index e0d14dba1..4b8b5751d 100644 --- a/ipa-core/src/helpers/stream/chunks.rs +++ b/ipa-core/src/helpers/stream/chunks.rs @@ -246,6 +246,10 @@ pub trait TryFlattenItersExt: TryStream { /// Flatten a `TryStream` of `IntoIterator`s. /// /// Similar to `TryStream::try_flatten`, but that flattens a `TryStream` of `TryStream`s. + /// + /// Also unlike `TryStream::try_flatten`, the `TryFlattenIters` stream ends the stream + /// after the first error. This is particularly important when the error is security- + /// related and may indicate future data is corrupt. fn try_flatten_iters(self) -> TryFlattenIters where I: IntoIterator, @@ -300,7 +304,11 @@ where *this.iter = None; match this.stream.as_mut().poll_next(cx) { Poll::Ready(Some(Ok(into_iter))) => *this.iter = Some(into_iter.into_iter()), - Poll::Ready(Some(Err(e))) => return Poll::Ready(Some(Err(e))), + Poll::Ready(Some(Err(e))) => { + // Terminate the stream after the first error. + *this.finished = true; + return Poll::Ready(Some(Err(e))); + } Poll::Ready(None) => { *this.finished = true; return Poll::Ready(None); @@ -417,8 +425,9 @@ mod tests { assert_eq!(res[0].as_ref().unwrap(), &1); assert_eq!(res[1].as_ref().unwrap(), &2); assert!(matches!(res[2].as_ref().unwrap_err(), &Error::Internal)); - assert_eq!(res[3].as_ref().unwrap(), &3); - assert_eq!(res[4].as_ref().unwrap(), &4); + + // The stream should terminate after the first error. + assert_eq!(res.len(), 3); } #[tokio::test] @@ -544,11 +553,8 @@ mod tests { Some(Poll::Ready(Err(Error::Internal))) )); - // It should now be pending. It should not poll the source iterator again. - assert!(matches!( - poll_immediate(&mut st).next().await, - Some(Poll::Pending) - )); + // It should now be finished. It should not poll the source iterator again. + assert!(poll_immediate(&mut st).next().await.is_none()); tx.close().await.unwrap(); From 65996fb9218bd2eca85b4b1d997aa50ae3a942f7 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Sun, 7 Apr 2024 11:53:58 -0700 Subject: [PATCH 124/135] Implement shard communication channels for MPC circuits This change adds the necessary functionality to `Gateway` to be able to communicate between shards. `get_shard_sender` and `get_shard_receiver` will allow circuits to send and request data from other shards, similarly to MPC send/recv. There is a difference in how receives are handled for MPC and shards. The former channels use `UnorderedReceiver` that lets them receive records in any order. Shard receivers return a stream that has a FIFO order. This is a requirement that came from analysing shuffle and other protocols that require cross-shard communication. Each shard does not know in advance how many records it expects to receive from any shard. This also adds a stub for HTTP shard transport, just to make the code compile. Actual HTTP implementation will come later. In terms of next steps, there remains a building block for resharding shares and sharded shuffle implementation. After these two are complete, in memory implementation will be fully functional --- ipa-core/src/app.rs | 31 ++- ipa-core/src/bin/helper.rs | 4 +- .../src/helpers/buffers/ordering_sender.rs | 4 +- ipa-core/src/helpers/gateway/mod.rs | 230 ++++++++++++++---- ipa-core/src/helpers/gateway/receive.rs | 73 +++++- ipa-core/src/helpers/gateway/send.rs | 168 +++++++------ .../src/helpers/gateway/stall_detection.rs | 158 +++++++++--- ipa-core/src/helpers/gateway/transport.rs | 17 +- ipa-core/src/helpers/mod.rs | 45 ++-- ipa-core/src/helpers/prss_protocol.rs | 8 +- .../helpers/transport/in_memory/sharding.rs | 33 +++ ipa-core/src/helpers/transport/mod.rs | 34 ++- ipa-core/src/helpers/transport/receive.rs | 2 +- .../src/helpers/transport/stream/input.rs | 7 +- ipa-core/src/helpers/transport/stream/mod.rs | 2 +- ipa-core/src/net/mod.rs | 2 +- ipa-core/src/net/transport.rs | 44 +++- ipa-core/src/protocol/context/malicious.rs | 40 ++- ipa-core/src/protocol/context/mod.rs | 48 +++- ipa-core/src/protocol/context/semi_honest.rs | 29 ++- ipa-core/src/protocol/ipa_prf/shuffle/base.rs | 4 +- ipa-core/src/query/processor.rs | 21 +- ipa-core/src/test_fixture/app.rs | 23 +- ipa-core/src/test_fixture/mod.rs | 2 +- ipa-core/src/test_fixture/world.rs | 28 ++- 25 files changed, 790 insertions(+), 267 deletions(-) diff --git a/ipa-core/src/app.rs b/ipa-core/src/app.rs index 0ca99287d..eee1e434a 100644 --- a/ipa-core/src/app.rs +++ b/ipa-core/src/app.rs @@ -7,7 +7,7 @@ use crate::{ query::{PrepareQuery, QueryConfig, QueryInput}, routing::{Addr, RouteId}, ApiError, BodyStream, HandlerBox, HandlerRef, HelperIdentity, HelperResponse, - RequestHandler, Transport, TransportImpl, + MpcTransportImpl, RequestHandler, ShardTransportImpl, Transport, }, hpke::{KeyPair, KeyRegistry}, protocol::QueryId, @@ -32,7 +32,8 @@ struct Inner { /// on top of atomics and all fun stuff associated with it. I don't see an easy way to avoid that /// if we want to keep the implementation leak-free, but one may be aware if this shows up on /// the flamegraph - transport: TransportImpl, + mpc_transport: MpcTransportImpl, + shard_transport: ShardTransportImpl, } impl Setup { @@ -55,10 +56,15 @@ impl Setup { } /// Instantiate [`HelperApp`] by connecting it to the provided transport implementation - pub fn connect(self, transport: TransportImpl) -> HelperApp { + pub fn connect( + self, + mpc_transport: MpcTransportImpl, + shard_transport: ShardTransportImpl, + ) -> HelperApp { let app = Arc::new(Inner { query_processor: self.query_processor, - transport, + mpc_transport, + shard_transport, }); self.handler.set_handler( Arc::downgrade(&app) as Weak> @@ -80,7 +86,10 @@ impl HelperApp { Ok(self .inner .query_processor - .new_query(Transport::clone_ref(&self.inner.transport), query_config) + .new_query( + Transport::clone_ref(&self.inner.mpc_transport), + query_config, + ) .await? .query_id) } @@ -90,10 +99,11 @@ impl HelperApp { /// ## Errors /// Propagates errors from the helper. pub fn execute_query(&self, input: QueryInput) -> Result<(), ApiError> { - let transport = ::clone(&self.inner.transport); + let mpc_transport = Transport::clone_ref(&self.inner.mpc_transport); + let shard_transport = Transport::clone_ref(&self.inner.shard_transport); self.inner .query_processor - .receive_inputs(transport, input)?; + .receive_inputs(mpc_transport, shard_transport, input)?; Ok(()) } @@ -145,18 +155,19 @@ impl RequestHandler for Inner { RouteId::ReceiveQuery => { let req = req.into::()?; HelperResponse::from( - qp.new_query(Transport::clone_ref(&self.transport), req) + qp.new_query(Transport::clone_ref(&self.mpc_transport), req) .await?, ) } RouteId::PrepareQuery => { let req = req.into::()?; - HelperResponse::from(qp.prepare(&self.transport, req)?) + HelperResponse::from(qp.prepare(&self.mpc_transport, req)?) } RouteId::QueryInput => { let query_id = ext_query_id(&req)?; HelperResponse::from(qp.receive_inputs( - Transport::clone_ref(&self.transport), + Transport::clone_ref(&self.mpc_transport), + Transport::clone_ref(&self.shard_transport), QueryInput { query_id, input_stream: data, diff --git a/ipa-core/src/bin/helper.rs b/ipa-core/src/bin/helper.rs index 9ac13f670..81cdf214c 100644 --- a/ipa-core/src/bin/helper.rs +++ b/ipa-core/src/bin/helper.rs @@ -15,7 +15,7 @@ use ipa_core::{ config::{hpke_registry, HpkeServerConfig, NetworkConfig, ServerConfig, TlsConfig}, error::BoxError, helpers::HelperIdentity, - net::{ClientIdentity, HttpTransport, MpcHelperClient}, + net::{ClientIdentity, HttpShardTransport, HttpTransport, MpcHelperClient}, AppSetup, }; use tracing::{error, info}; @@ -158,7 +158,7 @@ async fn server(args: ServerArgs) -> Result<(), BoxError> { Some(handler), ); - let _app = setup.connect(transport.clone()); + let _app = setup.connect(transport.clone(), HttpShardTransport); let listener = args.server_socket_fd .map(|fd| { diff --git a/ipa-core/src/helpers/buffers/ordering_sender.rs b/ipa-core/src/helpers/buffers/ordering_sender.rs index b2a9e9ec7..531508227 100644 --- a/ipa-core/src/helpers/buffers/ordering_sender.rs +++ b/ipa-core/src/helpers/buffers/ordering_sender.rs @@ -524,7 +524,7 @@ mod test { use super::OrderingSender; use crate::{ ff::{Fp31, Fp32BitPrime, Gf20Bit, Gf9Bit, Serializable, U128Conversions}, - helpers::Message, + helpers::MpcMessage, rand::thread_rng, sync::Arc, test_executor::run, @@ -622,7 +622,7 @@ mod test { >; // Given a message, returns a closure that sends the message and increments an associated record index. - fn send_fn(m: M) -> BoxedSendFn { + fn send_fn(m: M) -> BoxedSendFn { Box::new(|s: &OrderingSender, i: &mut usize| { let fut = s.send(*i, m).boxed(); *i += 1; diff --git a/ipa-core/src/helpers/gateway/mod.rs b/ipa-core/src/helpers/gateway/mod.rs index d973d6c6f..740d4fefd 100644 --- a/ipa-core/src/helpers/gateway/mod.rs +++ b/ipa-core/src/helpers/gateway/mod.rs @@ -6,23 +6,26 @@ mod transport; use std::num::NonZeroUsize; -pub(super) use receive::ReceivingEnd; +pub(super) use receive::{MpcReceivingEnd, ShardReceivingEnd}; pub(super) use send::SendingEnd; -#[cfg(all(test, feature = "shuttle"))] -use shuttle::future as tokio; #[cfg(feature = "stall-detection")] pub(super) use stall_detection::InstrumentedGateway; +pub use transport::RoleResolvingTransport; use crate::{ helpers::{ buffers::UnorderedReceiver, gateway::{ - receive::GatewayReceivers, send::GatewaySenders, transport::RoleResolvingTransport, + receive::{GatewayReceivers, ShardReceiveStream, UR}, + send::GatewaySenders, + transport::Transports, }, - transport::routing::RouteId, - HelperChannelId, LogErrors, Message, Role, RoleAssignment, TotalRecords, Transport, + HelperChannelId, LogErrors, Message, MpcMessage, RecordsStream, Role, RoleAssignment, + ShardChannelId, TotalRecords, Transport, }, protocol::QueryId, + sharding::ShardIndex, + sync::{Arc, Mutex}, }; /// Alias for the currently configured transport. @@ -30,17 +33,25 @@ use crate::{ /// To avoid proliferation of type parameters, most code references this concrete type alias, rather /// than a type parameter `T: Transport`. #[cfg(feature = "in-memory-infra")] -pub type TransportImpl = super::transport::InMemoryTransport; +type TransportImpl = super::transport::InMemoryTransport; +#[cfg(feature = "in-memory-infra")] +pub type MpcTransportImpl = TransportImpl; +#[cfg(feature = "in-memory-infra")] +pub type ShardTransportImpl = TransportImpl; #[cfg(feature = "real-world-infra")] -pub type TransportImpl = crate::sync::Arc; +type TransportImpl = crate::sync::Arc; +#[cfg(feature = "real-world-infra")] +pub type MpcTransportImpl = TransportImpl; +#[cfg(feature = "real-world-infra")] +pub type ShardTransportImpl = crate::net::HttpShardTransport; -pub type TransportError = ::Error; +pub type MpcTransportError = ::Error; /// Gateway into IPA Network infrastructure. It allows helpers send and receive messages. pub struct Gateway { config: GatewayConfig, - transport: RoleResolvingTransport, + transports: Transports, query_id: QueryId, #[cfg(feature = "stall-detection")] inner: crate::sync::Arc, @@ -50,8 +61,10 @@ pub struct Gateway { #[derive(Default)] pub struct State { - senders: GatewaySenders, - receivers: GatewayReceivers, + mpc_senders: GatewaySenders, + mpc_receivers: GatewayReceivers, + shard_senders: GatewaySenders, + shard_receivers: GatewayReceivers, } #[derive(Clone, Copy, Debug)] @@ -73,15 +86,19 @@ impl Gateway { query_id: QueryId, config: GatewayConfig, roles: RoleAssignment, - transport: TransportImpl, + mpc_transport: MpcTransportImpl, + shard_transport: ShardTransportImpl, ) -> Self { #[allow(clippy::useless_conversion)] // not useless in stall-detection build Self { query_id, config, - transport: RoleResolvingTransport { - roles, - inner: transport, + transports: Transports { + mpc: RoleResolvingTransport { + roles, + inner: mpc_transport, + }, + shard: shard_transport, }, inner: State::default().into(), } @@ -89,7 +106,7 @@ impl Gateway { #[must_use] pub fn role(&self) -> Role { - self.transport.identity() + self.transports.mpc.identity() } #[must_use] @@ -97,52 +114,75 @@ impl Gateway { &self.config } + /// Returns a sender suitable for sending data between MPC helpers. The data must be approved + /// for sending by implementing [`MpcMessage`] trait. + /// + /// Do not remove the test below, it verifies that we don't allow raw sharings to be sent + /// between MPC helpers without using secure reveal. + /// + /// ```compile_fail + /// use ipa_core::helpers::Gateway; + /// use ipa_core::secret_sharing::replicated::semi_honest::AdditiveShare; + /// use ipa_core::ff::Fp32BitPrime; + /// + /// let gateway: Gateway = todo!(); + /// let mpc_channel = gateway.get_mpc_sender::>(todo!(), todo!()); + /// ``` /// /// ## Panics /// If there is a failure connecting via HTTP #[must_use] - pub fn get_sender( + pub fn get_mpc_sender( &self, channel_id: &HelperChannelId, total_records: TotalRecords, - ) -> send::SendingEnd { - let (tx, maybe_stream) = self.inner.senders.get_or_create::( + ) -> send::SendingEnd { + let transport = &self.transports.mpc; + let channel = self.inner.mpc_senders.get::( channel_id, + transport, self.config.active_work(), + self.query_id, total_records, ); - if let Some(stream) = maybe_stream { - tokio::spawn({ - let channel_id = channel_id.clone(); - let transport = self.transport.clone(); - let query_id = self.query_id; - async move { - // TODO(651): In the HTTP case we probably need more robust error handling here. - transport - .send( - channel_id.peer, - (RouteId::Records, query_id, channel_id.gate), - stream, - ) - .await - .expect("{channel_id:?} receiving end should be accepted by transport"); - } - }); - } - send::SendingEnd::new(tx, self.role(), channel_id) + send::SendingEnd::new(channel, transport.identity()) + } + + /// Returns a sender for shard-to-shard traffic. This sender is more relaxed compared to one + /// returned by [`Self::get_mpc_sender`] as it allows anything that can be serialized into bytes + /// to be sent out. MPC sender needs to be more careful about it and not to allow sending sensitive + /// information to be accidentally revealed. + /// An example of such sensitive data could be secret sharings - it is perfectly fine to send them + /// between shards as they are known to each helper anyway. Sending them across MPC helper boundary + /// could lead to information reveal. + pub fn get_shard_sender( + &self, + channel_id: &ShardChannelId, + total_records: TotalRecords, + ) -> send::SendingEnd { + let transport = &self.transports.shard; + let channel = self.inner.shard_senders.get::( + channel_id, + transport, + self.config.active_work(), + self.query_id, + total_records, + ); + + send::SendingEnd::new(channel, transport.identity()) } #[must_use] - pub fn get_receiver( + pub fn get_mpc_receiver( &self, channel_id: &HelperChannelId, - ) -> receive::ReceivingEnd { - receive::ReceivingEnd::new( + ) -> receive::MpcReceivingEnd { + receive::MpcReceivingEnd::new( channel_id.clone(), - self.inner.receivers.get_or_create(channel_id, || { + self.inner.mpc_receivers.get_or_create(channel_id, || { UnorderedReceiver::new( - Box::pin(LogErrors::new(self.transport.receive( + Box::pin(LogErrors::new(self.transports.mpc.receive( channel_id.peer, (self.query_id, channel_id.gate.clone()), ))), @@ -151,6 +191,33 @@ impl Gateway { }), ) } + + /// Requests a stream of records to be received from the given shard. In contrast with + /// [`Self::get_mpc_receiver`] stream, items in this stream are available in FIFO order only. + pub fn get_shard_receiver( + &self, + channel_id: &ShardChannelId, + ) -> receive::ShardReceivingEnd { + let mut called_before = true; + let rx = self.inner.shard_receivers.get_or_create(channel_id, || { + called_before = false; + ShardReceiveStream(Arc::new(Mutex::new( + self.transports + .shard + .receive(channel_id.peer, (self.query_id, channel_id.gate.clone())), + ))) + }); + + assert!( + !called_before, + "Shard receiver {channel_id:?} can only be created once" + ); + + receive::ShardReceivingEnd { + channel_id: channel_id.clone(), + rx: RecordsStream::new(rx), + } + } } impl Default for GatewayConfig { @@ -192,13 +259,19 @@ impl GatewayConfig { mod tests { use std::iter::{repeat, zip}; - use futures_util::future::{join, try_join, try_join_all}; + use futures::{ + future::{join, try_join, try_join_all}, + stream::StreamExt, + }; use crate::{ - ff::{Fp31, Fp32BitPrime, Gf2, U128Conversions}, - helpers::{Direction, GatewayConfig, Message, Role, SendingEnd}, + ff::{boolean_array::BA3, Fp31, Fp32BitPrime, Gf2, U128Conversions}, + helpers::{Direction, GatewayConfig, MpcMessage, Role, SendingEnd}, protocol::{context::Context, RecordId}, - test_fixture::{Runner, TestWorld, TestWorldConfig}, + secret_sharing::replicated::semi_honest::AdditiveShare, + sharding::ShardConfiguration, + test_executor::run, + test_fixture::{Reconstruct, Runner, TestWorld, TestWorldConfig, WithShards}, }; /// Verifies that [`Gateway`] send buffer capacity is adjusted to the message size. @@ -208,7 +281,7 @@ mod tests { /// Gateway must be able to deal with it. #[tokio::test] async fn can_handle_heterogeneous_channels() { - async fn send(channel: &SendingEnd, i: usize) { + async fn send(channel: &SendingEnd, i: usize) { channel .send(i.into(), V::truncate_from(u128::try_from(i).unwrap())) .await @@ -380,6 +453,65 @@ mod tests { let _world = unsafe { Box::from_raw(world_ptr) }; } + #[test] + fn shards() { + run(|| async move { + let world = TestWorld::>::with_shards(TestWorldConfig::default()); + shard_comms_test(&world).await; + }); + } + + #[test] + #[should_panic( + expected = "Shard receiver channel[ShardIndex(1),\"protocol/iter0\"] can only be created once" + )] + fn shards_receive_twice() { + run(|| async move { + let world = TestWorld::>::with_shards(TestWorldConfig::default()); + world + .semi_honest(Vec::<()>::new().into_iter(), |ctx, _| async move { + let peer = ctx.peer_shards().next().unwrap(); + let recv1 = ctx.shard_recv_channel::(peer); + let recv2 = ctx.shard_recv_channel::(peer); + drop(recv1); + drop(recv2); + }) + .await; + }); + } + + async fn shard_comms_test(test_world: &TestWorld>) { + let input = vec![BA3::truncate_from(0_u32), BA3::truncate_from(1_u32)]; + + let r = test_world + .semi_honest(input.clone().into_iter(), |ctx, input| async move { + let ctx = ctx.set_total_records(input.len()); + // Swap shares between shards, works only for 2 shards. + let peer = ctx.peer_shards().next().unwrap(); + for (record_id, item) in input.into_iter().enumerate() { + ctx.shard_send_channel(peer) + .send(record_id.into(), item) + .await + .unwrap(); + } + + let mut r = Vec::>::new(); + let mut recv_channel = ctx.shard_recv_channel(peer); + while let Some(v) = recv_channel.next().await { + r.push(v.unwrap()); + } + + r + }) + .await + .into_iter() + .flat_map(|v| v.reconstruct()) + .collect::>(); + + let reverse_input = input.into_iter().rev().collect::>(); + assert_eq!(reverse_input, r); + } + fn make_world() -> (&'static TestWorld, *mut TestWorld) { let world = Box::leak(Box::::default()); let world_ptr = world as *mut _; diff --git a/ipa-core/src/helpers/gateway/receive.rs b/ipa-core/src/helpers/gateway/receive.rs index a98166e9f..ad2ccbf61 100644 --- a/ipa-core/src/helpers/gateway/receive.rs +++ b/ipa-core/src/helpers/gateway/receive.rs @@ -1,36 +1,61 @@ -use std::marker::PhantomData; +use std::{ + marker::PhantomData, + pin::Pin, + task::{Context, Poll}, +}; use bytes::Bytes; use dashmap::{mapref::entry::Entry, DashMap}; +use futures::Stream; +use pin_project::pin_project; use crate::{ error::BoxError, helpers::{ - buffers::UnorderedReceiver, gateway::transport::RoleResolvingTransport, Error, - HelperChannelId, LogErrors, Message, Role, Transport, + buffers::UnorderedReceiver, gateway::transport::RoleResolvingTransport, + transport::SingleRecordStream, ChannelId, Error, HelperChannelId, LogErrors, Message, + MpcMessage, Role, ShardChannelId, ShardTransportImpl, Transport, TransportIdentity, }, protocol::RecordId, + sync::{Arc, Mutex}, }; -/// Receiving end of the gateway channel. -pub struct ReceivingEnd { +/// Receiving end of the MPC gateway channel. +/// I tried to make it generic and work for both MPC and Shard connectors, but ran into +/// "implementation of `S` is not general enough" issue on the client side (reveal). It may be another +/// occurrence of [`gat`] issue +/// +/// [`gat`]: https://github.com/rust-lang/rust/issues/100013 +pub struct MpcReceivingEnd { channel_id: HelperChannelId, unordered_rx: UR, _phantom: PhantomData, } +#[pin_project] +pub struct ShardReceivingEnd { + pub(super) channel_id: ShardChannelId, + #[pin] + pub(super) rx: SingleRecordStream, +} + /// Receiving channels, indexed by (role, step). -#[derive(Default)] -pub(super) struct GatewayReceivers { - pub(super) inner: DashMap, +pub(super) struct GatewayReceivers { + pub(super) inner: DashMap, S>, } -pub(super) type UR = UnorderedReceiver< +pub type UR = UnorderedReceiver< LogErrors<::RecordsStream, Bytes, BoxError>, Vec, >; -impl ReceivingEnd { +/// Stream of records received from a peer shard. +#[derive(Clone)] +pub struct ShardReceiveStream( + pub(super) Arc::RecordsStream>>, +); + +impl MpcReceivingEnd { pub(super) fn new(channel_id: HelperChannelId, rx: UR) -> Self { Self { channel_id, @@ -61,8 +86,24 @@ impl ReceivingEnd { } } -impl GatewayReceivers { - pub fn get_or_create UR>(&self, channel_id: &HelperChannelId, ctr: F) -> UR { +impl Stream for ShardReceivingEnd { + type Item = Result; + + fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + self.project().rx.poll_next(cx) + } +} + +impl Default for GatewayReceivers { + fn default() -> Self { + Self { + inner: DashMap::default(), + } + } +} + +impl GatewayReceivers { + pub fn get_or_create S>(&self, channel_id: &ChannelId, ctr: F) -> S { // TODO: raw entry API if it becomes available to avoid cloning the key match self.inner.entry(channel_id.clone()) { Entry::Occupied(entry) => entry.get().clone(), @@ -75,3 +116,11 @@ impl GatewayReceivers { } } } + +impl Stream for ShardReceiveStream { + type Item = <::RecordsStream as Stream>::Item; + + fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(self.0.lock().unwrap()).as_mut().poll_next(cx) + } +} diff --git a/ipa-core/src/helpers/gateway/send.rs b/ipa-core/src/helpers/gateway/send.rs index 473deb486..72e147c61 100644 --- a/ipa-core/src/helpers/gateway/send.rs +++ b/ipa-core/src/helpers/gateway/send.rs @@ -8,11 +8,16 @@ use std::{ use dashmap::{mapref::entry::Entry, DashMap}; use futures::Stream; +#[cfg(all(test, feature = "shuttle"))] +use shuttle::future as tokio; use typenum::Unsigned; use crate::{ - helpers::{buffers::OrderingSender, Error, HelperChannelId, Message, Role, TotalRecords}, - protocol::RecordId, + helpers::{ + buffers::OrderingSender, routing::RouteId, ChannelId, Error, Message, TotalRecords, + Transport, TransportIdentity, + }, + protocol::{QueryId, RecordId}, sync::Arc, telemetry::{ labels::{ROLE, STEP}, @@ -21,31 +26,37 @@ use crate::{ }; /// Sending end of the gateway channel. -pub struct SendingEnd { - sender_role: Role, - channel_id: HelperChannelId, - inner: Arc, +pub struct SendingEnd { + sender_id: I, + inner: Arc>, _phantom: PhantomData, } -/// Sending channels, indexed by (role, step). -#[derive(Default)] -pub(super) struct GatewaySenders { - pub(super) inner: DashMap>, +/// Sending channels, indexed by identity and gate. +pub(super) struct GatewaySenders { + pub(super) inner: DashMap, Arc>>, } -pub(super) struct GatewaySender { - channel_id: HelperChannelId, +pub(super) struct GatewaySender { + channel_id: ChannelId, ordering_tx: OrderingSender, total_records: TotalRecords, } -pub(super) struct GatewaySendStream { - inner: Arc, +struct GatewaySendStream { + inner: Arc>, +} + +impl Default for GatewaySenders { + fn default() -> Self { + Self { + inner: DashMap::default(), + } + } } -impl GatewaySender { - fn new(channel_id: HelperChannelId, tx: OrderingSender, total_records: TotalRecords) -> Self { +impl GatewaySender { + fn new(channel_id: ChannelId, tx: OrderingSender, total_records: TotalRecords) -> Self { Self { channel_id, ordering_tx: tx, @@ -57,7 +68,7 @@ impl GatewaySender { &self, record_id: RecordId, msg: B, - ) -> Result<(), Error> { + ) -> Result<(), Error> { debug_assert!( self.total_records.is_specified(), "total_records cannot be unspecified when sending" @@ -94,15 +105,10 @@ impl GatewaySender { } } -impl SendingEnd { - pub(super) fn new( - sender: Arc, - role: Role, - channel_id: &HelperChannelId, - ) -> Self { +impl SendingEnd { + pub(super) fn new(sender: Arc>, id: I) -> Self { Self { - sender_role: role, - channel_id: channel_id.clone(), + sender_id: id, inner: sender, _phantom: PhantomData, } @@ -117,32 +123,38 @@ impl SendingEnd { /// call. /// /// [`set_total_records`]: crate::protocol::context::Context::set_total_records - #[tracing::instrument(level = "trace", "send", skip_all, fields(i = %record_id, total = %self.inner.total_records, to = ?self.channel_id.peer, gate = ?self.channel_id.gate.as_ref()))] - pub async fn send>(&self, record_id: RecordId, msg: B) -> Result<(), Error> { + #[tracing::instrument(level = "trace", "send", skip_all, fields( + i = %record_id, + total = %self.inner.total_records, + to = ?self.inner.channel_id.peer, + gate = ?self.inner.channel_id.gate.as_ref() + ))] + pub async fn send>(&self, record_id: RecordId, msg: B) -> Result<(), Error> { let r = self.inner.send(record_id, msg).await; metrics::increment_counter!(RECORDS_SENT, - STEP => self.channel_id.gate.as_ref().to_string(), - ROLE => self.sender_role.as_static_str() + STEP => self.inner.channel_id.gate.as_ref().to_string(), + ROLE => self.sender_id.as_str(), ); metrics::counter!(BYTES_SENT, M::Size::U64, - STEP => self.channel_id.gate.as_ref().to_string(), - ROLE => self.sender_role.as_static_str() + STEP => self.inner.channel_id.gate.as_ref().to_string(), + ROLE => self.sender_id.as_str(), ); r } } -impl GatewaySenders { - /// Returns or creates a new communication channel. In case if channel is newly created, - /// returns the receiving end of it as well. It must be send over to the receiver in order for - /// messages to get through. - pub(crate) fn get_or_create( +impl GatewaySenders { + /// Returns a communication channel for the given [`ChannelId`]. If it does not exist, it will + /// be created using the provided [`Transport`] implementation. + pub fn get>( &self, - channel_id: &HelperChannelId, + channel_id: &ChannelId, + transport: &T, capacity: NonZeroUsize, + query_id: QueryId, total_records: TotalRecords, // TODO track children for indeterminate senders - ) -> (Arc, Option) { + ) -> Arc> { assert!( total_records.is_specified(), "unspecified total records for {channel_id:?}" @@ -150,44 +162,64 @@ impl GatewaySenders { // TODO: raw entry API would be nice to have here but it's not exposed yet match self.inner.entry(channel_id.clone()) { - Entry::Occupied(entry) => (Arc::clone(entry.get()), None), + Entry::Occupied(entry) => Arc::clone(entry.get()), Entry::Vacant(entry) => { - // Spare buffer is not required when messages have uniform size and buffer is a - // multiple of that size. - const SPARE: usize = 0; - // a little trick - if number of records is indeterminate, set the capacity to one - // message. Any send will wake the stream reader then, effectively disabling - // buffering. This mode is clearly inefficient, so avoid using this mode. - let write_size = if total_records.is_indeterminate() { - NonZeroUsize::new(M::Size::USIZE).unwrap() - } else { - // capacity is defined in terms of number of elements, while sender wants bytes - // so perform the conversion here - capacity - .checked_mul( - NonZeroUsize::new(M::Size::USIZE) - .expect("Message size should be greater than 0"), - ) - .expect("capacity should not overflow") - }; - - let sender = Arc::new(GatewaySender::new( - channel_id.clone(), - OrderingSender::new(write_size, SPARE), - total_records, - )); + let sender = Self::new_sender::(capacity, channel_id.clone(), total_records); entry.insert(Arc::clone(&sender)); - ( - Arc::clone(&sender), - Some(GatewaySendStream { inner: sender }), - ) + tokio::spawn({ + let ChannelId { peer, gate } = channel_id.clone(); + let transport = transport.clone(); + let stream = GatewaySendStream { + inner: Arc::clone(&sender), + }; + async move { + // TODO(651): In the HTTP case we probably need more robust error handling here. + transport + .send(peer, (RouteId::Records, query_id, gate), stream) + .await + .expect("{channel_id:?} receiving end should be accepted by transport"); + } + }); + + sender } } } + + fn new_sender( + capacity: NonZeroUsize, + channel_id: ChannelId, + total_records: TotalRecords, + ) -> Arc> { + // Spare buffer is not required when messages have uniform size and buffer is a + // multiple of that size. + const SPARE: usize = 0; + // a little trick - if number of records is indeterminate, set the capacity to one + // message. Any send will wake the stream reader then, effectively disabling + // buffering. This mode is clearly inefficient, so avoid using this mode. + let write_size = if total_records.is_indeterminate() { + NonZeroUsize::new(M::Size::USIZE).unwrap() + } else { + // capacity is defined in terms of number of elements, while sender wants bytes + // so perform the conversion here + capacity + .checked_mul( + NonZeroUsize::new(M::Size::USIZE) + .expect("Message size should be greater than 0"), + ) + .expect("capacity should not overflow") + }; + + Arc::new(GatewaySender::new( + channel_id, + OrderingSender::new(write_size, SPARE), + total_records, + )) + } } -impl Stream for GatewaySendStream { +impl Stream for GatewaySendStream { type Item = Vec; fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { diff --git a/ipa-core/src/helpers/gateway/stall_detection.rs b/ipa-core/src/helpers/gateway/stall_detection.rs index 654fbb11c..2e1f24267 100644 --- a/ipa-core/src/helpers/gateway/stall_detection.rs +++ b/ipa-core/src/helpers/gateway/stall_detection.rs @@ -73,11 +73,12 @@ mod gateway { use super::{receive, send, AtomicUsize, Debug, Formatter, ObserveState, Observed, Weak}; use crate::{ helpers::{ - gateway::{Gateway, State}, - GatewayConfig, HelperChannelId, Message, ReceivingEnd, Role, RoleAssignment, - SendingEnd, TotalRecords, TransportImpl, + gateway::{Gateway, ShardTransportImpl, State}, + GatewayConfig, HelperChannelId, Message, MpcMessage, MpcReceivingEnd, MpcTransportImpl, + Role, RoleAssignment, SendingEnd, ShardChannelId, ShardReceivingEnd, TotalRecords, }, protocol::QueryId, + sharding::ShardIndex, sync::Arc, }; @@ -105,13 +106,14 @@ mod gateway { query_id: QueryId, config: GatewayConfig, roles: RoleAssignment, - transport: TransportImpl, + mpc_transport: MpcTransportImpl, + shard_transport: ShardTransportImpl, ) -> Self { let version = Arc::new(AtomicUsize::default()); let r = Self::wrap( Arc::downgrade(&version), InstrumentedGateway { - gateway: Gateway::new(query_id, config, roles, transport), + gateway: Gateway::new(query_id, config, roles, mpc_transport, shard_transport), _sn: version, }, ); @@ -147,22 +149,50 @@ mod gateway { } #[must_use] - pub fn get_sender( + pub fn get_mpc_sender( &self, channel_id: &HelperChannelId, total_records: TotalRecords, - ) -> SendingEnd { + ) -> SendingEnd { Observed::wrap( Weak::clone(self.get_sn()), - self.inner().gateway.get_sender(channel_id, total_records), + self.inner() + .gateway + .get_mpc_sender(channel_id, total_records), + ) + } + + pub fn get_shard_sender( + &self, + channel_id: &ShardChannelId, + total_records: TotalRecords, + ) -> SendingEnd { + Observed::wrap( + Weak::clone(self.get_sn()), + self.inner + .gateway + .get_shard_sender(channel_id, total_records), ) } #[must_use] - pub fn get_receiver(&self, channel_id: &HelperChannelId) -> ReceivingEnd { + pub fn get_mpc_receiver( + &self, + channel_id: &HelperChannelId, + ) -> MpcReceivingEnd { Observed::wrap( Weak::clone(self.get_sn()), - self.inner().gateway.get_receiver(channel_id), + self.inner().gateway.get_mpc_receiver(channel_id), + ) + } + + pub fn get_shard_receiver( + &self, + channel_id: &ShardChannelId, + ) -> ShardReceivingEnd { + Observed::wrap( + Weak::clone(self.get_sn()), + self.inner().gateway.get_shard_receiver(channel_id), ) } @@ -175,17 +205,25 @@ mod gateway { } } - pub struct GatewayWaitingTasks { - senders_state: Option, - receivers_state: Option, + pub struct GatewayWaitingTasks { + mpc_send: Option, + mpc_recv: Option, + shard_send: Option, + shard_recv: Option, } - impl Debug for GatewayWaitingTasks { + impl Debug for GatewayWaitingTasks { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - if let Some(senders_state) = &self.senders_state { + if let Some(senders_state) = &self.mpc_send { write!(f, "\n{{{senders_state:?}\n}}")?; } - if let Some(receivers_state) = &self.receivers_state { + if let Some(receivers_state) = &self.mpc_recv { + write!(f, "\n{{{receivers_state:?}\n}}")?; + } + if let Some(senders_state) = &self.shard_send { + write!(f, "\n{{{senders_state:?}\n}}")?; + } + if let Some(receivers_state) = &self.shard_recv { write!(f, "\n{{{receivers_state:?}\n}}")?; } @@ -194,15 +232,27 @@ mod gateway { } impl ObserveState for Weak { - type State = GatewayWaitingTasks; + type State = GatewayWaitingTasks< + send::WaitingTasks, + receive::WaitingTasks, + send::WaitingTasks, + receive::WaitingTasks, + >; fn get_state(&self) -> Option { self.upgrade().and_then(|state| { - match (state.senders.get_state(), state.receivers.get_state()) { - (None, None) => None, - (senders_state, receivers_state) => Some(Self::State { - senders_state, - receivers_state, + match ( + state.mpc_senders.get_state(), + state.mpc_receivers.get_state(), + state.shard_senders.get_state(), + state.shard_receivers.get_state(), + ) { + (None, None, None, None) => None, + (mpc_send, mpc_recv, shard_send, shard_recv) => Some(Self::State { + mpc_send, + mpc_recv, + shard_send, + shard_recv, }), } }) @@ -214,19 +264,27 @@ mod receive { use std::{ collections::BTreeMap, fmt::{Debug, Formatter}, + pin::Pin, + task::{Context, Poll}, }; + use futures::Stream; + use super::{ObserveState, Observed}; use crate::{ helpers::{ error::Error, - gateway::{receive::GatewayReceivers, ReceivingEnd}, - HelperChannelId, Message, Role, + gateway::{ + receive::{GatewayReceivers, ShardReceiveStream, ShardReceivingEnd, UR}, + MpcReceivingEnd, + }, + ChannelId, Message, MpcMessage, Role, TransportIdentity, }, protocol::RecordId, + sharding::ShardIndex, }; - impl Observed> { + impl Observed> { delegate::delegate! { to { self.advance(); self.inner() } { #[inline] @@ -235,9 +293,18 @@ mod receive { } } - pub struct WaitingTasks(BTreeMap>); + impl Stream for Observed> { + type Item = as Stream>::Item; + + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + self.advance(); + Pin::new(&mut self.inner).poll_next(cx) + } + } - impl Debug for WaitingTasks { + pub struct WaitingTasks(BTreeMap, Vec>); + + impl Debug for WaitingTasks { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { for (channel, records) in &self.0 { write!( @@ -251,8 +318,8 @@ mod receive { } } - impl ObserveState for GatewayReceivers { - type State = WaitingTasks; + impl ObserveState for GatewayReceivers { + type State = WaitingTasks; fn get_state(&self) -> Option { let mut map = BTreeMap::default(); @@ -266,6 +333,23 @@ mod receive { (!map.is_empty()).then_some(WaitingTasks(map)) } } + + impl ObserveState for GatewayReceivers { + type State = WaitingTasks; + + fn get_state(&self) -> Option { + let mut map = BTreeMap::default(); + for entry in &self.inner { + let channel = entry.key(); + map.insert( + channel.clone(), + vec!["Shard receiver state is not implemented yet".to_string()], + ); + } + + (!map.is_empty()).then_some(WaitingTasks(map)) + } + } } mod send { @@ -280,23 +364,23 @@ mod send { helpers::{ error::Error, gateway::send::{GatewaySender, GatewaySenders}, - HelperChannelId, Message, Role, TotalRecords, + ChannelId, Message, TotalRecords, TransportIdentity, }, protocol::RecordId, }; - impl Observed> { + impl Observed> { delegate::delegate! { to { self.advance(); self.inner() } { #[inline] - pub async fn send>(&self, record_id: RecordId, msg: B) -> Result<(), Error>; + pub async fn send>(&self, record_id: RecordId, msg: B) -> Result<(), Error>; } } } - pub struct WaitingTasks(BTreeMap)>); + pub struct WaitingTasks(BTreeMap, (TotalRecords, Vec)>); - impl Debug for WaitingTasks { + impl Debug for WaitingTasks { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { for (channel, (total, records)) in &self.0 { write!( @@ -310,8 +394,8 @@ mod send { } } - impl ObserveState for GatewaySenders { - type State = WaitingTasks; + impl ObserveState for GatewaySenders { + type State = WaitingTasks; fn get_state(&self) -> Option { let mut state = BTreeMap::new(); @@ -327,7 +411,7 @@ mod send { } } - impl ObserveState for GatewaySender { + impl ObserveState for GatewaySender { type State = Vec; fn get_state(&self) -> Option { diff --git a/ipa-core/src/helpers/gateway/transport.rs b/ipa-core/src/helpers/gateway/transport.rs index 43840ce4a..a014ce0c7 100644 --- a/ipa-core/src/helpers/gateway/transport.rs +++ b/ipa-core/src/helpers/gateway/transport.rs @@ -3,15 +3,16 @@ use futures::Stream; use crate::{ helpers::{ - transport::routing::RouteId, NoResourceIdentifier, QueryIdBinding, Role, RoleAssignment, - RouteParams, StepBinding, Transport, TransportImpl, + transport::routing::RouteId, MpcTransportImpl, NoResourceIdentifier, QueryIdBinding, Role, + RoleAssignment, RouteParams, StepBinding, Transport, }, protocol::{step::Gate, QueryId}, + sharding::ShardIndex, }; #[derive(Debug, thiserror::Error)] #[error("Failed to send to {0:?}: {1:?}")] -pub struct SendToRoleError(Role, ::Error); +pub struct SendToRoleError(Role, ::Error); /// Transport adapter that resolves [`Role`] -> [`HelperIdentity`] mapping. As gateways created /// per query, it is not ambiguous. @@ -20,13 +21,19 @@ pub struct SendToRoleError(Role, ::Error); #[derive(Clone)] pub struct RoleResolvingTransport { pub(super) roles: RoleAssignment, - pub(super) inner: TransportImpl, + pub(super) inner: MpcTransportImpl, +} + +/// Set of transports used inside [`super::Gateway`]. +pub(super) struct Transports, S: Transport> { + pub mpc: M, + pub shard: S, } #[async_trait] impl Transport for RoleResolvingTransport { type Identity = Role; - type RecordsStream = ::RecordsStream; + type RecordsStream = ::RecordsStream; type Error = SendToRoleError; fn identity(&self) -> Role { diff --git a/ipa-core/src/helpers/mod.rs b/ipa-core/src/helpers/mod.rs index e6416b565..2d7ea2183 100644 --- a/ipa-core/src/helpers/mod.rs +++ b/ipa-core/src/helpers/mod.rs @@ -13,6 +13,7 @@ mod gateway; pub(crate) mod prss_protocol; pub mod stream; mod transport; + use std::ops::{Index, IndexMut}; /// to validate that transport can actually send streams of this type @@ -24,14 +25,17 @@ use serde::{Deserialize, Serialize, Serializer}; #[cfg(feature = "stall-detection")] mod gateway_exports { + use crate::helpers::{ gateway, gateway::{stall_detection::Observed, InstrumentedGateway}, }; pub type Gateway = Observed; - pub type SendingEnd = Observed>; - pub type ReceivingEnd = Observed>; + pub type SendingEnd = Observed>; + + pub type MpcReceivingEnd = Observed>; + pub type ShardReceivingEnd = Observed>; } #[cfg(not(feature = "stall-detection"))] @@ -39,15 +43,18 @@ mod gateway_exports { use crate::helpers::gateway; pub type Gateway = gateway::Gateway; - pub type SendingEnd = gateway::SendingEnd; - pub type ReceivingEnd = gateway::ReceivingEnd; + pub type SendingEnd = gateway::SendingEnd; + pub type MpcReceivingEnd = gateway::MpcReceivingEnd; + pub type ShardReceivingEnd = gateway::ShardReceivingEnd; } pub use gateway::GatewayConfig; // TODO: this type should only be available within infra. Right now several infra modules // are exposed at the root level. That makes it impossible to have a proper hierarchy here. -pub use gateway::{TransportError, TransportImpl}; -pub use gateway_exports::{Gateway, ReceivingEnd, SendingEnd}; +pub use gateway::{ + MpcTransportError, MpcTransportImpl, RoleResolvingTransport, ShardTransportImpl, +}; +pub use gateway_exports::{Gateway, MpcReceivingEnd, SendingEnd, ShardReceivingEnd}; pub use prss_protocol::negotiate as negotiate_prss; #[cfg(feature = "web-app")] pub use transport::WrappedAxumBodyStream; @@ -70,6 +77,7 @@ use crate::{ }, protocol::{step::Gate, RecordId}, secret_sharing::Sendable, + sharding::ShardIndex, }; // TODO work with ArrayLength only @@ -81,7 +89,7 @@ pub const MESSAGE_PAYLOAD_SIZE_BYTES: usize = MessagePayloadArrayLen::USIZE; /// represents a helper's role within an MPC protocol, which may be different per protocol. /// `HelperIdentity` will be established at startup and then never change. Components that want to /// resolve this identifier into something (Uri, encryption keys, etc) must consult configuration -#[derive(Copy, Clone, Eq, PartialEq, Hash, Deserialize)] +#[derive(Copy, Clone, Eq, PartialEq, Hash, PartialOrd, Ord, Deserialize)] #[serde(try_from = "usize")] pub struct HelperIdentity { id: u8, @@ -226,7 +234,6 @@ pub enum Role { #[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr(test, derive(PartialEq, Eq))] -#[serde(transparent)] pub struct RoleAssignment { helper_roles: [HelperIdentity; 3], } @@ -397,7 +404,7 @@ impl TryFrom<[Role; 3]> for RoleAssignment { /// Combination of helper role and step that uniquely identifies a single channel of communication /// between two helpers. #[derive(Clone, Eq, PartialEq, Hash, Ord, PartialOrd)] -pub struct ChannelId { +pub struct ChannelId { /// Entity we are talking to through this channel. It can be a source or a destination. pub peer: I, // TODO: step could be either reference or owned value. references are convenient to use inside @@ -406,6 +413,7 @@ pub struct ChannelId { } pub type HelperChannelId = ChannelId; +pub type ShardChannelId = ChannelId; impl ChannelId { #[must_use] @@ -420,12 +428,21 @@ impl Debug for ChannelId { } } -/// Trait for messages sent between helpers. Everything needs to be serializable and safe to send. +/// Trait for messages that can be communicated over the network. +pub trait Message: Debug + Send + Serializable + 'static {} + +/// Trait for messages that may be sent between MPC helpers. Sending raw field values may be OK, +/// sending secret shares is most definitely not OK. +/// +/// This trait is not implemented for [`SecretShares`] types and there is a doctest inside [`Gateway`] +/// module that ensures compile errors are generated in this case. /// -/// Infrastructure's `Message` trait corresponds to IPA's `Sendable` trait. -pub trait Message: Debug + Send + Serializable + 'static + Sized {} +/// [`SecretShares`]: crate::secret_sharing::replicated::ReplicatedSecretSharing +/// [`Gateway`]: crate::helpers::gateway::Gateway::get_mpc_sender +pub trait MpcMessage: Message {} -impl Message for V {} +impl MpcMessage for V {} +impl Message for V {} impl Serializable for PublicKey { type Size = typenum::U32; @@ -442,7 +459,7 @@ impl Serializable for PublicKey { } } -impl Message for PublicKey {} +impl MpcMessage for PublicKey {} #[derive(Clone, Copy, Debug)] pub enum TotalRecords { diff --git a/ipa-core/src/helpers/prss_protocol.rs b/ipa-core/src/helpers/prss_protocol.rs index 348a36596..001ee9f24 100644 --- a/ipa-core/src/helpers/prss_protocol.rs +++ b/ipa-core/src/helpers/prss_protocol.rs @@ -37,10 +37,10 @@ pub async fn negotiate( let right_channel = ChannelId::new(gateway.role().peer(Direction::Right), step.clone()); let total_records = TotalRecords::from(1); - let left_sender = gateway.get_sender::(&left_channel, total_records); - let right_sender = gateway.get_sender::(&right_channel, total_records); - let left_receiver = gateway.get_receiver::(&left_channel); - let right_receiver = gateway.get_receiver::(&right_channel); + let left_sender = gateway.get_mpc_sender::(&left_channel, total_records); + let right_sender = gateway.get_mpc_sender::(&right_channel, total_records); + let left_receiver = gateway.get_mpc_receiver::(&left_channel); + let right_receiver = gateway.get_mpc_receiver::(&right_channel); // setup local prss endpoint let ep_setup = prss::Endpoint::prepare(rng); diff --git a/ipa-core/src/helpers/transport/in_memory/sharding.rs b/ipa-core/src/helpers/transport/in_memory/sharding.rs index 23175e375..7457711b4 100644 --- a/ipa-core/src/helpers/transport/in_memory/sharding.rs +++ b/ipa-core/src/helpers/transport/in_memory/sharding.rs @@ -64,6 +64,14 @@ impl InMemoryShardNetwork { Arc::downgrade(&self.shard_network[2][shard_id]), ] } + + pub fn reset(&self) { + for helper in &self.shard_network { + for shard in helper.iter() { + shard.reset(); + } + } + } } #[cfg(all(test, unit_test))] @@ -149,4 +157,29 @@ mod tests { assert!(h3.upgrade().is_none()); }); } + + #[test] + fn reset() { + async fn test_send(network: &InMemoryShardNetwork) { + let (_tx, rx) = mpsc::channel(1); + let src_shard = ShardIndex::FIRST; + let dst_shard = ShardIndex::from(1); + network + .transport(HelperIdentity::ONE, src_shard) + .send( + dst_shard, + (RouteId::Records, QueryId, Gate::default()), + ReceiverStream::new(rx), + ) + .await + .unwrap(); + } + + run(|| async { + let shard_network = InMemoryShardNetwork::with_shards(2); + test_send(&shard_network).await; + shard_network.reset(); + test_send(&shard_network).await; + }); + } } diff --git a/ipa-core/src/helpers/transport/mod.rs b/ipa-core/src/helpers/transport/mod.rs index 202d9fbad..8071085ae 100644 --- a/ipa-core/src/helpers/transport/mod.rs +++ b/ipa-core/src/helpers/transport/mod.rs @@ -1,4 +1,8 @@ -use std::{borrow::Borrow, fmt::Debug, hash::Hash}; +use std::{ + borrow::{Borrow, Cow}, + fmt::Debug, + hash::Hash, +}; use async_trait::async_trait; use futures::Stream; @@ -25,8 +29,8 @@ pub use receive::{LogErrors, ReceiveRecords}; #[cfg(feature = "web-app")] pub use stream::WrappedAxumBodyStream; pub use stream::{ - BodyStream, BytesStream, LengthDelimitedStream, RecordsStream, StreamCollection, StreamKey, - WrappedBoxBodyStream, + BodyStream, BytesStream, LengthDelimitedStream, RecordsStream, SingleRecordStream, + StreamCollection, StreamKey, WrappedBoxBodyStream, }; use crate::{ @@ -36,14 +40,30 @@ use crate::{ /// An identity of a peer that can be communicated with using [`Transport`]. There are currently two /// types of peers - helpers and shards. -pub trait Identity: Copy + Clone + Debug + PartialEq + Eq + Hash + Send + Sync + 'static {} +pub trait Identity: + Copy + Clone + Debug + PartialEq + Eq + PartialOrd + Ord + Hash + Send + Sync + 'static +{ + fn as_str<'a>(&self) -> Cow<'a, str>; +} -impl Identity for ShardIndex {} -impl Identity for HelperIdentity {} +impl Identity for ShardIndex { + fn as_str<'a>(&self) -> Cow<'a, str> { + Cow::Owned(self.to_string()) + } +} +impl Identity for HelperIdentity { + fn as_str<'a>(&self) -> Cow<'a, str> { + Cow::Owned(self.id.to_string()) + } +} /// Role is an identifier of helper peer, only valid within a given query. For every query, there /// exists a static mapping from role to helper identity. -impl Identity for Role {} +impl Identity for Role { + fn as_str<'a>(&self) -> Cow<'a, str> { + Cow::Borrowed(Role::as_static_str(self)) + } +} pub trait ResourceIdentifier: Sized {} pub trait QueryIdBinding: Sized diff --git a/ipa-core/src/helpers/transport/receive.rs b/ipa-core/src/helpers/transport/receive.rs index 15fa7d4d9..557a10fc9 100644 --- a/ipa-core/src/helpers/transport/receive.rs +++ b/ipa-core/src/helpers/transport/receive.rs @@ -89,7 +89,7 @@ impl ReceiveRecords /// Converts this into a stream that yields owned byte chunks. /// /// ## Panics - /// If inner stream yields an [`Err`] chunk. + /// If inner stream yields [`Err`] chunk. pub(crate) fn into_bytes_stream(self) -> impl Stream> { self.inner.map(Result::unwrap).map(Into::into) } diff --git a/ipa-core/src/helpers/transport/stream/input.rs b/ipa-core/src/helpers/transport/stream/input.rs index e091cac28..02b312795 100644 --- a/ipa-core/src/helpers/transport/stream/input.rs +++ b/ipa-core/src/helpers/transport/stream/input.rs @@ -115,12 +115,9 @@ impl BufDeque { self.read_bytes(T::Size::USIZE) .map(|bytes| T::deserialize_infallible(GenericArray::from_slice(&bytes))) } - /// Attempts to deserialize a single instance of `T` from the buffer. - /// Returns `None` if there is insufficient data available /// - /// ## Errors - /// Returns a deserialization error if `T` rejects the bytes from this buffer. + /// Returns `None` if there is insufficient data available, and an error if deserialization fails. fn try_read(&mut self) -> Option> { self.read_bytes(T::Size::USIZE) .map(|bytes| T::deserialize(GenericArray::from_slice(&bytes))) @@ -220,6 +217,8 @@ where phantom_data: PhantomData<(T, M)>, } +pub type SingleRecordStream = RecordsStream; + impl RecordsStream where S: BytesStream, diff --git a/ipa-core/src/helpers/transport/stream/mod.rs b/ipa-core/src/helpers/transport/stream/mod.rs index 053b6033c..17fe29e3a 100644 --- a/ipa-core/src/helpers/transport/stream/mod.rs +++ b/ipa-core/src/helpers/transport/stream/mod.rs @@ -12,7 +12,7 @@ pub use box_body::WrappedBoxBodyStream; use bytes::Bytes; pub use collection::{StreamCollection, StreamKey}; use futures::Stream; -pub use input::{LengthDelimitedStream, RecordsStream}; +pub use input::{LengthDelimitedStream, RecordsStream, SingleRecordStream}; use crate::error::BoxError; diff --git a/ipa-core/src/net/mod.rs b/ipa-core/src/net/mod.rs index 5d5c83e03..734512411 100644 --- a/ipa-core/src/net/mod.rs +++ b/ipa-core/src/net/mod.rs @@ -9,4 +9,4 @@ mod transport; pub use client::{ClientIdentity, MpcHelperClient}; pub use error::Error; pub use server::{MpcHelperServer, TracingSpanMaker}; -pub use transport::HttpTransport; +pub use transport::{HttpShardTransport, HttpTransport}; diff --git a/ipa-core/src/net/transport.rs b/ipa-core/src/net/transport.rs index 79a80bea7..786a4a492 100644 --- a/ipa-core/src/net/transport.rs +++ b/ipa-core/src/net/transport.rs @@ -20,10 +20,12 @@ use crate::{ }, net::{client::MpcHelperClient, error::Error, MpcHelperServer}, protocol::{step::Gate, QueryId}, + sharding::ShardIndex, sync::Arc, }; /// HTTP transport for IPA helper service. +/// TODO: rename to MPC pub struct HttpTransport { identity: HelperIdentity, clients: [MpcHelperClient; 3], @@ -33,6 +35,10 @@ pub struct HttpTransport { handler: Option, } +/// A stub for HTTP transport implementation, suitable for serviing inter-shard traffic +#[derive(Clone, Default)] +pub struct HttpShardTransport; + impl RouteParams for QueryConfig { type Params = String; @@ -224,6 +230,42 @@ impl Transport for Arc { } } +#[async_trait] +impl Transport for HttpShardTransport { + type Identity = ShardIndex; + type RecordsStream = ReceiveRecords; + type Error = (); + + fn identity(&self) -> Self::Identity { + unimplemented!() + } + + async fn send( + &self, + _dest: Self::Identity, + _route: R, + _data: D, + ) -> Result<(), Self::Error> + where + Option: From, + Option: From, + Q: QueryIdBinding, + S: StepBinding, + R: RouteParams, + D: Stream> + Send + 'static, + { + unimplemented!() + } + + fn receive>( + &self, + _from: Self::Identity, + _route: R, + ) -> Self::RecordsStream { + unimplemented!() + } +} + #[cfg(all(test, web_test))] mod tests { use std::{iter::zip, net::TcpListener, task::Poll}; @@ -323,7 +365,7 @@ mod tests { ); server.start_on(Some(socket), ()).await; - setup.connect(transport) + setup.connect(transport, HttpShardTransport) }, ), ) diff --git a/ipa-core/src/protocol/context/malicious.rs b/ipa-core/src/protocol/context/malicious.rs index ef03a0dcf..75900aeca 100644 --- a/ipa-core/src/protocol/context/malicious.rs +++ b/ipa-core/src/protocol/context/malicious.rs @@ -10,7 +10,10 @@ use ipa_macros::Step; use super::{UpgradeContext, UpgradeToMalicious}; use crate::{ error::Error, - helpers::{ChannelId, Gateway, Message, ReceivingEnd, Role, SendingEnd, TotalRecords}, + helpers::{ + ChannelId, Gateway, Message, MpcMessage, MpcReceivingEnd, Role, SendingEnd, + ShardReceivingEnd, TotalRecords, + }, protocol::{ basics::{ mul::malicious::Step::RandomnessForValidation, SecureMul, ShareKnownValue, @@ -32,7 +35,7 @@ use crate::{ ReplicatedSecretSharing, }, seq_join::SeqJoin, - sharding::NotSharded, + sharding::{NotSharded, ShardIndex}, sync::Arc, }; @@ -112,13 +115,21 @@ impl<'a> super::Context for Context<'a> { self.inner.prss_rng() } - fn send_channel(&self, role: Role) -> SendingEnd { + fn send_channel(&self, role: Role) -> SendingEnd { self.inner.send_channel(role) } - fn recv_channel(&self, role: Role) -> ReceivingEnd { + fn shard_send_channel(&self, dest_shard: ShardIndex) -> SendingEnd { + self.inner.shard_send_channel(dest_shard) + } + + fn recv_channel(&self, role: Role) -> MpcReceivingEnd { self.inner.recv_channel(role) } + + fn shard_recv_channel(&self, origin: ShardIndex) -> ShardReceivingEnd { + self.inner.shard_recv_channel(origin) + } } impl<'a> UpgradableContext for Context<'a> { @@ -326,16 +337,29 @@ impl<'a, F: ExtendableField> super::Context for Upgraded<'a, F> { ) } - fn send_channel(&self, role: Role) -> SendingEnd { + fn send_channel(&self, role: Role) -> SendingEnd { + self.inner + .gateway + .get_mpc_sender(&ChannelId::new(role, self.gate.clone()), self.total_records) + } + + fn shard_send_channel(&self, dest_shard: ShardIndex) -> SendingEnd { + self.inner.gateway.get_shard_sender( + &ChannelId::new(dest_shard, self.gate.clone()), + self.total_records, + ) + } + + fn recv_channel(&self, role: Role) -> MpcReceivingEnd { self.inner .gateway - .get_sender(&ChannelId::new(role, self.gate.clone()), self.total_records) + .get_mpc_receiver(&ChannelId::new(role, self.gate.clone())) } - fn recv_channel(&self, role: Role) -> ReceivingEnd { + fn shard_recv_channel(&self, origin: ShardIndex) -> ShardReceivingEnd { self.inner .gateway - .get_receiver(&ChannelId::new(role, self.gate.clone())) + .get_shard_receiver(&ChannelId::new(origin, self.gate.clone())) } } diff --git a/ipa-core/src/protocol/context/mod.rs b/ipa-core/src/protocol/context/mod.rs index 3bf6de8c7..1c0ef05bd 100644 --- a/ipa-core/src/protocol/context/mod.rs +++ b/ipa-core/src/protocol/context/mod.rs @@ -23,7 +23,10 @@ pub type ShardedSemiHonestContext<'a> = semi_honest::Context<'a, Sharded>; use crate::{ error::Error, - helpers::{ChannelId, Gateway, Message, ReceivingEnd, Role, SendingEnd, TotalRecords}, + helpers::{ + ChannelId, Gateway, Message, MpcMessage, MpcReceivingEnd, Role, SendingEnd, + ShardReceivingEnd, TotalRecords, + }, protocol::{ basics::ZeroPositions, prss::Endpoint as PrssEndpoint, @@ -87,8 +90,26 @@ pub trait Context: Clone + Send + Sync + SeqJoin { InstrumentedSequentialSharedRandomness, ); - fn send_channel(&self, role: Role) -> SendingEnd; - fn recv_channel(&self, role: Role) -> ReceivingEnd; + /// Open a communication channel to an MPC peer. This channel can be requested multiple times + /// and this method is safe to use in multi-threaded environments. + fn send_channel(&self, role: Role) -> SendingEnd; + + /// Open a communication channel to another shard within the same MPC helper. Similarly to + /// [`Self::send_channel`], it can be requested more than once for the same channel and from + /// multiple threads, but it should not be required. See [`Self::shard_recv_channel`]. + fn shard_send_channel(&self, dest_shard: ShardIndex) -> SendingEnd; + + /// Requests data to be received from another MPC helper. Receive requests [`MpcReceivingEnd::receive`] + /// can be issued from multiple threads. + fn recv_channel(&self, role: Role) -> MpcReceivingEnd; + + /// Request a stream to be received from a peer shard within the same MPC helper. This method + /// can be called only once per communication channel. + /// + /// ## Panics + /// If called more than once for the same origin and on context instance, narrowed to the same + /// [`Self::gate`]. + fn shard_recv_channel(&self, origin: ShardIndex) -> ShardReceivingEnd; } pub trait UpgradableContext: Context { @@ -252,16 +273,29 @@ impl<'a, B: ShardBinding> Context for Base<'a, B> { ) } - fn send_channel(&self, role: Role) -> SendingEnd { + fn send_channel(&self, role: Role) -> SendingEnd { + self.inner + .gateway + .get_mpc_sender(&ChannelId::new(role, self.gate.clone()), self.total_records) + } + + fn shard_send_channel(&self, dest_shard: ShardIndex) -> SendingEnd { + self.inner.gateway.get_shard_sender( + &ChannelId::new(dest_shard, self.gate.clone()), + self.total_records, + ) + } + + fn recv_channel(&self, role: Role) -> MpcReceivingEnd { self.inner .gateway - .get_sender(&ChannelId::new(role, self.gate.clone()), self.total_records) + .get_mpc_receiver(&ChannelId::new(role, self.gate.clone())) } - fn recv_channel(&self, role: Role) -> ReceivingEnd { + fn shard_recv_channel(&self, origin: ShardIndex) -> ShardReceivingEnd { self.inner .gateway - .get_receiver(&ChannelId::new(role, self.gate.clone())) + .get_shard_receiver(&ChannelId::new(origin, self.gate.clone())) } } diff --git a/ipa-core/src/protocol/context/semi_honest.rs b/ipa-core/src/protocol/context/semi_honest.rs index c742c02e5..b08812968 100644 --- a/ipa-core/src/protocol/context/semi_honest.rs +++ b/ipa-core/src/protocol/context/semi_honest.rs @@ -11,7 +11,10 @@ use ipa_macros::Step; use super::{Context as SuperContext, UpgradeContext, UpgradeToMalicious}; use crate::{ error::Error, - helpers::{Gateway, Message, ReceivingEnd, Role, SendingEnd, TotalRecords}, + helpers::{ + Gateway, Message, MpcMessage, MpcReceivingEnd, Role, SendingEnd, ShardReceivingEnd, + TotalRecords, + }, protocol::{ basics::{ShareKnownValue, ZeroPositions}, context::{ @@ -117,13 +120,21 @@ impl<'a, B: ShardBinding> super::Context for Context<'a, B> { self.inner.prss_rng() } - fn send_channel(&self, role: Role) -> SendingEnd { + fn send_channel(&self, role: Role) -> SendingEnd { self.inner.send_channel(role) } - fn recv_channel(&self, role: Role) -> ReceivingEnd { + fn shard_send_channel(&self, dest_shard: ShardIndex) -> SendingEnd { + self.inner.shard_send_channel(dest_shard) + } + + fn recv_channel(&self, role: Role) -> MpcReceivingEnd { self.inner.recv_channel(role) } + + fn shard_recv_channel(&self, origin: ShardIndex) -> ShardReceivingEnd { + self.inner.shard_recv_channel(origin) + } } impl<'a, B: ShardBinding> UpgradableContext for Context<'a, B> { @@ -201,13 +212,21 @@ impl<'a, B: ShardBinding, F: ExtendableField> super::Context for Upgraded<'a, B, self.inner.prss_rng() } - fn send_channel(&self, role: Role) -> SendingEnd { + fn send_channel(&self, role: Role) -> SendingEnd { self.inner.send_channel(role) } - fn recv_channel(&self, role: Role) -> ReceivingEnd { + fn shard_send_channel(&self, dest_shard: ShardIndex) -> SendingEnd { + self.inner.shard_send_channel(dest_shard) + } + + fn recv_channel(&self, role: Role) -> MpcReceivingEnd { self.inner.recv_channel(role) } + + fn shard_recv_channel(&self, origin: ShardIndex) -> ShardReceivingEnd { + self.inner.shard_recv_channel(origin) + } } impl<'a, B: ShardBinding, F: ExtendableField> SeqJoin for Upgraded<'a, B, F> { diff --git a/ipa-core/src/protocol/ipa_prf/shuffle/base.rs b/ipa-core/src/protocol/ipa_prf/shuffle/base.rs index 7f0b92283..ec752f7ac 100644 --- a/ipa-core/src/protocol/ipa_prf/shuffle/base.rs +++ b/ipa-core/src/protocol/ipa_prf/shuffle/base.rs @@ -6,7 +6,7 @@ use rand::{distributions::Standard, prelude::Distribution, seq::SliceRandom, Rng use crate::{ error::Error, - helpers::{Direction, ReceivingEnd, Role}, + helpers::{Direction, MpcReceivingEnd, Role}, protocol::{context::Context, RecordId}, secret_sharing::{ replicated::{semi_honest::AdditiveShare, ReplicatedSecretSharing}, @@ -335,7 +335,7 @@ where S: SharedValue, { let role = ctx.role().peer(direction); - let receive_channel: ReceivingEnd = ctx + let receive_channel: MpcReceivingEnd = ctx .narrow(step) .set_total_records(batch_size) .recv_channel(role); diff --git a/ipa-core/src/query/processor.rs b/ipa-core/src/query/processor.rs index a003e95ac..00723fcee 100644 --- a/ipa-core/src/query/processor.rs +++ b/ipa-core/src/query/processor.rs @@ -9,7 +9,8 @@ use crate::{ error::Error as ProtocolError, helpers::{ query::{PrepareQuery, QueryConfig, QueryInput}, - Gateway, GatewayConfig, Role, RoleAssignment, Transport, TransportError, TransportImpl, + Gateway, GatewayConfig, MpcTransportError, MpcTransportImpl, Role, RoleAssignment, + ShardTransportImpl, Transport, }, hpke::{KeyPair, KeyRegistry}, protocol::QueryId, @@ -57,7 +58,7 @@ pub enum NewQueryError { #[error(transparent)] State(#[from] StateError), #[error(transparent)] - Transport(#[from] TransportError), + MpcTransport(#[from] MpcTransportError), } #[derive(thiserror::Error, Debug)] @@ -132,7 +133,7 @@ impl Processor { #[allow(clippy::missing_panics_doc)] pub async fn new_query( &self, - transport: TransportImpl, + transport: MpcTransportImpl, req: QueryConfig, ) -> Result { let query_id = QueryId; @@ -158,7 +159,7 @@ impl Processor { transport.send(right, prepare_request.clone(), stream::empty()), ) .await - .map_err(NewQueryError::Transport)?; + .map_err(NewQueryError::MpcTransport)?; handle.set_state(QueryState::AwaitingInputs(query_id, req, roles))?; @@ -176,7 +177,7 @@ impl Processor { /// if query is already running or this helper cannot be a follower in it pub fn prepare( &self, - transport: &TransportImpl, + transport: &MpcTransportImpl, req: PrepareQuery, ) -> Result<(), PrepareQueryError> { let my_role = req.roles.role(transport.identity()); @@ -207,7 +208,8 @@ impl Processor { /// If failed to obtain exclusive access to the query collection. pub fn receive_inputs( &self, - transport: TransportImpl, + mpc_transport: MpcTransportImpl, + shard_transport: ShardTransportImpl, input: QueryInput, ) -> Result<(), QueryInputError> { let mut queries = self.queries.inner.lock().unwrap(); @@ -223,7 +225,8 @@ impl Processor { query_id, GatewayConfig::from(&config), role_assignment, - transport, + mpc_transport, + shard_transport, ); queries.insert( input.query_id, @@ -443,7 +446,7 @@ mod tests { assert!(matches!( p0.new_query(t0, request).await.unwrap_err(), - NewQueryError::Transport(_) + NewQueryError::MpcTransport(_) )); } @@ -465,7 +468,7 @@ mod tests { assert!(matches!( p0.new_query(t0, request).await.unwrap_err(), - NewQueryError::Transport(_) + NewQueryError::MpcTransport(_) )); } diff --git a/ipa-core/src/test_fixture/app.rs b/ipa-core/src/test_fixture/app.rs index 96d09fe59..86ab7d00b 100644 --- a/ipa-core/src/test_fixture/app.rs +++ b/ipa-core/src/test_fixture/app.rs @@ -7,7 +7,7 @@ use crate::{ ff::Serializable, helpers::{ query::{QueryConfig, QueryInput}, - ApiError, InMemoryMpcNetwork, + ApiError, InMemoryMpcNetwork, InMemoryShardNetwork, Transport, }, protocol::QueryId, query::QueryStatus, @@ -49,7 +49,8 @@ where /// [`TestWorld`]: crate::test_fixture::TestWorld pub struct TestApp { drivers: [HelperApp; 3], - network: InMemoryMpcNetwork, + mpc_network: InMemoryMpcNetwork, + shard_network: InMemoryShardNetwork, } fn unzip_tuple_array(input: [(T, U); 3]) -> ([T; 3], [U; 3]) { @@ -61,18 +62,23 @@ impl Default for TestApp { fn default() -> Self { let (setup, handlers) = unzip_tuple_array(array::from_fn(|_| AppSetup::new())); - let network = InMemoryMpcNetwork::new(handlers.map(Some)); - let drivers = network + let mpc_network = InMemoryMpcNetwork::new(handlers.map(Some)); + let shard_network = InMemoryShardNetwork::with_shards(1); + let drivers = mpc_network .transports() .iter() .zip(setup) - .map(|(t, s)| s.connect(Clone::clone(t))) + .map(|(t, s)| s.connect(Clone::clone(t), shard_network.transport(t.identity(), 0))) .collect::>() .try_into() - .map_err(|_| "infallible") + .ok() .unwrap(); - Self { drivers, network } + Self { + drivers, + mpc_network, + shard_network, + } } } @@ -131,7 +137,8 @@ impl TestApp { pub async fn complete_query(&self, query_id: QueryId) -> Result<[Vec; 3], ApiError> { let results = try_join3_array([0, 1, 2].map(|i| self.drivers[i].complete_query(query_id))).await; - self.network.reset(); + self.mpc_network.reset(); + self.shard_network.reset(); results } diff --git a/ipa-core/src/test_fixture/mod.rs b/ipa-core/src/test_fixture/mod.rs index e54e5eba4..e79bff05d 100644 --- a/ipa-core/src/test_fixture/mod.rs +++ b/ipa-core/src/test_fixture/mod.rs @@ -25,7 +25,7 @@ use rand::{distributions::Standard, prelude::Distribution, rngs::mock::StepRng}; use rand_core::{CryptoRng, RngCore}; pub use sharing::{get_bits, into_bits, Reconstruct, ReconstructArr}; #[cfg(feature = "in-memory-infra")] -pub use world::{Runner, TestExecutionStep, TestWorld, TestWorldConfig}; +pub use world::{Runner, TestExecutionStep, TestWorld, TestWorldConfig, WithShards}; use crate::{ ff::{Field, U128Conversions}, diff --git a/ipa-core/src/test_fixture/world.rs b/ipa-core/src/test_fixture/world.rs index 3cd252fae..16afd6f76 100644 --- a/ipa-core/src/test_fixture/world.rs +++ b/ipa-core/src/test_fixture/world.rs @@ -11,7 +11,7 @@ use tracing::{Instrument, Level, Span}; use crate::{ helpers::{ Gateway, GatewayConfig, HelperIdentity, InMemoryMpcNetwork, InMemoryShardNetwork, - InMemoryTransport, Role, RoleAssignment, + InMemoryTransport, Role, RoleAssignment, Transport, }, protocol::{ context::{ @@ -140,6 +140,7 @@ impl WithShards { /// for a single shard. /// /// It uses Round-robin strategy to distribute [`A`] across [`SHARDS`] + #[must_use] pub fn shard(input: Vec) -> [Vec; SHARDS] { let mut r: [_; SHARDS] = from_fn(|_| Vec::new()); for (i, share) in input.into_iter().enumerate() { @@ -539,14 +540,23 @@ impl ShardWorld { let participants = make_participants(&mut StdRng::seed_from_u64(config.seed + shard_seed)); let network = InMemoryMpcNetwork::default(); - let mut gateways = network.transports().map(|t| { - Gateway::new( - QueryId, - config.gateway_config, - config.role_assignment().clone(), - t, - ) - }); + let mut gateways: [_; 3] = network + .transports() + .iter() + .zip(transports.iter()) + .map(|(mpc, shard)| { + Gateway::new( + QueryId, + config.gateway_config, + config.role_assignment().clone(), + Transport::clone_ref(mpc), + Transport::clone_ref(shard), + ) + }) + .collect::>() + .try_into() + .ok() + .unwrap(); // The name for `g` is too complicated and depends on features enabled #[allow(clippy::redundant_closure_for_method_calls)] From 5eafa0a5c7effa75641b2a90ab34027c397a8cee Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Fri, 12 Apr 2024 10:42:53 -0400 Subject: [PATCH 125/135] Update codecov action version --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 3572e6e23..3a64be5b6 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -204,7 +204,7 @@ jobs: run: ./scripts/coverage-ci --lcov --output-path ipa.cov - name: Report to codecov.io - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} file: ipa.cov From b4763b013c6b2fde61c022407041478d7fe724ea Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 4 Apr 2024 15:35:21 -0700 Subject: [PATCH 126/135] IPA bench: log random seed and runtime at info level --- ipa-core/benches/oneshot/ipa.rs | 21 ++++++++++++++++++--- ipa-core/src/lib.rs | 2 ++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/ipa-core/benches/oneshot/ipa.rs b/ipa-core/benches/oneshot/ipa.rs index 7b4ddcce5..cc0ac25bf 100644 --- a/ipa-core/benches/oneshot/ipa.rs +++ b/ipa-core/benches/oneshot/ipa.rs @@ -1,4 +1,5 @@ use std::{ + env, num::{NonZeroU32, NonZeroU64, NonZeroUsize}, time::Instant, }; @@ -102,9 +103,11 @@ async fn run(args: Args) -> Result<(), Error> { gateway_config: GatewayConfig::new(args.active()), ..TestWorldConfig::default() }; + // Construct TestWorld early to initialize logging. + let world = TestWorld::new_with(&config); let seed = args.random_seed.unwrap_or_else(|| random()); - tracing::trace!( + tracing::info!( "Using random seed: {seed} for {q} records", q = args.query_size ); @@ -154,12 +157,11 @@ async fn run(args: Args) -> Result<(), Error> { &order, ); - let world = TestWorld::new_with(config.clone()); tracing::trace!("Preparation complete in {:?}", _prep_time.elapsed()); let _protocol_time = Instant::now(); test_oprf_ipa::(&world, raw_data, &expected_results, args.config()).await; - tracing::trace!( + tracing::info!( "{m:?} IPA for {q} records took {t:?}", m = args.mode, q = args.query_size, @@ -172,6 +174,19 @@ fn main() -> Result<(), Error> { #[cfg(feature = "dhat-heap")] let _profiler = dhat::Profiler::new_heap(); + // The default in test_fixture::logging is to enable logging for ipa-core only. Override that to + // include logs from the bench as well. + if env::var_os("RUST_LOG").is_none() { + env::set_var( + "RUST_LOG", + format!( + "{}=INFO,{}=INFO", + ipa_core::CRATE_NAME, + env!("CARGO_CRATE_NAME") + ), + ); + } + let args = Args::parse(); let rt = Builder::new_multi_thread() .worker_threads(args.threads) diff --git a/ipa-core/src/lib.rs b/ipa-core/src/lib.rs index 984ba0f12..58918af43 100644 --- a/ipa-core/src/lib.rs +++ b/ipa-core/src/lib.rs @@ -145,6 +145,8 @@ pub(crate) mod test_executor { } } +pub const CRATE_NAME: &str = env!("CARGO_CRATE_NAME"); + #[macro_export] macro_rules! const_assert { ($x:expr $(,)?) => { From 978f02246f0ac37b97cdbcd9e79fad22e00b52b9 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Thu, 11 Apr 2024 10:40:19 -0400 Subject: [PATCH 127/135] Transposes for vectorized aggregation Add additional macros in transpose implementation, to reduce repetitive code --- ipa-core/src/secret_sharing/decomposed.rs | 4 + .../src/secret_sharing/vector/transpose.rs | 670 ++++++++++++------ 2 files changed, 444 insertions(+), 230 deletions(-) diff --git a/ipa-core/src/secret_sharing/decomposed.rs b/ipa-core/src/secret_sharing/decomposed.rs index e96d8e322..4830715a4 100644 --- a/ipa-core/src/secret_sharing/decomposed.rs +++ b/ipa-core/src/secret_sharing/decomposed.rs @@ -118,6 +118,10 @@ impl BitDecomposed { pub fn resize(&mut self, new_len: usize, value: S) { self.bits.resize(new_len, value); } + + pub fn truncate(&mut self, len: usize) { + self.bits.truncate(len); + } } impl FromPrss for BitDecomposed> diff --git a/ipa-core/src/secret_sharing/vector/transpose.rs b/ipa-core/src/secret_sharing/vector/transpose.rs index d17a21b69..59536cf4f 100644 --- a/ipa-core/src/secret_sharing/vector/transpose.rs +++ b/ipa-core/src/secret_sharing/vector/transpose.rs @@ -1,4 +1,4 @@ -//! Bit matrix transpose operations. +//! # Bit matrix transpose operations //! //! These are used to convert data to and from vectorized representation. //! @@ -36,16 +36,14 @@ // This rule throws false positives on "MxN". #![allow(clippy::doc_markdown)] -#[cfg(any(all(test, unit_test), feature = "enable-benches"))] -use std::borrow::Borrow; -use std::{array, convert::Infallible}; +use std::{array, borrow::Borrow, convert::Infallible, ops::Deref}; use crate::{ const_assert_eq, error::{LengthError, UnwrapInfallible}, ff::{ boolean::Boolean, - boolean_array::{BA256, BA64}, + boolean_array::{BA16, BA256, BA3, BA5, BA64, BA8}, ec_prime_field::Fp25519, }, protocol::ipa_prf::{MK_BITS, PRF_CHUNK}, @@ -102,7 +100,6 @@ pub trait TransposeFrom { /// 8x8 bit matrix transpose. // // From Hacker's Delight (2nd edition), Figure 7-6. -#[cfg(any(all(test, unit_test), feature = "enable-benches"))] #[inline] pub fn transpose_8x8>(x: B) -> [u8; 8] { let mut x = u64::from_le_bytes(*x.borrow()); @@ -209,25 +206,265 @@ impl<'a> TransposeFrom<&'a [StdArray; 256]> for Vec { // Matrix transpose helpers -/// Perform a larger transpose using an 16x16 kernel. +macro_rules! read_ba_left_8_pad { + ($m:ident, $src:ident, $i:ident, $j:ident, $k:ident, $pad_value:expr) => { + $m[$k] = $src + .get(8 * $i + $k) + .unwrap_or($pad_value) + .left() + .as_raw_slice()[$j] + }; +} + +macro_rules! read_ba_right_8_pad { + ($m:ident, $src:ident, $i:ident, $j:ident, $k:ident, $pad_value:expr) => { + $m[$k] = $src + .get(8 * $i + $k) + .unwrap_or($pad_value) + .right() + .as_raw_slice()[$j] + }; +} + +macro_rules! write_ba_left_8 { + ($dst:ident, $m:ident, $i:ident, $j:ident, $k:ident) => { + $dst[8 * $i + $k].left_arr_mut().0[0].as_raw_mut_slice()[$j] = $m[$k] + }; +} + +macro_rules! write_ba_right_8 { + ($dst:ident, $m:ident, $i:ident, $j:ident, $k:ident) => { + $dst[8 * $i + $k].right_arr_mut().0[0].as_raw_mut_slice()[$j] = $m[$k] + }; +} + +macro_rules! read_bool_left_8 { + ($m:ident, $src:ident, $i:ident, $j:ident, $k:ident) => { + $m[$k] = $src[8 * $i + $k].left_arr().as_raw_slice()[$j] + }; +} + +macro_rules! read_bool_right_8 { + ($m:ident, $src:ident, $i:ident, $j:ident, $k:ident) => { + $m[$k] = $src[8 * $i + $k].right_arr().as_raw_slice()[$j] + }; +} + +macro_rules! write_bool_left_8 { + ($dst:ident, $m:ident, $i:ident, $j:ident, $k:ident) => { + $dst[8 * $i + $k].left_arr_mut().as_raw_mut_slice()[$j] = $m[$k] + }; +} + +macro_rules! write_bool_right_8 { + ($dst:ident, $m:ident, $i:ident, $j:ident, $k:ident) => { + $dst[8 * $i + $k].right_arr_mut().as_raw_mut_slice()[$j] = $m[$k] + }; +} + +macro_rules! read_ba_16 { + ($m:ident, $src:ident, $i:ident, $j:ident, $k:ident) => { + $m[2 * $k..2 * ($k + 1)] + .copy_from_slice(&$src[16 * $i + $k].as_raw_slice()[2 * $j..2 * ($j + 1)]) + }; +} + +macro_rules! read_ba_left_16 { + ($m:ident, $src:ident, $i:ident, $j:ident, $k:ident) => { + $m[2 * $k..2 * ($k + 1)] + .copy_from_slice(&$src[16 * $i + $k].left().as_raw_slice()[2 * $j..2 * ($j + 1)]) + }; +} + +macro_rules! read_ba_right_16 { + ($m:ident, $src:ident, $i:ident, $j:ident, $k:ident) => { + $m[2 * $k..2 * ($k + 1)] + .copy_from_slice(&$src[16 * $i + $k].right().as_raw_slice()[2 * $j..2 * ($j + 1)]) + }; +} + +macro_rules! read_ba_fn_left_16 { + ($m:ident, $src:ident, $i:ident, $j:ident, $k:ident) => { + $m[2 * $k..2 * ($k + 1)] + .copy_from_slice(&$src(16 * $i + $k).left().as_raw_slice()[2 * $j..2 * ($j + 1)]) + }; +} + +macro_rules! read_ba_fn_right_16 { + ($m:ident, $src:ident, $i:ident, $j:ident, $k:ident) => { + $m[2 * $k..2 * ($k + 1)] + .copy_from_slice(&$src(16 * $i + $k).right().as_raw_slice()[2 * $j..2 * ($j + 1)]) + }; +} + +macro_rules! write_ba_16 { + ($dst:ident, $m:ident, $i:ident, $j:ident, $k:ident) => { + $dst[16 * $i + $k].as_raw_mut_slice()[2 * $j..2 * ($j + 1)] + .copy_from_slice(&$m[2 * $k..2 * ($k + 1)]); + }; +} + +macro_rules! write_ba_left_16 { + ($dst:ident, $m:ident, $i:ident, $j:ident, $k:ident) => { + $dst[16 * $i + $k].left_arr_mut().0[0].as_raw_mut_slice()[2 * $j..2 * ($j + 1)] + .copy_from_slice(&$m[2 * $k..2 * ($k + 1)]); + }; +} + +macro_rules! write_ba_right_16 { + ($dst:ident, $m:ident, $i:ident, $j:ident, $k:ident) => { + $dst[16 * $i + $k].right_arr_mut().0[0].as_raw_mut_slice()[2 * $j..2 * ($j + 1)] + .copy_from_slice(&$m[2 * $k..2 * ($k + 1)]); + }; +} + +macro_rules! read_bool_left_16 { + ($m:ident, $src:ident, $i:ident, $j:ident, $k:ident) => { + $m[2 * $k..2 * ($k + 1)] + .copy_from_slice(&$src[16 * $i + $k].left_arr().as_raw_slice()[2 * $j..2 * ($j + 1)]) + }; +} + +macro_rules! read_bool_right_16 { + ($m:ident, $src:ident, $i:ident, $j:ident, $k:ident) => { + $m[2 * $k..2 * ($k + 1)] + .copy_from_slice(&$src[16 * $i + $k].right_arr().as_raw_slice()[2 * $j..2 * ($j + 1)]) + }; +} + +macro_rules! write_bool_left_16 { + ($dst:ident, $m:ident, $i:ident, $j:ident, $k:ident) => { + $dst[16 * $i + $k].left_arr_mut().as_raw_mut_slice()[2 * $j..2 * ($j + 1)] + .copy_from_slice(&$m[2 * $k..2 * ($k + 1)]) + }; +} + +macro_rules! write_bool_right_16 { + ($dst:ident, $m:ident, $i:ident, $j:ident, $k:ident) => { + $dst[16 * $i + $k].right_arr_mut().as_raw_mut_slice()[2 * $j..2 * ($j + 1)] + .copy_from_slice(&$m[2 * $k..2 * ($k + 1)]) + }; +} + +/// Implement a larger transpose using the 8x8 kernel. +/// +/// Matrix height and width must be multiples of 8. +macro_rules! impl_transpose_8 { + ($dst:ident, $src:ident, $src_rows:expr, $src_cols:expr, $read:ident, $write:ident $(,)?) => { + debug_assert!( + $src_rows % 8 == 0 && $src_cols % 8 == 0, + "This implementation requires that both dimensions are multiples of 8", + ); + + for i in 0..$src_rows / 8 { + for j in 0..$src_cols / 8 { + let mut m = [0u8; 8]; + for k in 0..8 { + $read!(m, $src, i, j, k); + } + let m_t = transpose_8x8(&m); + for k in 0..8 { + $write!($dst, m_t, j, i, k); + } + } + } + }; +} + +/// Implement a larger transpose using the 8x8 kernel. +/// +/// Matrix height and width do not need to be multiples of 8, however, the row stride in memory must +/// still be a multiple of 8 (i.e. whole bytes). +macro_rules! impl_transpose_8_pad { + ($dst:ident, $src:ident, $src_rows:expr, $src_cols:expr, $read:ident, $pad_value:expr, $write:ident $(,)?) => { + for i in 0..($src_rows + 7) / 8 { + for j in 0..($src_cols + 7) / 8 { + let mut m = [0u8; 8]; + for k in 0..8 { + $read!(m, $src, i, j, k, $pad_value); + } + let m_t = transpose_8x8(&m); + for k in 0..8 { + $write!($dst, m_t, j, i, k); + } + } + } + }; +} + +/// Implement a larger transpose using the 16x16 kernel. /// /// Matrix height and width must be multiples of 16. -#[inline] -fn do_transpose_16 [u8; 32], DF: FnMut(usize, usize, [u8; 32])>( - rows_div16: usize, - cols_div16: usize, - read_src: SF, - mut write_dst: DF, -) { - for i in 0..rows_div16 { - for j in 0..cols_div16 { - let m = read_src(i, j); - let m_t = transpose_16x16(&m); - write_dst(j, i, m_t); +macro_rules! impl_transpose_16 { + ($dst:ident, $src:ident, $src_rows:expr, $src_cols:expr, $read:ident, $write:ident $(,)?) => { + debug_assert!( + $src_rows % 16 == 0 && $src_cols % 16 == 0, + "This implementation requires that both dimensions are multiples of 16", + ); + + for i in 0..$src_rows / 16 { + for j in 0..$src_cols / 16 { + let mut m = [0u8; 32]; + for k in 0..16 { + $read!(m, $src, i, j, k); + } + let m_t = transpose_16x16(&m); + for k in 0..16 { + $write!($dst, m_t, j, i, k); + } + } } - } + }; +} + +macro_rules! transpose_shim_convert_src { + ($converted:ty, $expected_len:expr, $src:ident, LengthError) => { + <$converted>::try_from($src.deref()).map_err(|_| LengthError { + expected: $expected_len, + actual: $src.len(), + })? + }; + ($converted:ty, $expected_len:expr, $src:ident, Infallible) => { + $src + }; } +macro_rules! impl_transpose_shim { + ($src_ty:ty, $src_row:ty, $dst_ty:ty, $dst_row:ty, $src_rows:expr, $src_cols:expr, $error:tt $(,)?) => { + impl TransposeFrom<$src_ty> for $dst_ty { + type Error = $error; + fn transpose_from(&mut self, src: $src_ty) -> Result<(), Self::Error> { + self.resize($src_cols, <$dst_row>::ZERO); + let src = + transpose_shim_convert_src!(&[$src_row; $src_rows], $src_rows, src, $error); + let dst = <&mut [$dst_row; $src_cols]>::try_from(&mut **self).unwrap(); + dst.transpose_from(src).unwrap_infallible(); + Ok(()) + } + } + }; +} + +macro_rules! impl_transpose_shim_pad { + ($src_ty:ty, $src_row:ty, $dst_ty:ty, $dst_row:ty, $src_rows:expr, $src_cols:expr, $error:tt $(,)?) => { + impl TransposeFrom<$src_ty> for $dst_ty { + type Error = $error; + fn transpose_from(&mut self, src: $src_ty) -> Result<(), Self::Error> { + self.resize(($src_cols + 7) / 8 * 8, <$dst_row>::ZERO); + let src = + transpose_shim_convert_src!(&[$src_row; $src_rows], $src_rows, src, $error); + let dst = + <&mut [$dst_row; ($src_cols + 7) / 8 * 8]>::try_from(&mut **self).unwrap(); + dst.transpose_from(src).unwrap_infallible(); + self.truncate($src_cols); + Ok(()) + } + } + }; +} + +// Matrix transposes + /// Implement a transpose of a MxN bit matrix represented as `[BA{N}; {M}]` into a NxM bit matrix /// represented as `[BA{M}; {N}]`. /// @@ -235,30 +472,12 @@ fn do_transpose_16 [u8; 32], DF: FnMut(usize, usize, [u8 /// `impl_transpose_ba_to_ba!(BA16, BA64, 16, 64)`. Or to put it differently, write the MxN dimensions /// twice, first with BA in front, and then without. macro_rules! impl_transpose_ba_to_ba { - ($dst_row:ty, $src_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident) => { + ($dst_row:ty, $src_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident $(,)?) => { impl TransposeFrom<&[$src_row; $src_rows]> for [$dst_row; $src_cols] { type Error = Infallible; fn transpose_from(&mut self, src: &[$src_row; $src_rows]) -> Result<(), Infallible> { - do_transpose_16( - $src_rows / 16, - $src_cols / 16, - |i, j| { - let mut d = [0u8; 32]; - for k in 0..16 { - d[2 * k..2 * (k + 1)].copy_from_slice( - &src[16 * i + k].as_raw_slice()[2 * j..2 * (j + 1)], - ); - } - d - }, - |i, j, d| { - for k in 0..16 { - self[16 * i + k].as_raw_mut_slice()[2 * j..2 * (j + 1)] - .copy_from_slice(&d[2 * k..2 * (k + 1)]); - } - }, - ); + impl_transpose_16!(self, src, $src_rows, $src_cols, read_ba_16, write_ba_16); Ok(()) } } @@ -269,30 +488,25 @@ macro_rules! impl_transpose_ba_to_ba { tests::test_transpose_ba_to_ba::<$dst_row, $src_row, $src_rows, $src_cols>(); } - impl TransposeFrom<&BitDecomposed<$src_row>> for Vec<$dst_row> { - type Error = LengthError; - - fn transpose_from(&mut self, src: &BitDecomposed<$src_row>) -> Result<(), LengthError> { - self.resize($src_cols, <$dst_row>::ZERO); - let src = <&[$src_row; $src_rows]>::try_from(&**src).map_err(|_| LengthError { - expected: $src_rows, - actual: src.len(), - })?; - let dst = <&mut [$dst_row; $src_cols]>::try_from(&mut **self).unwrap(); - dst.transpose_from(src).unwrap_infallible(); - Ok(()) - } - } - - impl TransposeFrom<&[$src_row; $src_rows]> for Vec<$dst_row> { - type Error = Infallible; + impl_transpose_shim!( + &BitDecomposed<$src_row>, + $src_row, + Vec<$dst_row>, + $dst_row, + $src_rows, + $src_cols, + LengthError, + ); - fn transpose_from(&mut self, src: &[$src_row; $src_rows]) -> Result<(), Infallible> { - self.resize($src_cols, <$dst_row>::ZERO); - let dst = <&mut [$dst_row; $src_cols]>::try_from(&mut **self).unwrap(); - dst.transpose_from(src) - } - } + impl_transpose_shim!( + &[$src_row; $src_rows], + $src_row, + Vec<$dst_row>, + $dst_row, + $src_rows, + $src_cols, + Infallible, + ); }; } @@ -317,48 +531,8 @@ macro_rules! impl_transpose_shares_bool_to_ba { &mut self, src: &[AdditiveShare; $src_rows], ) -> Result<(), Infallible> { - // Transpose left share - do_transpose_16( - $src_rows / 16, - $src_cols / 16, - |i, j| { - let mut d = [0u8; 32]; - for k in 0..16 { - d[2 * k..2 * (k + 1)].copy_from_slice( - &src[16 * i + k].left_arr().as_raw_slice()[2 * j..2 * (j + 1)], - ); - } - d - }, - |i, j, d| { - for k in 0..16 { - self[16 * i + k].left_arr_mut().0[0].as_raw_mut_slice() - [2 * j..2 * (j + 1)] - .copy_from_slice(&d[2 * k..2 * (k + 1)]); - } - }, - ); - // Transpose right share - do_transpose_16( - $src_rows / 16, - $src_cols / 16, - |i, j| { - let mut d = [0u8; 32]; - for k in 0..16 { - d[2 * k..2 * (k + 1)].copy_from_slice( - &src[16 * i + k].right_arr().as_raw_slice()[2 * j..2 * (j + 1)], - ); - } - d - }, - |i, j, d| { - for k in 0..16 { - self[16 * i + k].right_arr_mut().0[0].as_raw_mut_slice() - [2 * j..2 * (j + 1)] - .copy_from_slice(&d[2 * k..2 * (k + 1)]); - } - }, - ); + impl_transpose_16!(self, src, $src_rows, $src_cols, read_bool_left_16, write_ba_left_16); + impl_transpose_16!(self, src, $src_rows, $src_cols, read_bool_right_16, write_ba_right_16); Ok(()) } } @@ -369,32 +543,54 @@ macro_rules! impl_transpose_shares_bool_to_ba { tests::test_transpose_shares_bool_to_ba::<$dst_row, $src_rows, $src_cols>(); } - impl TransposeFrom<&BitDecomposed>> - for Vec> + impl_transpose_shim!( + &BitDecomposed>, AdditiveShare, + Vec>, AdditiveShare<$dst_row>, + $src_rows, $src_cols, + LengthError, + ); + }; +} + +// Usage: Share conversion output (r/s). M = Fp25519::BITS, N = PRF_CHUNK. +impl_transpose_shares_bool_to_ba!(BA256, 256, 64, test_transpose_shares_bool_to_ba_256x64); + +macro_rules! impl_transpose_shares_bool_to_ba_small { + ($dst_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident) => { + impl TransposeFrom<&[AdditiveShare; $src_rows]> + for [AdditiveShare<$dst_row>; $src_cols] { - type Error = LengthError; + type Error = Infallible; fn transpose_from( &mut self, - src: &BitDecomposed>, - ) -> Result<(), LengthError> { - self.resize($src_cols, AdditiveShare::<$dst_row>::ZERO); - let src = <&[AdditiveShare; $src_rows]>::try_from(&**src) - .map_err(|_| LengthError { - expected: $src_rows, - actual: src.len(), - })?; - let dst = - <&mut [AdditiveShare<$dst_row>; $src_cols]>::try_from(&mut **self).unwrap(); - dst.transpose_from(src).unwrap_infallible(); + src: &[AdditiveShare; $src_rows], + ) -> Result<(), Infallible> { + impl_transpose_8!(self, src, $src_rows, $src_cols, read_bool_left_8, write_ba_left_8); + impl_transpose_8!(self, src, $src_rows, $src_cols, read_bool_right_8, write_ba_right_8); Ok(()) } } + + #[cfg(all(test, unit_test))] + #[test] + fn $test_fn() { + tests::test_transpose_shares_bool_to_ba::<$dst_row, $src_rows, $src_cols>(); + } + + impl_transpose_shim!( + &BitDecomposed>, AdditiveShare, + Vec>, AdditiveShare<$dst_row>, + $src_rows, $src_cols, + LengthError, + ); }; } -// Usage: Share conversion output (r/s). M = Fp25519::BITS, N = PRF_CHUNK. -impl_transpose_shares_bool_to_ba!(BA256, 256, 64, test_transpose_shares_bool_to_ba_256x64); +// Usage: Aggregation output. M = HV bits, N = number of breakdowns. +impl_transpose_shares_bool_to_ba_small!(BA8, 8, 256, test_transpose_shares_bool_to_ba_8x256); +impl_transpose_shares_bool_to_ba!(BA16, 16, 256, test_transpose_shares_bool_to_ba_16x256); +impl_transpose_shares_bool_to_ba!(BA16, 16, 32, test_transpose_shares_bool_to_ba_16x32); /// Implement a transpose of a MxN matrix of secret-shared bits represented as /// `[AdditiveShare>; M]` into a NxM bit matrix represented as `[AdditiveShare; N]`. @@ -410,46 +606,8 @@ macro_rules! impl_transpose_shares_ba_to_bool { &mut self, src: &[AdditiveShare<$src_row>; $src_rows], ) -> Result<(), Infallible> { - // Transpose left share - do_transpose_16( - $src_rows / 16, - $src_cols / 16, - |i, j| { - let mut d = [0u8; 32]; - for k in 0..16 { - d[2 * k..2 * (k + 1)].copy_from_slice( - &src[16 * i + k].left().as_raw_slice()[2 * j..2 * (j + 1)], - ); - } - d - }, - |i, j, d| { - for k in 0..16 { - self[16 * i + k].left_arr_mut().as_raw_mut_slice()[2 * j..2 * (j + 1)] - .copy_from_slice(&d[2 * k..2 * (k + 1)]); - } - }, - ); - // Transpose right share - do_transpose_16( - $src_rows / 16, - $src_cols / 16, - |i, j| { - let mut d = [0u8; 32]; - for k in 0..16 { - d[2 * k..2 * (k + 1)].copy_from_slice( - &src[16 * i + k].right().as_raw_slice()[2 * j..2 * (j + 1)], - ); - } - d - }, - |i, j, d| { - for k in 0..16 { - self[16 * i + k].right_arr_mut().as_raw_mut_slice()[2 * j..2 * (j + 1)] - .copy_from_slice(&d[2 * k..2 * (k + 1)]); - } - }, - ); + impl_transpose_16!(self, src, $src_rows, $src_cols, read_ba_left_16, write_bool_left_16); + impl_transpose_16!(self, src, $src_rows, $src_cols, read_ba_right_16, write_bool_right_16); Ok(()) } } @@ -460,21 +618,19 @@ macro_rules! impl_transpose_shares_ba_to_bool { tests::test_transpose_shares_ba_to_bool::<$src_row, $src_rows, $src_cols>(); } - impl TransposeFrom<&[AdditiveShare<$src_row>; $src_rows]> - for BitDecomposed> - { - type Error = Infallible; - fn transpose_from( - &mut self, - src: &[AdditiveShare<$src_row>; $src_rows], - ) -> Result<(), Infallible> { - self.resize($src_cols, AdditiveShare::::ZERO); - let dst = - <&mut [AdditiveShare; $src_cols]>::try_from(&mut **self) - .unwrap(); - dst.transpose_from(src) - } - } + impl_transpose_shim!( + &[AdditiveShare<$src_row>; $src_rows], AdditiveShare<$src_row>, + BitDecomposed>, AdditiveShare, + $src_rows, $src_cols, + Infallible, + ); + + impl_transpose_shim!( + &Vec>, AdditiveShare<$src_row>, + BitDecomposed>, AdditiveShare, + $src_rows, $src_cols, + LengthError, + ); }; } @@ -500,46 +656,8 @@ macro_rules! impl_transpose_shares_ba_fn_to_bool { &mut self, src: &dyn Fn(usize) -> AdditiveShare<$src_row>, ) -> Result<(), Infallible> { - // Transpose left share - do_transpose_16( - $src_rows / 16, - $src_cols / 16, - |i, j| { - let mut d = [0u8; 32]; - for k in 0..16 { - d[2 * k..2 * (k + 1)].copy_from_slice( - &src(16 * i + k).left().as_raw_slice()[2 * j..2 * (j + 1)], - ); - } - d - }, - |i, j, d| { - for k in 0..16 { - self[16 * i + k].left_arr_mut().as_raw_mut_slice()[2 * j..2 * (j + 1)] - .copy_from_slice(&d[2 * k..2 * (k + 1)]); - } - }, - ); - // Transpose right share - do_transpose_16( - $src_rows / 16, - $src_cols / 16, - |i, j| { - let mut d = [0u8; 32]; - for k in 0..16 { - d[2 * k..2 * (k + 1)].copy_from_slice( - &src(16 * i + k).right().as_raw_slice()[2 * j..2 * (j + 1)], - ); - } - d - }, - |i, j, d| { - for k in 0..16 { - self[16 * i + k].right_arr_mut().as_raw_mut_slice()[2 * j..2 * (j + 1)] - .copy_from_slice(&d[2 * k..2 * (k + 1)]); - } - }, - ); + impl_transpose_16!(self, src, $src_rows, $src_cols, read_ba_fn_left_16, write_bool_left_16); + impl_transpose_16!(self, src, $src_rows, $src_cols, read_ba_fn_right_16, write_bool_right_16); Ok(()) } } @@ -550,28 +668,77 @@ macro_rules! impl_transpose_shares_ba_fn_to_bool { tests::test_transpose_shares_ba_fn_to_bool::<$src_row, $src_rows, $src_cols>(); } - impl TransposeFrom<&dyn Fn(usize) -> AdditiveShare<$src_row>> - for BitDecomposed> + impl_transpose_shim!( + &dyn Fn(usize) -> AdditiveShare<$src_row>, AdditiveShare<$src_row>, + BitDecomposed>, AdditiveShare, + $src_rows, $src_cols, + Infallible, + ); + }; +} + +// Usage: Share conversion input (compute_prf_for_inputs). M = PRF_CHUNK, N = MK_BITS. +// Note first macro argument is `BA{N}`, not `BA{M}`. +impl_transpose_shares_ba_fn_to_bool!(BA64, 64, 64, test_transpose_shares_ba_fn_to_bool_64x64); + +/// Implement a transpose of a MxN matrix of secret-shared bits represented as +/// `[AdditiveShare>; M]` into a NxM bit matrix represented as `[AdditiveShare; N]`. +/// +/// For MxN = 16x64, the invocation looks like `impl_transpose_shares_ba_to_bool_small!(BA64, 16, 64)`. +/// +/// This version uses the 8x8 transpose kernel and supports dimensions that are not a multiple of 8. +macro_rules! impl_transpose_shares_ba_to_bool_small { + ($src_row:ty, $src_rows:expr, $src_cols:expr, $test_fn:ident) => { + impl TransposeFrom<&[AdditiveShare<$src_row>; $src_rows]> + for [AdditiveShare; ($src_cols + 7) / 8 * 8] { type Error = Infallible; - fn transpose_from( &mut self, - src: &dyn Fn(usize) -> AdditiveShare<$src_row>, + src: &[AdditiveShare<$src_row>; $src_rows], ) -> Result<(), Infallible> { - self.resize($src_cols, AdditiveShare::::ZERO); - let dst = - <&mut [AdditiveShare; $src_cols]>::try_from(&mut **self) - .unwrap(); - dst.transpose_from(src) + impl_transpose_8_pad!( + self, src, + $src_rows, $src_cols, + read_ba_left_8_pad, &AdditiveShare::<$src_row>::ZERO, + write_bool_left_8, + ); + impl_transpose_8_pad!( + self, src, + $src_rows, $src_cols, + read_ba_right_8_pad, &AdditiveShare::<$src_row>::ZERO, + write_bool_right_8, + ); + Ok(()) } } + + #[cfg(all(test, unit_test))] + #[test] + fn $test_fn() { + tests::test_transpose_shares_ba_to_bool_small::<$src_row, $src_rows, $src_cols>(); + } + + impl_transpose_shim_pad!( + &[AdditiveShare<$src_row>; $src_rows], AdditiveShare<$src_row>, + BitDecomposed>, AdditiveShare, + $src_rows, $src_cols, + Infallible, + ); + + impl_transpose_shim_pad!( + &Vec>, AdditiveShare<$src_row>, + BitDecomposed>, AdditiveShare, + $src_rows, $src_cols, + LengthError, + ); }; } -// Usage: Share conversion input (compute_prf_for_inputs). M = PRF_CHUNK, N = MK_BITS. -// Note first macro argument is `BA{N}`, not `BA{M}`. -impl_transpose_shares_ba_fn_to_bool!(BA64, 64, 64, test_transpose_shares_ba_fn_to_bool_64x64); +// Usage: Aggregation input. M = AGG_CHUNK, N = BK or TV bits. +impl_transpose_shares_ba_to_bool_small!(BA8, 256, 8, test_transpose_shares_ba_to_bool_256x8); +impl_transpose_shares_ba_to_bool_small!(BA5, 256, 5, test_transpose_shares_ba_to_bool_256x5); +impl_transpose_shares_ba_to_bool_small!(BA3, 256, 3, test_transpose_shares_ba_to_bool_256x3); #[cfg(all(test, unit_test))] mod tests { @@ -725,7 +892,7 @@ mod tests { let mut left = vec![Boolean::FALSE; N]; let mut right = vec![Boolean::FALSE; N]; for j in ((i % N)..N).step_by(step) { - let b = Boolean::from(j % 2 != 0); + let b = Boolean::from((j / N) % 2 != 0); left[j] = b; right[j] = !b; } @@ -746,7 +913,7 @@ mod tests { let mut left = vec![Boolean::FALSE; N]; let mut right = vec![Boolean::FALSE; N]; for j in ((i % N)..N).step_by(step) { - let b = Boolean::from(j % 2 != 0); + let b = Boolean::from((j / N) % 2 != 0); left[j] = b; right[j] = !b; } @@ -845,6 +1012,49 @@ mod tests { ); } + // The order of type parameters matches the implementation macro: BA, , + pub(super) fn test_transpose_shares_ba_to_bool_small< + SR, // Source row type + const SM: usize, // Source rows (== dest cols) + const DM: usize, // Destination rows (== source cols) + >() + where + Boolean: Vectorizable, + >::Array: ArrayAccess, + SR: SharedValue + + ArrayAccess + + FromIterator + + Vectorizable<1, Array = StdArray>, + BitDecomposed>: + for<'a> TransposeFrom<&'a Vec>, Error = LengthError>, + Standard: Distribution, + { + let t_impl = |src| { + let mut dst = + BitDecomposed::try_from(vec![AdditiveShare::::ZERO; DM]).unwrap(); + dst.transpose_from(src).ok().unwrap(); + dst + }; + + let step = min(SM, DM); + let m = ba_shares_test_matrix::(step).to_vec(); + let m_t = t_impl(&m); + assert_eq!(&*m_t, &bool_shares_test_matrix::(step)); + + let mut left_rng = thread_rng(); + let mut right_rng = thread_rng(); + let m = repeat_with(|| AdditiveShare::from_fns(|_| left_rng.gen(), |_| right_rng.gen())) + .take(SM) + .collect::>(); + let m_t = t_impl(&m); + + #[rustfmt::skip] + verify_transpose(SM, DM, + |i, j| (m_t[i].left_arr().get(j).unwrap(), m_t[i].right_arr().get(j).unwrap()), + |i, j| (m[i].get(j).unwrap().left(), m[i].get(j).unwrap().right()), + ); + } + // The order of type parameters matches the implementation macro: BA, , pub(super) fn test_transpose_shares_ba_fn_to_bool< SR, // Source row type From b16da76add20d2ec683dccb16b60a79cf4d1f1f6 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Sat, 13 Apr 2024 17:07:28 -0400 Subject: [PATCH 128/135] Update ipa-core/src/helpers/gateway/mod.rs Co-authored-by: Andy Leiserson --- ipa-core/src/helpers/gateway/mod.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ipa-core/src/helpers/gateway/mod.rs b/ipa-core/src/helpers/gateway/mod.rs index 740d4fefd..2abf70858 100644 --- a/ipa-core/src/helpers/gateway/mod.rs +++ b/ipa-core/src/helpers/gateway/mod.rs @@ -40,9 +40,8 @@ pub type MpcTransportImpl = TransportImpl; pub type ShardTransportImpl = TransportImpl; #[cfg(feature = "real-world-infra")] -type TransportImpl = crate::sync::Arc; #[cfg(feature = "real-world-infra")] -pub type MpcTransportImpl = TransportImpl; +pub type MpcTransportImpl = crate::sync::Arc; #[cfg(feature = "real-world-infra")] pub type ShardTransportImpl = crate::net::HttpShardTransport; From 99f708b562d84e87f19c9cfdad7fddf9bd1eae30 Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Sat, 13 Apr 2024 17:07:42 -0400 Subject: [PATCH 129/135] Feedback --- ipa-core/src/helpers/transport/mod.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ipa-core/src/helpers/transport/mod.rs b/ipa-core/src/helpers/transport/mod.rs index 8071085ae..f367ed44c 100644 --- a/ipa-core/src/helpers/transport/mod.rs +++ b/ipa-core/src/helpers/transport/mod.rs @@ -43,16 +43,16 @@ use crate::{ pub trait Identity: Copy + Clone + Debug + PartialEq + Eq + PartialOrd + Ord + Hash + Send + Sync + 'static { - fn as_str<'a>(&self) -> Cow<'a, str>; + fn as_str(&self) -> Cow<'static, str>; } impl Identity for ShardIndex { - fn as_str<'a>(&self) -> Cow<'a, str> { + fn as_str(&self) -> Cow<'static, str> { Cow::Owned(self.to_string()) } } impl Identity for HelperIdentity { - fn as_str<'a>(&self) -> Cow<'a, str> { + fn as_str(&self) -> Cow<'static, str> { Cow::Owned(self.id.to_string()) } } @@ -60,7 +60,7 @@ impl Identity for HelperIdentity { /// Role is an identifier of helper peer, only valid within a given query. For every query, there /// exists a static mapping from role to helper identity. impl Identity for Role { - fn as_str<'a>(&self) -> Cow<'a, str> { + fn as_str(&self) -> Cow<'static, str> { Cow::Borrowed(Role::as_static_str(self)) } } From 7e09115d575c475a8335795f43398157c60c92cf Mon Sep 17 00:00:00 2001 From: Alex Koshelev Date: Mon, 15 Apr 2024 22:13:18 -0700 Subject: [PATCH 130/135] Add a comment explaining the Mutex inside the receiver stream --- ipa-core/src/helpers/gateway/receive.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ipa-core/src/helpers/gateway/receive.rs b/ipa-core/src/helpers/gateway/receive.rs index ad2ccbf61..c37efd279 100644 --- a/ipa-core/src/helpers/gateway/receive.rs +++ b/ipa-core/src/helpers/gateway/receive.rs @@ -52,6 +52,10 @@ pub type UR = UnorderedReceiver< /// Stream of records received from a peer shard. #[derive(Clone)] pub struct ShardReceiveStream( + /// Using a mutex here may not be necessary - there is always a single caller that polls it, + /// and there may be an observer from stall detection that wants to know the state of it. + /// There could be a better way to share the state and make sure the owning reference is stored + /// inside the map of receivers. pub(super) Arc::RecordsStream>>, ); From df56b5ef32d6bd31b1fc12177800eb39576fc78f Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Tue, 16 Apr 2024 12:47:55 -0700 Subject: [PATCH 131/135] Duplicate timestamp and input-sorting changes IPAv3 sorts the input records, so add sorting of input records to ipa_in_the_clear, and remove it from input drivers. IPAv3 also shuffles the input records, so if there are duplicate timestamps among a single user's records, the output may be non-deterministic. To avoid end-to-end test failures, modify the test data generator to avoid generating duplicate timestamps. Add a directed test to exercise duplicate timestamps. Possibly a fix for #967. --- ipa-core/benches/oneshot/ipa.rs | 5 +- ipa-core/src/bin/report_collector.rs | 3 +- ipa-core/src/protocol/ipa_prf/mod.rs | 100 ++++++++++++------- ipa-core/src/test_fixture/event_gen.rs | 97 ++++++++++-------- ipa-core/src/test_fixture/ipa.rs | 133 +++++++++++++++++++++---- 5 files changed, 233 insertions(+), 105 deletions(-) diff --git a/ipa-core/benches/oneshot/ipa.rs b/ipa-core/benches/oneshot/ipa.rs index cc0ac25bf..ca6904fe9 100644 --- a/ipa-core/benches/oneshot/ipa.rs +++ b/ipa-core/benches/oneshot/ipa.rs @@ -130,7 +130,7 @@ async fn run(args: Args) -> Result<(), Error> { args.query_size, ) }; - let mut raw_data = EventGenerator::with_config( + let raw_data = EventGenerator::with_config( rng, EventGeneratorConfig { user_count, @@ -143,9 +143,6 @@ async fn run(args: Args) -> Result<(), Error> { ) .take(query_size) .collect::>(); - // EventGenerator produces events in random order, but IPA requires them to be sorted by - // timestamp. - raw_data.sort_by_key(|e| e.timestamp); let order = CappingOrder::CapMostRecentFirst; diff --git a/ipa-core/src/bin/report_collector.rs b/ipa-core/src/bin/report_collector.rs index d0e7deb13..496c73716 100644 --- a/ipa-core/src/bin/report_collector.rs +++ b/ipa-core/src/bin/report_collector.rs @@ -155,10 +155,9 @@ fn gen_inputs( let rng = seed .map(StdRng::seed_from_u64) .unwrap_or_else(StdRng::from_entropy); - let mut event_gen = EventGenerator::with_config(rng, args) + let event_gen = EventGenerator::with_config(rng, args) .take(count as usize) .collect::>(); - event_gen.sort_by_key(|e| e.timestamp); let mut writer: Box = if let Some(path) = output_file { Box::new(OpenOptions::new().write(true).create_new(true).open(path)?) } else { diff --git a/ipa-core/src/protocol/ipa_prf/mod.rs b/ipa-core/src/protocol/ipa_prf/mod.rs index aa5628c70..543da36da 100644 --- a/ipa-core/src/protocol/ipa_prf/mod.rs +++ b/ipa-core/src/protocol/ipa_prf/mod.rs @@ -304,6 +304,8 @@ where #[cfg(all(test, any(unit_test, feature = "shuttle")))] pub mod tests { + use rand::{seq::SliceRandom, thread_rng}; + use crate::{ ff::{ boolean_array::{BA20, BA3, BA5, BA8}, @@ -314,6 +316,22 @@ pub mod tests { test_fixture::{ipa::TestRawDataRecord, Reconstruct, Runner, TestWorld}, }; + fn test_input( + timestamp: u64, + user_id: u64, + is_trigger_report: bool, + breakdown_key: u32, + trigger_value: u32, + ) -> TestRawDataRecord { + TestRawDataRecord { + timestamp, + user_id, + is_trigger_report, + breakdown_key, + trigger_value, + } + } + #[test] fn semi_honest() { const EXPECTED: &[u128] = &[0, 2, 5, 0, 0, 0, 0, 0]; @@ -322,41 +340,11 @@ pub mod tests { let world = TestWorld::default(); let records: Vec = vec![ - TestRawDataRecord { - timestamp: 0, - user_id: 12345, - is_trigger_report: false, - breakdown_key: 1, - trigger_value: 0, - }, - TestRawDataRecord { - timestamp: 5, - user_id: 12345, - is_trigger_report: false, - breakdown_key: 2, - trigger_value: 0, - }, - TestRawDataRecord { - timestamp: 10, - user_id: 12345, - is_trigger_report: true, - breakdown_key: 0, - trigger_value: 5, - }, - TestRawDataRecord { - timestamp: 0, - user_id: 68362, - is_trigger_report: false, - breakdown_key: 1, - trigger_value: 0, - }, - TestRawDataRecord { - timestamp: 20, - user_id: 68362, - is_trigger_report: true, - breakdown_key: 0, - trigger_value: 2, - }, + test_input(0, 12345, false, 1, 0), + test_input(5, 12345, false, 2, 0), + test_input(10, 12345, true, 0, 5), + test_input(0, 68362, false, 1, 0), + test_input(20, 68362, true, 0, 2), ]; let mut result: Vec<_> = world @@ -377,4 +365,46 @@ pub mod tests { ); }); } + + // Test that IPA tolerates duplicate timestamps among a user's records. The end-to-end test + // harness does not generate data like this because the attribution result is non-deterministic. + // To make the output deterministic for this case, all of the duplicate timestamp records are + // identical. + #[test] + fn duplicate_timestamps() { + const EXPECTED: &[u128] = &[0, 2, 10, 0, 0, 0, 0, 0]; + + run(|| async { + let world = TestWorld::default(); + + let mut records: Vec = vec![ + test_input(0, 12345, false, 1, 0), + test_input(5, 12345, false, 2, 0), + test_input(5, 12345, false, 2, 0), + test_input(10, 12345, true, 0, 5), + test_input(10, 12345, true, 0, 5), + test_input(0, 68362, false, 1, 0), + test_input(20, 68362, true, 0, 2), + ]; + + records.shuffle(&mut thread_rng()); + + let mut result: Vec<_> = world + .semi_honest(records.into_iter(), |ctx, input_rows| async move { + oprf_ipa::<_, BA8, BA3, BA20, BA5, Fp31>(ctx, input_rows, None) + .await + .unwrap() + }) + .await + .reconstruct(); + result.truncate(EXPECTED.len()); + assert_eq!( + result, + EXPECTED + .iter() + .map(|i| Fp31::try_from(*i).unwrap()) + .collect::>() + ); + }); + } } diff --git a/ipa-core/src/test_fixture/event_gen.rs b/ipa-core/src/test_fixture/event_gen.rs index 33afabf32..925f6413c 100644 --- a/ipa-core/src/test_fixture/event_gen.rs +++ b/ipa-core/src/test_fixture/event_gen.rs @@ -1,3 +1,10 @@ +use std::{ + collections::HashSet, + num::{NonZeroU32, NonZeroU64}, +}; + +use crate::{rand::Rng, test_fixture::ipa::TestRawDataRecord}; + #[derive(Copy, Clone, Hash, Ord, PartialOrd, Eq, PartialEq)] struct UserId(u64); @@ -26,6 +33,10 @@ impl UserId { pub const FIRST: Self = Self(1); } +// 7 days = 604800 seconds fits in 20 bits +pub type Timestamp = u32; +pub type NonZeroTimestamp = NonZeroU32; + #[derive(Debug, Copy, Clone)] #[cfg_attr(feature = "clap", derive(clap::ValueEnum))] pub enum ReportFilter { @@ -46,8 +57,7 @@ pub struct Config { #[cfg_attr(feature = "clap", arg(long, default_value = "20"))] pub max_breakdown_key: NonZeroU32, #[cfg_attr(feature = "clap", arg(long, hide = true, default_value = "604800"))] - // 7 days < 20 bits - pub max_timestamp: NonZeroU32, + pub max_timestamp: NonZeroTimestamp, #[cfg_attr(feature = "clap", arg(long, default_value = "10"))] pub max_events_per_user: NonZeroU32, #[cfg_attr(feature = "clap", arg(long, default_value = "1"))] @@ -89,14 +99,14 @@ impl Config { max_breakdown_key: u32, min_events_per_user: u32, max_events_per_user: u32, - max_timestamp: u32, + max_timestamp: Timestamp, ) -> Self { assert!(min_events_per_user < max_events_per_user); Self { user_count: NonZeroU64::try_from(user_count).unwrap(), max_trigger_value: NonZeroU32::try_from(max_trigger_value).unwrap(), max_breakdown_key: NonZeroU32::try_from(max_breakdown_key).unwrap(), - max_timestamp: NonZeroU32::try_from(max_timestamp).unwrap(), + max_timestamp: NonZeroTimestamp::try_from(max_timestamp).unwrap(), min_events_per_user: NonZeroU32::try_from(min_events_per_user).unwrap(), max_events_per_user: NonZeroU32::try_from(max_events_per_user).unwrap(), report_filter: ReportFilter::All, @@ -111,17 +121,11 @@ impl Config { } } -use std::{ - collections::HashSet, - num::{NonZeroU32, NonZeroU64}, -}; - -use crate::{rand::Rng, test_fixture::ipa::TestRawDataRecord}; - struct UserStats { user_id: UserId, generated: u32, max: u32, + used_timestamps: HashSet, } impl UserStats { @@ -130,6 +134,7 @@ impl UserStats { user_id, generated: 0, max: max_events, + used_timestamps: HashSet::new(), } } @@ -152,8 +157,7 @@ pub struct EventGenerator { config: Config, rng: R, users: Vec, - // even bit vector takes too long to initialize. Need a sparse structure here - used: HashSet, + used_ids: HashSet, } impl EventGenerator { @@ -166,15 +170,21 @@ impl EventGenerator { config, rng, users: vec![], - used: HashSet::new(), + used_ids: HashSet::new(), } } - fn gen_event(&mut self, user_id: UserId) -> TestRawDataRecord { - // Generate a new random timestamp between [0..`max_timestamp`). - // This means the generated events must be sorted by timestamp before being - // fed into the IPA protocols. - let current_ts = self.rng.gen_range(0..self.config.max_timestamp.get()); + fn gen_event(&mut self, idx: usize) -> TestRawDataRecord { + let user_id = self.users[idx].user_id; + + // Generate a new random timestamp between [0..`max_timestamp`) and distinct from + // already-used timestamps. + let current_ts = loop { + let ts = self.rng.gen_range(0..self.config.max_timestamp.get()); + if self.users[idx].used_timestamps.insert(ts) { + break ts; + } + }; match self.config.report_filter { ReportFilter::All => { @@ -198,7 +208,7 @@ impl EventGenerator { } } - fn gen_trigger(&mut self, user_id: UserId, timestamp: u32) -> TestRawDataRecord { + fn gen_trigger(&mut self, user_id: UserId, timestamp: Timestamp) -> TestRawDataRecord { let trigger_value = self.rng.gen_range(1..self.config.max_trigger_value.get()); TestRawDataRecord { @@ -210,7 +220,7 @@ impl EventGenerator { } } - fn gen_source(&mut self, user_id: UserId, timestamp: u32) -> TestRawDataRecord { + fn gen_source(&mut self, user_id: UserId, timestamp: Timestamp) -> TestRawDataRecord { let breakdown_key = self.rng.gen_range(0..self.config.max_breakdown_key.get()); TestRawDataRecord { @@ -223,28 +233,27 @@ impl EventGenerator { } fn sample_user(&mut self) -> Option { - if self.used.len() == self.config.user_count() { + if self.used_ids.len() == self.config.user_count() { return None; } - let valid = |user_id| -> bool { !self.used.contains(&user_id) }; - - Some(loop { - let next = UserId::from( + loop { + let user_id = UserId::from( self.rng .gen_range(UserId::FIRST.into()..=self.config.user_count.get()), ); - if valid(next) { - self.used.insert(next); - break UserStats::new( - next, - self.rng.gen_range( - self.config.min_events_per_user.get() - ..=self.config.max_events_per_user.get(), - ), - ); + if self.used_ids.contains(&user_id) { + continue; } - }) + self.used_ids.insert(user_id); + + break Some(UserStats::new( + user_id, + self.rng.gen_range( + self.config.min_events_per_user.get()..=self.config.max_events_per_user.get(), + ), + )); + } } } @@ -266,12 +275,13 @@ impl Iterator for EventGenerator { } let idx = self.rng.gen_range(0..self.users.len()); - let user_id = self.users[idx].user_id; + let event = self.gen_event(idx); + if self.users[idx].add_one() { self.users.swap_remove(idx); } - Some(self.gen_event(user_id)) + Some(event) } } @@ -366,6 +376,11 @@ mod tests { "Found source report with trigger value set" ); } + + assert!( + event.timestamp < u64::from(self.max_timestamp.get()), + "Timestamp should not exceed configured maximum", + ); } } @@ -392,7 +407,7 @@ mod tests { user_count: NonZeroU64::new(10_000).unwrap(), max_trigger_value: NonZeroU32::new(max_trigger_value).unwrap(), max_breakdown_key: NonZeroU32::new(max_breakdown_key).unwrap(), - max_timestamp: NonZeroU32::new(604_800).unwrap(), + max_timestamp: NonZeroTimestamp::new(604_800).unwrap(), min_events_per_user: NonZeroU32::new(min_events_per_user).unwrap(), max_events_per_user: NonZeroU32::new(max_events_per_user).unwrap(), report_filter, @@ -423,9 +438,7 @@ mod tests { "Generated breakdown key greater than {max_breakdown}" ); - // Basic correctness checks. timestamps are not checked as the order of events - // is not guaranteed. The caller must sort the events by timestamp before - // feeding them into IPA. + // Basic correctness checks. config.is_valid(&event); } } diff --git a/ipa-core/src/test_fixture/ipa.rs b/ipa-core/src/test_fixture/ipa.rs index b5d608edd..5d654de88 100644 --- a/ipa-core/src/test_fixture/ipa.rs +++ b/ipa-core/src/test_fixture/ipa.rs @@ -1,4 +1,6 @@ -use std::{collections::HashMap, num::NonZeroU32, ops::Deref}; +use std::{collections::HashMap, num::NonZeroU32}; + +use rand::{thread_rng, Rng}; use crate::protocol::ipa_prf::prf_sharding::GroupingKey; #[cfg(feature = "in-memory-infra")] @@ -41,13 +43,31 @@ impl GroupingKey for TestRawDataRecord { } } +/// Insert `record` into `user_records`, maintaining timestamp order. +/// +/// If there are existing records with the same timestamp, inserts the new record +/// randomly in any position that maintains timestamp order. +fn insert_sorted(user_records: &mut Vec, record: TestRawDataRecord) { + let upper = user_records.partition_point(|rec| rec.timestamp <= record.timestamp); + if upper > 0 && user_records[upper - 1].timestamp == record.timestamp { + let lower = user_records[0..upper - 1] + .iter() + .rposition(|rec| rec.timestamp < record.timestamp) + .map_or(0, |lower| lower + 1); + user_records.insert(thread_rng().gen_range(lower..=upper), record); + } else { + user_records.insert(upper, record); + } +} + /// Executes IPA protocol in the clear, that is without any MPC helpers involved in the computation. /// Useful to validate that MPC output makes sense by comparing the breakdowns produced by MPC IPA /// with this function's results. Note that MPC version of IPA may apply DP noise to the aggregates, /// so strict equality may not work. /// -/// This function requires input to be sorted by the timestamp and returns a vector of contributions -/// sorted by the breakdown key. +/// Just like the MPC implementation, if the input contains records with duplicate timestamps, the +/// order those records are considered by the attribution algorithm is undefined, and the output +/// may be non-deterministic. /// /// ## Panics /// Will panic if you run in on Intel 80286 or any other 16 bit hardware. @@ -58,33 +78,20 @@ pub fn ipa_in_the_clear( max_breakdown: u32, order: &CappingOrder, ) -> Vec { - // build a view that is convenient for attribution. match key -> events sorted by timestamp in reverse + // build a view that is convenient for attribution. match key -> events sorted by timestamp // that is more memory intensive, but should be faster to compute. We can always opt-out and // execute IPA in place let mut user_events = HashMap::new(); - let mut last_ts = 0; for row in input { - if cfg!(debug_assertions) { - assert!( - last_ts <= row.timestamp, - "Input is not sorted: last row had timestamp {last_ts} that is greater than \ - {this_ts} timestamp of the current row", - this_ts = row.timestamp - ); - last_ts = row.timestamp; - } - - user_events - .entry(row.user_id) - .or_insert_with(Vec::new) - .push(row); + insert_sorted( + user_events.entry(row.user_id).or_insert_with(Vec::new), + row.clone(), + ); } let mut breakdowns = vec![0u32; usize::try_from(max_breakdown).unwrap()]; for records_per_user in user_events.values() { - // it works because input is sorted and vectors preserve the insertion order - // so records in `rev` are returned in reverse chronological order - let rev_records = records_per_user.iter().rev().map(Deref::deref); + let rev_records = records_per_user.iter().rev(); update_expected_output_for_user( rev_records, &mut breakdowns, @@ -233,3 +240,85 @@ pub async fn test_oprf_ipa( let _ = result.split_off(expected_results.len()); assert_eq!(result, expected_results); } + +#[cfg(all(test, unit_test))] +mod tests { + use super::*; + + fn insert_sorted_test>(iter: I) -> Vec { + fn test_record(timestamp: u64, breakdown_key: u32) -> TestRawDataRecord { + TestRawDataRecord { + timestamp, + user_id: 0, + is_trigger_report: false, + breakdown_key, + trigger_value: 0, + } + } + + let mut expected = Vec::new(); + let mut actual = Vec::new(); + for (i, v) in iter.into_iter().enumerate() { + expected.push(v); + super::insert_sorted(&mut actual, test_record(v, u32::try_from(i).unwrap())); + } + expected.sort_unstable(); + assert_eq!( + expected, + actual.iter().map(|rec| rec.timestamp).collect::>() + ); + + actual + } + + #[test] + fn insert_sorted() { + insert_sorted_test([1, 2, 3, 4]); + insert_sorted_test([4, 3, 2, 1]); + insert_sorted_test([2, 3, 1, 4]); + + let mut counts1 = [0, 0, 0]; + let mut counts5 = [0, 0, 0]; + let mut counts6 = [0, 0, 0]; + // The three twos (initially in positions 1, 5, and 6), should be placed in positions 2, 3, + // and 4 in the output in random order. After 128 trials, each of these possibilities should + // have occurred at least once. + for _ in 0..128 { + let result = insert_sorted_test([1, 2, 0, 3, 4, 2, 2]); + + let i1 = result.iter().position(|r| r.breakdown_key == 1).unwrap(); + counts1[i1 - 2] += 1; + let i5 = result.iter().position(|r| r.breakdown_key == 5).unwrap(); + counts5[i5 - 2] += 1; + let i6 = result.iter().position(|r| r.breakdown_key == 6).unwrap(); + counts6[i6 - 2] += 1; + } + for i in 0..3 { + assert_ne!(counts1[i], 0); + assert_ne!(counts5[i], 0); + assert_ne!(counts6[i], 0); + } + + let mut counts2 = [0, 0, 0]; + let mut counts5 = [0, 0, 0]; + let mut counts6 = [0, 0, 0]; + // The three zeros (initially in positions 2, 5, and 6), should be placed in positions 0, 1, + // and 2 in the output in random order. After 128 trials, each of these possibilities should + // have occurred at least once. + for _ in 0..128 { + let result = insert_sorted_test([1, 2, 0, 3, 4, 0, 0]); + + let i2 = result.iter().position(|r| r.breakdown_key == 2).unwrap(); + counts2[i2] += 1; + let i5 = result.iter().position(|r| r.breakdown_key == 5).unwrap(); + counts5[i5] += 1; + let i6 = result.iter().position(|r| r.breakdown_key == 6).unwrap(); + counts6[i6] += 1; + } + for i in 0..3 { + assert_ne!(counts2[i], 0); + assert_ne!(counts5[i], 0); + assert_ne!(counts6[i], 0); + } + } +} From 8808dc5bd3bdb682229d727433008089aa6647f6 Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Fri, 12 Apr 2024 12:23:00 -0400 Subject: [PATCH 132/135] Fix collect_steps --- ipa-core/benches/oneshot/ipa.rs | 2 +- ipa-core/src/test_fixture/world.rs | 4 +++- scripts/collect_steps.py | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ipa-core/benches/oneshot/ipa.rs b/ipa-core/benches/oneshot/ipa.rs index cc0ac25bf..1573cdcad 100644 --- a/ipa-core/benches/oneshot/ipa.rs +++ b/ipa-core/benches/oneshot/ipa.rs @@ -108,7 +108,7 @@ async fn run(args: Args) -> Result<(), Error> { let seed = args.random_seed.unwrap_or_else(|| random()); tracing::info!( - "Using random seed: {seed} for {q} records", + "Using random seed {seed} for {q} records", q = args.query_size ); let rng = StdRng::seed_from_u64(seed); diff --git a/ipa-core/src/test_fixture/world.rs b/ipa-core/src/test_fixture/world.rs index 16afd6f76..e7acfcc00 100644 --- a/ipa-core/src/test_fixture/world.rs +++ b/ipa-core/src/test_fixture/world.rs @@ -232,7 +232,9 @@ impl TestWorld { #[must_use] pub fn with_config(config: &TestWorldConfig) -> Self { logging::setup(); - println!("Using seed {seed}", seed = config.seed); + // Print to stdout so that it appears in test runs only on failure. + // scripts/collect_steps.py must be updated if the message text changes. + println!("TestWorld random seed {seed}", seed = config.seed); let shard_count = ShardIndex::try_from(S::SHARDS).unwrap(); let shard_network = InMemoryShardNetwork::with_shards(shard_count); diff --git a/scripts/collect_steps.py b/scripts/collect_steps.py index ea34ee3c1..60bd4cab1 100755 --- a/scripts/collect_steps.py +++ b/scripts/collect_steps.py @@ -70,6 +70,9 @@ def collect_steps(args): if not line or line == "": break + if line.startswith("TestWorld random seed "): + continue + if not line.startswith(ROOT_STEP_PREFIX): print("Unexpected line: " + line, flush=True) exit(1) From e5c23825e3923746c8f4d6fda0d933ba878401fd Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Tue, 16 Apr 2024 17:37:19 -0700 Subject: [PATCH 133/135] Sanity-check max_events_per_user vs. max_timestamp --- ipa-core/src/test_fixture/event_gen.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ipa-core/src/test_fixture/event_gen.rs b/ipa-core/src/test_fixture/event_gen.rs index 925f6413c..4b9a045fe 100644 --- a/ipa-core/src/test_fixture/event_gen.rs +++ b/ipa-core/src/test_fixture/event_gen.rs @@ -101,7 +101,6 @@ impl Config { max_events_per_user: u32, max_timestamp: Timestamp, ) -> Self { - assert!(min_events_per_user < max_events_per_user); Self { user_count: NonZeroU64::try_from(user_count).unwrap(), max_trigger_value: NonZeroU32::try_from(max_trigger_value).unwrap(), @@ -165,7 +164,19 @@ impl EventGenerator { Self::with_config(rng, Config::default()) } + /// # Panics + /// If the configuration is not valid. pub fn with_config(rng: R, config: Config) -> Self { + assert!(config.min_events_per_user <= config.max_events_per_user); + // Ensure that rejection-sampling of non-duplicate timestamps + // will complete in a reasonable amount of time. + assert!( + 2 * config.max_events_per_user.get() <= config.max_timestamp.get(), + "max_timestamp ({mt}) must be at least twice max_events_per_user ({me}) \ + to support generation of a unique timestamp for each event", + mt = config.max_timestamp, + me = config.max_events_per_user, + ); Self { config, rng, @@ -178,7 +189,8 @@ impl EventGenerator { let user_id = self.users[idx].user_id; // Generate a new random timestamp between [0..`max_timestamp`) and distinct from - // already-used timestamps. + // already-used timestamps. `EventGenerator::with_config` checks that `max_timestamp` + // exceeds `max_events_per_user` by a margin large enough that this is likely to complete. let current_ts = loop { let ts = self.rng.gen_range(0..self.config.max_timestamp.get()); if self.users[idx].used_timestamps.insert(ts) { From 781b5e3c0e90b026827a4e2968181da2cc3d67aa Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Tue, 16 Apr 2024 18:22:57 -0700 Subject: [PATCH 134/135] Update tests and fix a bug. Several changes here: * Fix proptest failure due to the new restriction on max_events_per_user vs. max_timestamp. * Adds a directed test for same. * Adds a directed test for a pre-existing bug / proptest failure that showed up when shrinking was triggered by the new proptest failure. * Fixes that pre-existing bug. --- ipa-core/src/test_fixture/event_gen.rs | 90 ++++++++++++++++---------- 1 file changed, 55 insertions(+), 35 deletions(-) diff --git a/ipa-core/src/test_fixture/event_gen.rs b/ipa-core/src/test_fixture/event_gen.rs index 4b9a045fe..10b31ea96 100644 --- a/ipa-core/src/test_fixture/event_gen.rs +++ b/ipa-core/src/test_fixture/event_gen.rs @@ -221,7 +221,7 @@ impl EventGenerator { } fn gen_trigger(&mut self, user_id: UserId, timestamp: Timestamp) -> TestRawDataRecord { - let trigger_value = self.rng.gen_range(1..self.config.max_trigger_value.get()); + let trigger_value = self.rng.gen_range(1..=self.config.max_trigger_value.get()); TestRawDataRecord { user_id: user_id.into(), @@ -329,12 +329,40 @@ mod tests { assert!(iter.next().is_none()); } + #[test] + #[should_panic(expected = "must be at least twice max_events_per_user")] + fn invalid_max_timestamp() { + let _ = EventGenerator::with_config( + thread_rng(), + Config { + max_events_per_user: NonZeroU32::new(10).unwrap(), + max_timestamp: NonZeroTimestamp::new(10).unwrap(), + ..Config::default() + }, + ); + } + + #[test] + fn min_max_trigger_value() { + let mut gen = EventGenerator::with_config( + thread_rng(), + Config { + max_trigger_value: NonZeroU32::new(1).unwrap(), + report_filter: ReportFilter::TriggerOnly, + conversion_probability: Some(1.0), + ..Config::default() + }, + ); + + assert!(gen.next().is_some()); + } + mod proptests { use std::collections::HashMap; use proptest::{ prelude::{Just, Strategy}, - prop_oneof, proptest, + prop_compose, prop_oneof, proptest, }; use rand::rngs::StdRng; use rand_core::SeedableRng; @@ -396,40 +424,32 @@ mod tests { } } - fn arb_config() -> impl Strategy { - ( - 1..u32::MAX, - 1..u32::MAX, - 1..u32::MAX, - 1..u32::MAX, - report_filter_strategy(), - ) - .prop_map( - |( - max_trigger_value, - max_breakdown_key, - mut min_events_per_user, - mut max_events_per_user, - report_filter, - )| { - if min_events_per_user > max_events_per_user { - std::mem::swap(&mut min_events_per_user, &mut max_events_per_user); - } - Config { - user_count: NonZeroU64::new(10_000).unwrap(), - max_trigger_value: NonZeroU32::new(max_trigger_value).unwrap(), - max_breakdown_key: NonZeroU32::new(max_breakdown_key).unwrap(), - max_timestamp: NonZeroTimestamp::new(604_800).unwrap(), - min_events_per_user: NonZeroU32::new(min_events_per_user).unwrap(), - max_events_per_user: NonZeroU32::new(max_events_per_user).unwrap(), - report_filter, - conversion_probability: match report_filter { - ReportFilter::TriggerOnly => Some(0.02), - _ => None, - }, - } - }, + prop_compose! { + fn arb_config() + (max_events_per_user in 1..u32::MAX / 2) + ( + max_trigger_value in 1..u32::MAX, + max_breakdown_key in 1..u32::MAX, + min_events_per_user in 1..=max_events_per_user, + max_events_per_user in Just(max_events_per_user), + max_timestamp in max_events_per_user*2..=u32::MAX, + report_filter in report_filter_strategy(), ) + -> Config { + Config { + user_count: NonZeroU64::new(10_000).unwrap(), + max_trigger_value: NonZeroU32::new(max_trigger_value).unwrap(), + max_breakdown_key: NonZeroU32::new(max_breakdown_key).unwrap(), + max_timestamp: NonZeroTimestamp::new(max_timestamp).unwrap(), + min_events_per_user: NonZeroU32::new(min_events_per_user).unwrap(), + max_events_per_user: NonZeroU32::new(max_events_per_user).unwrap(), + report_filter, + conversion_probability: match report_filter { + ReportFilter::TriggerOnly => Some(0.02), + _ => None, + }, + } + } } fn does_not_exceed_config_maximums(rng_seed: u64, config: &Config, total_events: usize) { From aa1554d23e770655c411fafbc3f2ea98ba5d144d Mon Sep 17 00:00:00 2001 From: Andy Leiserson Date: Wed, 17 Apr 2024 11:49:37 -0700 Subject: [PATCH 135/135] Additional comments --- .../src/secret_sharing/vector/transpose.rs | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/ipa-core/src/secret_sharing/vector/transpose.rs b/ipa-core/src/secret_sharing/vector/transpose.rs index 59536cf4f..45dc8acb5 100644 --- a/ipa-core/src/secret_sharing/vector/transpose.rs +++ b/ipa-core/src/secret_sharing/vector/transpose.rs @@ -206,6 +206,26 @@ impl<'a> TransposeFrom<&'a [StdArray; 256]> for Vec { // Matrix transpose helpers +// The read and write helpers are used with the `impl_transpose` macros to support a specific data +// type: +// 1. `impl_transpose` interprets the bit matrix in terms of 8x8 or 16x16 submatrices. It iterates +// over the entire matrix, with `i` and `j` serving as row and column submatrix indices, +// respectively. +// 2. `impl_transpose` invokes the selected `read_*` macro to transfer one submatrix +// from the position (i, j) in the source source to temporary storage. The `read_*` macro is +// invoked once for each row of the submatrix, with `k` as row index within the submatrix. +// 3. The submatrix is transposed. +// 4. `impl_transpose` invokes the selected `write_*` macro to write the transposed +// submatrix at position (j, i) in the destination. As when reading, `k` indexes rows +// within the submatrix. +// +// The `left` and `right` variants access data in the indicated share of a replicated sharing. The +// `ba` variants access data in an array of `BA{n}` or an array of `AdditiveShare`. The +// `bool` variants access data in an array of `AdditiveShare`. The `ba_fn_{left,right}` +// variants access data by calling a closure that returns `AdditiveShare`. The `_8_pad` +// variants support reading data from a source that may not have the full height of 8, by padding +// with zeros. + macro_rules! read_ba_left_8_pad { ($m:ident, $src:ident, $i:ident, $j:ident, $k:ident, $pad_value:expr) => { $m[$k] = $src @@ -417,6 +437,9 @@ macro_rules! impl_transpose_16 { }; } +// Helper for `impl_transpose_shim` that performs a `TryFrom` conversion for the source, +// if applicable. For example, a `Vec` dereferences to a slice, which then must be +// converted to an array using `TryFrom`. macro_rules! transpose_shim_convert_src { ($converted:ty, $expected_len:expr, $src:ident, LengthError) => { <$converted>::try_from($src.deref()).map_err(|_| LengthError { @@ -429,6 +452,8 @@ macro_rules! transpose_shim_convert_src { }; } +// Implement a transpose shim that adapts a transpose implementation for arrays into a transpose +// implementation for some other type like `BitDecomposed` or `Vec`. macro_rules! impl_transpose_shim { ($src_ty:ty, $src_row:ty, $dst_ty:ty, $dst_row:ty, $src_rows:expr, $src_cols:expr, $error:tt $(,)?) => { impl TransposeFrom<$src_ty> for $dst_ty { @@ -437,6 +462,7 @@ macro_rules! impl_transpose_shim { self.resize($src_cols, <$dst_row>::ZERO); let src = transpose_shim_convert_src!(&[$src_row; $src_rows], $src_rows, src, $error); + // This unwrap cannot fail, because we resized `self` to the proper size. let dst = <&mut [$dst_row; $src_cols]>::try_from(&mut **self).unwrap(); dst.transpose_from(src).unwrap_infallible(); Ok(()) @@ -445,7 +471,8 @@ macro_rules! impl_transpose_shim { }; } -macro_rules! impl_transpose_shim_pad { +// Variant of impl_transpose_shim that adjusts non-multiple-of-8 sizes to the next multiple of 8. +macro_rules! impl_transpose_shim_8_pad { ($src_ty:ty, $src_row:ty, $dst_ty:ty, $dst_row:ty, $src_rows:expr, $src_cols:expr, $error:tt $(,)?) => { impl TransposeFrom<$src_ty> for $dst_ty { type Error = $error; @@ -453,6 +480,7 @@ macro_rules! impl_transpose_shim_pad { self.resize(($src_cols + 7) / 8 * 8, <$dst_row>::ZERO); let src = transpose_shim_convert_src!(&[$src_row; $src_rows], $src_rows, src, $error); + // This unwrap cannot fail, because we resized `self` to the proper size. let dst = <&mut [$dst_row; ($src_cols + 7) / 8 * 8]>::try_from(&mut **self).unwrap(); dst.transpose_from(src).unwrap_infallible(); @@ -719,14 +747,14 @@ macro_rules! impl_transpose_shares_ba_to_bool_small { tests::test_transpose_shares_ba_to_bool_small::<$src_row, $src_rows, $src_cols>(); } - impl_transpose_shim_pad!( + impl_transpose_shim_8_pad!( &[AdditiveShare<$src_row>; $src_rows], AdditiveShare<$src_row>, BitDecomposed>, AdditiveShare, $src_rows, $src_cols, Infallible, ); - impl_transpose_shim_pad!( + impl_transpose_shim_8_pad!( &Vec>, AdditiveShare<$src_row>, BitDecomposed>, AdditiveShare, $src_rows, $src_cols,