From f33fd977228719c44462a2ac16021a6af674aae2 Mon Sep 17 00:00:00 2001 From: Nicholas Molnar <65710+neekolas@users.noreply.github.com> Date: Tue, 7 Nov 2023 10:53:28 -0800 Subject: [PATCH] Publish intents flows (#315) * Implement publish flow of state machine * Add a few tests * Refactor rand_string and rand_vec * Remove unused imports * Run clippy fix * Fix issues with updating existing entries * Clippy fix * Remove dependency on tempfile * Remove all usage of local tmp paths * Require explicit EncryptedMessageStore path * Run clippy --fix * Format * Fmt * Use generic error * Add one more small test * Merge changes * Fix import * Un-prefix import * Remove unused import * Add missing parameter error * Remove unused field * Remove test field * Add tests for intent data * Address review comments * Use ok_or * Clean up error handling * Format using nightly toolchain --- mls_validation_service/src/handlers.rs | 4 - xmtp_mls/src/builder.rs | 26 +- xmtp_mls/src/client.rs | 22 +- xmtp_mls/src/groups/intents.rs | 239 ++++++ xmtp_mls/src/groups/mod.rs | 305 +++++++ xmtp_mls/src/groups/publish.rs | 0 xmtp_mls/src/identity.rs | 2 +- xmtp_mls/src/lib.rs | 2 + xmtp_mls/src/storage/encrypted_store/group.rs | 6 +- .../storage/encrypted_store/group_intent.rs | 5 +- .../storage/encrypted_store/group_message.rs | 6 +- .../src/storage/encrypted_store/identity.rs | 4 +- .../src/storage/encrypted_store/key_store.rs | 22 - .../encrypted_store/key_store_entry.rs | 22 +- xmtp_mls/src/storage/encrypted_store/mod.rs | 45 +- xmtp_mls/src/storage/mod.rs | 4 +- xmtp_mls/src/storage/sql_key_store.rs | 28 +- xmtp_mls/src/utils/hash.rs | 5 + xmtp_mls/src/utils/mod.rs | 5 + xmtp_mls/src/utils/test.rs | 24 + xmtp_mls/src/utils/time.rs | 9 + xmtp_mls/src/utils/topic.rs | 3 + xmtp_proto/Cargo.toml | 3 +- xmtp_proto/src/gen/mod.rs | 6 + xmtp_proto/src/gen/xmtp.mls.database.rs | 240 ++++++ xmtp_proto/src/gen/xmtp.mls.database.serde.rs | 785 ++++++++++++++++++ xmtp_proto/src/gen/xmtp.mls_validation.v1.rs | 301 ++++--- .../src/gen/xmtp.mls_validation.v1.serde.rs | 19 - 28 files changed, 1869 insertions(+), 273 deletions(-) create mode 100644 xmtp_mls/src/groups/intents.rs create mode 100644 xmtp_mls/src/groups/mod.rs create mode 100644 xmtp_mls/src/groups/publish.rs delete mode 100644 xmtp_mls/src/storage/encrypted_store/key_store.rs create mode 100644 xmtp_mls/src/utils/hash.rs create mode 100644 xmtp_mls/src/utils/mod.rs create mode 100644 xmtp_mls/src/utils/test.rs create mode 100644 xmtp_mls/src/utils/time.rs create mode 100644 xmtp_mls/src/utils/topic.rs create mode 100644 xmtp_proto/src/gen/xmtp.mls.database.rs create mode 100644 xmtp_proto/src/gen/xmtp.mls.database.serde.rs diff --git a/mls_validation_service/src/handlers.rs b/mls_validation_service/src/handlers.rs index 15efac046..9de22f366 100644 --- a/mls_validation_service/src/handlers.rs +++ b/mls_validation_service/src/handlers.rs @@ -64,13 +64,11 @@ impl ValidationApi for ValidationService { match validate_group_message(message.group_message_bytes_tls_serialized) { Ok(res) => ValidateGroupMessageValidationResponse { group_id: res.group_id, - epoch: res.epoch, error_message: "".to_string(), is_ok: true, }, Err(e) => ValidateGroupMessageValidationResponse { group_id: "".to_string(), - epoch: 0, error_message: e, is_ok: false, }, @@ -86,7 +84,6 @@ impl ValidationApi for ValidationService { struct ValidateGroupMessageResult { group_id: String, - epoch: u64, } fn validate_group_message(message: Vec) -> Result { @@ -99,7 +96,6 @@ fn validate_group_message(message: Vec) -> Result Self { + let tmpdb = tmp_path(); + self.store( + EncryptedMessageStore::new_unencrypted(StorageOption::Persistent(tmpdb)).unwrap(), + ) + } + pub async fn new_test_client( strat: IdentityStrategy>, ) -> Client { - Self::new(strat).local_grpc().await.build().unwrap() + Self::new(strat) + .temp_store() + .local_grpc() + .await + .build() + .unwrap() } } @@ -189,10 +204,7 @@ mod tests { #[tokio::test] async fn identity_persistence_test() { - let tmpdb = TempPath::from_path("./db.db3") - .to_str() - .unwrap() - .to_string(); + let tmpdb = tmp_path(); let wallet = generate_local_wallet(); // Generate a new Wallet + Store diff --git a/xmtp_mls/src/client.rs b/xmtp_mls/src/client.rs index 7a1bf42e7..39963f27b 100644 --- a/xmtp_mls/src/client.rs +++ b/xmtp_mls/src/client.rs @@ -8,8 +8,9 @@ use xmtp_proto::api_client::{XmtpApiClient, XmtpMlsClient}; use crate::{ api_client_wrapper::{ApiClientWrapper, IdentityUpdate}, configuration::KEY_PACKAGE_TOP_UP_AMOUNT, + groups::MlsGroup, identity::Identity, - storage::{EncryptedMessageStore, StorageError}, + storage::{group::GroupMembershipState, EncryptedMessageStore, StorageError}, types::Address, verified_key_package::{KeyPackageVerificationError, VerifiedKeyPackage}, xmtp_openmls_provider::XmtpOpenMlsProvider, @@ -30,7 +31,7 @@ pub enum ClientError { #[error("storage error: {0}")] Storage(#[from] StorageError), #[error("dieselError: {0}")] - Ddd(#[from] diesel::result::Error), + Diesel(#[from] diesel::result::Error), #[error("Query failed: {0}")] QueryError(#[from] xmtp_proto::api_client::Error), #[error("identity error: {0}")] @@ -82,10 +83,17 @@ where } // TODO: Remove this and figure out the correct lifetimes to allow long lived provider - fn mls_provider(&self) -> XmtpOpenMlsProvider { + pub fn mls_provider(&self) -> XmtpOpenMlsProvider { XmtpOpenMlsProvider::new(&self.store) } + pub fn create_group(&self) -> Result, ClientError> { + let group = MlsGroup::create_and_insert(self, GroupMembershipState::Allowed) + .map_err(|e| ClientError::Generic(format!("group create error {}", e)))?; + + Ok(group) + } + pub async fn register_identity(&self) -> Result<(), ClientError> { // TODO: Mark key package as last_resort in creation let last_resort_kp = self.identity.new_key_package(&self.mls_provider())?; @@ -154,6 +162,14 @@ where .get_all_active_installation_ids(wallet_addresses) .await?; + self.get_key_packages_for_installation_ids(installation_ids) + .await + } + + pub async fn get_key_packages_for_installation_ids( + &self, + installation_ids: Vec>, + ) -> Result, ClientError> { let key_package_results = self .api_client .consume_key_packages(installation_ids) diff --git a/xmtp_mls/src/groups/intents.rs b/xmtp_mls/src/groups/intents.rs new file mode 100644 index 000000000..c9b587fc3 --- /dev/null +++ b/xmtp_mls/src/groups/intents.rs @@ -0,0 +1,239 @@ +use openmls::prelude::MlsMessageOut; +use prost::{DecodeError, Message}; +use thiserror::Error; +use tls_codec::Serialize; +use xmtp_proto::xmtp::mls::database::{ + add_members_publish_data::{Version as AddMembersVersion, V1 as AddMembersV1}, + post_commit_action::{Kind as PostCommitActionKind, SendWelcomes as SendWelcomesProto}, + send_message_publish_data::{Version as SendMessageVersion, V1 as SendMessageV1}, + AddMembersPublishData, PostCommitAction as PostCommitActionProto, SendMessagePublishData, +}; + +use crate::{ + verified_key_package::{KeyPackageVerificationError, VerifiedKeyPackage}, + xmtp_openmls_provider::XmtpOpenMlsProvider, +}; + +#[derive(Debug, Error)] +pub enum IntentError { + #[error("decode error: {0}")] + Decode(#[from] DecodeError), + #[error("key package verification: {0}")] + KeyPackageVerification(#[from] KeyPackageVerificationError), + #[error("tls codec: {0}")] + TlsCodec(#[from] tls_codec::Error), + #[error("generic: {0}")] + Generic(String), +} + +#[derive(Debug, Clone)] +pub struct SendMessageIntentData { + pub message: Vec, +} + +impl SendMessageIntentData { + pub fn new(message: Vec) -> Self { + Self { message } + } + + pub(crate) fn to_bytes(&self) -> Vec { + let mut buf = Vec::new(); + SendMessagePublishData { + version: Some(SendMessageVersion::V1(SendMessageV1 { + payload_bytes: self.message.clone(), + })), + } + .encode(&mut buf) + .unwrap(); + + buf + } + + pub(crate) fn from_bytes(data: &[u8]) -> Result { + let msg = SendMessagePublishData::decode(data)?; + let payload_bytes = match msg.version { + Some(SendMessageVersion::V1(v1)) => v1.payload_bytes, + None => return Err(IntentError::Generic("missing payload".to_string())), + }; + + Ok(Self::new(payload_bytes)) + } +} + +impl From for Vec { + fn from(intent: SendMessageIntentData) -> Self { + intent.to_bytes() + } +} + +#[derive(Debug, Clone)] +pub struct AddMembersIntentData { + pub key_packages: Vec, +} + +impl AddMembersIntentData { + pub fn new(key_packages: Vec) -> Self { + Self { key_packages } + } + + pub(crate) fn to_bytes(&self) -> Result, IntentError> { + let mut buf = Vec::new(); + let key_package_bytes_result: Result>, tls_codec::Error> = self + .key_packages + .iter() + .map(|kp| kp.inner.tls_serialize_detached()) + .collect(); + + AddMembersPublishData { + version: Some(AddMembersVersion::V1(AddMembersV1 { + key_packages_bytes_tls_serialized: key_package_bytes_result?, + })), + } + .encode(&mut buf) + .unwrap(); + + Ok(buf) + } + + pub(crate) fn from_bytes( + data: &[u8], + provider: &XmtpOpenMlsProvider, + ) -> Result { + let msg = AddMembersPublishData::decode(data)?; + let key_package_bytes = match msg.version { + Some(AddMembersVersion::V1(v1)) => v1.key_packages_bytes_tls_serialized, + None => return Err(IntentError::Generic("missing payload".to_string())), + }; + let key_packages: Result, KeyPackageVerificationError> = + key_package_bytes + .iter() + // TODO: Serialize VerifiedKeyPackages directly, so that we don't have to re-verify + .map(|kp| VerifiedKeyPackage::from_bytes(provider, kp)) + .collect(); + + Ok(Self::new(key_packages?)) + } +} + +impl TryFrom for Vec { + type Error = IntentError; + + fn try_from(intent: AddMembersIntentData) -> Result { + intent.to_bytes() + } +} + +#[derive(Debug, Clone)] +pub enum PostCommitAction { + SendWelcomes(SendWelcomesAction), +} + +#[derive(Debug, Clone)] +pub struct SendWelcomesAction { + pub installation_ids: Vec>, + pub welcome_message: Vec, +} + +impl SendWelcomesAction { + pub fn new(installation_ids: Vec>, welcome_message: Vec) -> Self { + Self { + installation_ids, + welcome_message, + } + } + + pub(crate) fn to_bytes(&self) -> Vec { + let mut buf = Vec::new(); + PostCommitActionProto { + kind: Some(PostCommitActionKind::SendWelcomes(SendWelcomesProto { + installation_ids: self.installation_ids.clone(), + welcome_message: self.welcome_message.clone(), + })), + } + .encode(&mut buf) + .unwrap(); + + buf + } +} + +impl PostCommitAction { + pub(crate) fn to_bytes(&self) -> Vec { + match self { + PostCommitAction::SendWelcomes(action) => action.to_bytes(), + } + } + + pub(crate) fn from_bytes(data: &[u8]) -> Result { + let decoded = PostCommitActionProto::decode(data)?; + match decoded.kind { + Some(PostCommitActionKind::SendWelcomes(proto)) => Ok(Self::SendWelcomes( + SendWelcomesAction::new(proto.installation_ids, proto.welcome_message), + )), + None => Err(IntentError::Generic( + "missing post commit action".to_string(), + )), + } + } + + pub(crate) fn from_welcome( + welcome: MlsMessageOut, + installation_ids: Vec>, + ) -> Result { + let welcome_bytes = welcome.tls_serialize_detached()?; + + Ok(Self::SendWelcomes(SendWelcomesAction::new( + installation_ids, + welcome_bytes, + ))) + } +} + +impl From> for PostCommitAction { + fn from(data: Vec) -> Self { + PostCommitAction::from_bytes(data.as_slice()).unwrap() + } +} + +#[cfg(test)] +mod tests { + use xmtp_cryptography::utils::generate_local_wallet; + + use super::*; + use crate::{builder::ClientBuilder, InboxOwner}; + + #[test] + fn test_serialize_send_message() { + let message = vec![1, 2, 3]; + let intent = SendMessageIntentData::new(message.clone()); + let as_bytes: Vec = intent.into(); + let restored_intent = SendMessageIntentData::from_bytes(as_bytes.as_slice()).unwrap(); + + assert_eq!(restored_intent.message, message); + } + + #[tokio::test] + async fn test_serialize_add_members() { + let wallet = generate_local_wallet(); + let wallet_address = wallet.get_address(); + let client = ClientBuilder::new_test_client(wallet.into()).await; + let key_package = client + .identity + .new_key_package(&client.mls_provider()) + .unwrap(); + let verified_key_package = VerifiedKeyPackage::new(key_package, wallet_address.clone()); + + let intent = AddMembersIntentData::new(vec![verified_key_package.clone()]); + let as_bytes: Vec = intent.clone().try_into().unwrap(); + let restored_intent = + AddMembersIntentData::from_bytes(as_bytes.as_slice(), &client.mls_provider()).unwrap(); + + assert!(intent.key_packages[0] + .inner + .eq(&restored_intent.key_packages[0].inner)); + assert_eq!( + intent.key_packages[0].wallet_address, + restored_intent.key_packages[0].wallet_address + ); + } +} diff --git a/xmtp_mls/src/groups/mod.rs b/xmtp_mls/src/groups/mod.rs new file mode 100644 index 000000000..e5d6e7017 --- /dev/null +++ b/xmtp_mls/src/groups/mod.rs @@ -0,0 +1,305 @@ +mod intents; + +use intents::SendMessageIntentData; +use openmls::{ + prelude::{ + CredentialWithKey, CryptoConfig, GroupId, MlsGroup as OpenMlsGroup, MlsGroupConfig, + WireFormatPolicy, + }, + prelude_test::KeyPackage, +}; +use openmls_traits::OpenMlsProvider; +use thiserror::Error; +use tls_codec::Serialize; +use xmtp_proto::api_client::{XmtpApiClient, XmtpMlsClient}; + +use self::intents::{AddMembersIntentData, IntentError, PostCommitAction}; +use crate::{ + client::ClientError, + configuration::CIPHERSUITE, + storage::{ + group::{GroupMembershipState, StoredGroup}, + group_intent::{IntentKind, IntentState, NewGroupIntent, StoredGroupIntent}, + DbConnection, StorageError, + }, + utils::{hash::sha256, time::now_ns, topic::get_group_topic}, + xmtp_openmls_provider::XmtpOpenMlsProvider, + Client, Store, +}; + +#[derive(Debug, Error)] +pub enum GroupError { + #[error("group not found")] + GroupNotFound, + #[error("api error: {0}")] + Api(#[from] xmtp_proto::api_client::Error), + #[error("storage error: {0}")] + Storage(#[from] crate::storage::StorageError), + #[error("intent error: {0}")] + Intent(#[from] IntentError), + #[error("create message: {0}")] + CreateMessage(#[from] openmls::prelude::CreateMessageError), + #[error("tls serialization: {0}")] + TlsSerialization(#[from] tls_codec::Error), + #[error("add members: {0}")] + AddMembers(#[from] openmls::prelude::AddMembersError), + #[error("group create: {0}")] + GroupCreate(#[from] openmls::prelude::NewGroupError), + #[error("client: {0}")] + Client(#[from] ClientError), + #[error("generic: {0}")] + Generic(String), +} + +pub struct MlsGroup<'c, ApiClient> { + pub group_id: Vec, + client: &'c Client, +} + +impl<'c, ApiClient> MlsGroup<'c, ApiClient> +where + ApiClient: XmtpApiClient + XmtpMlsClient, +{ + // Creates a new group instance. Does not validate that the group exists in the DB + pub fn new(group_id: Vec, client: &'c Client) -> Self { + Self { client, group_id } + } + + pub fn load_mls_group( + &self, + provider: &XmtpOpenMlsProvider, + ) -> Result { + let mls_group = + OpenMlsGroup::load(&GroupId::from_slice(&self.group_id), provider.key_store()) + .ok_or(GroupError::GroupNotFound)?; + + Ok(mls_group) + } + + pub fn create_and_insert( + client: &'c Client, + membership_state: GroupMembershipState, + ) -> Result { + let provider = client.mls_provider(); + let mut conn = client.store.conn()?; + let mut mls_group = OpenMlsGroup::new( + &provider, + &client.identity.installation_keys, + &build_group_config(), + // TODO: Confirm I should be using the installation keys here + CredentialWithKey { + credential: client.identity.credential.clone(), + signature_key: client.identity.installation_keys.to_public_vec().into(), + }, + )?; + + mls_group.save(provider.key_store())?; + let group_id = mls_group.group_id().to_vec(); + let stored_group = StoredGroup::new(group_id.clone(), now_ns(), membership_state); + stored_group.store(&mut conn)?; + + Ok(Self::new(group_id, client)) + } + + pub async fn send_message(&self, message: &[u8]) -> Result<(), GroupError> { + let mut conn = self.client.store.conn()?; + let intent_data: Vec = SendMessageIntentData::new(message.to_vec()).into(); + let intent = + NewGroupIntent::new(IntentKind::SendMessage, self.group_id.clone(), intent_data); + intent.store(&mut conn)?; + + self.publish_intents(&mut conn).await?; + Ok(()) + } + + pub async fn add_members_by_installation_id( + &self, + installation_ids: Vec>, + ) -> Result<(), GroupError> { + let mut conn = self.client.store.conn()?; + let key_packages = self + .client + .get_key_packages_for_installation_ids(installation_ids) + .await?; + let intent_data: Vec = AddMembersIntentData::new(key_packages).try_into()?; + let intent = + NewGroupIntent::new(IntentKind::AddMembers, self.group_id.clone(), intent_data); + intent.store(&mut conn)?; + + self.publish_intents(&mut conn).await?; + + Ok(()) + } + + pub(crate) async fn publish_intents(&self, conn: &mut DbConnection) -> Result<(), GroupError> { + let provider = self.client.mls_provider(); + let mut openmls_group = self.load_mls_group(&provider)?; + + let intents = self.client.store.find_group_intents( + conn, + self.group_id.clone(), + Some(vec![IntentState::ToPublish]), + None, + )?; + + for intent in intents { + // TODO: Wrap in a transaction once we can synchronize with the MLS Keystore + let result = self.get_publish_intent_data(&provider, &mut openmls_group, &intent); + if let Err(e) = result { + log::error!("error getting publish intent data {:?}", e); + // TODO: Figure out which types of errors we should abort completely on and which + // ones are safe to continue with + continue; + } + + let (payload, post_commit_data) = result.expect("result already checked"); + self.client + .api_client + .publish_to_group(vec![payload.as_slice()]) + .await?; + + self.client.store.set_group_intent_published( + conn, + intent.id, + sha256(payload.as_slice()), + post_commit_data, + )?; + } + + openmls_group.save(provider.key_store())?; + + Ok(()) + } + + // Takes a StoredGroupIntent and returns the payload and post commit data as a tuple + fn get_publish_intent_data( + &self, + provider: &XmtpOpenMlsProvider, + openmls_group: &mut OpenMlsGroup, + intent: &StoredGroupIntent, + ) -> Result<(Vec, Option>), GroupError> { + match intent.kind { + IntentKind::SendMessage => { + // We can safely assume all SendMessage intents have data + let intent_data = SendMessageIntentData::from_bytes(intent.data.as_slice())?; + // TODO: Handle pending_proposal errors and UseAfterEviction errors + let msg = openmls_group.create_message( + provider, + &self.client.identity.installation_keys, + intent_data.message.as_slice(), + )?; + + let msg_bytes = msg.tls_serialize_detached()?; + Ok((msg_bytes, None)) + } + IntentKind::AddMembers => { + let intent_data = + AddMembersIntentData::from_bytes(intent.data.as_slice(), provider)?; + + let key_packages: Vec = intent_data + .key_packages + .iter() + .map(|kp| kp.inner.clone()) + .collect(); + + let (commit, welcome, _group_info) = openmls_group.add_members( + provider, + &self.client.identity.installation_keys, + key_packages.as_slice(), + )?; + + let commit_bytes = commit.tls_serialize_detached()?; + + // If somehow another installation has made it into the commit, this will be missing + // their installation ID + let installation_ids: Vec> = intent_data + .key_packages + .iter() + .map(|kp| kp.installation_id()) + .collect(); + + let post_commit_data = + Some(PostCommitAction::from_welcome(welcome, installation_ids)?.to_bytes()); + + Ok((commit_bytes, post_commit_data)) + } + _ => Err(GroupError::Generic("invalid intent kind".to_string())), + } + } + + pub fn topic(&self) -> String { + get_group_topic(&self.group_id) + } +} + +fn build_group_config() -> MlsGroupConfig { + MlsGroupConfig::builder() + .crypto_config(CryptoConfig::with_default_version(CIPHERSUITE)) + .wire_format_policy(WireFormatPolicy::default()) + .max_past_epochs(3) // Trying with 3 max past epochs for now + .use_ratchet_tree_extension(true) + .build() +} + +#[cfg(test)] +mod tests { + use xmtp_cryptography::utils::generate_local_wallet; + + use crate::builder::ClientBuilder; + + #[tokio::test] + async fn test_send_message() { + let wallet = generate_local_wallet(); + let client = ClientBuilder::new_test_client(wallet.into()).await; + let group = client.create_group().expect("create group"); + group.send_message(b"hello").await.expect("send message"); + + let topic = group.topic(); + + let messages = client + .api_client + .read_topic(topic.as_str(), 0) + .await + .expect("read topic"); + + assert_eq!(messages.len(), 1) + } + + #[tokio::test] + async fn test_add_members() { + let client = ClientBuilder::new_test_client(generate_local_wallet().into()).await; + let client_2 = ClientBuilder::new_test_client(generate_local_wallet().into()).await; + client_2.register_identity().await.unwrap(); + let group = client.create_group().expect("create group"); + + group + .add_members_by_installation_id(vec![client_2 + .identity + .installation_keys + .to_public_vec()]) + .await + .unwrap(); + + let topic = group.topic(); + + let messages = client + .api_client + .read_topic(topic.as_str(), 0) + .await + .unwrap(); + + assert_eq!(messages.len(), 1); + } + + #[tokio::test] + async fn test_add_invalid_member() { + let client = ClientBuilder::new_test_client(generate_local_wallet().into()).await; + let group = client.create_group().expect("create group"); + + let result = group + .add_members_by_installation_id(vec![b"1234".to_vec()]) + .await; + + assert!(result.is_err()); + } +} diff --git a/xmtp_mls/src/groups/publish.rs b/xmtp_mls/src/groups/publish.rs new file mode 100644 index 000000000..e69de29bb diff --git a/xmtp_mls/src/identity.rs b/xmtp_mls/src/identity.rs index fb460ba06..602bb638b 100644 --- a/xmtp_mls/src/identity.rs +++ b/xmtp_mls/src/identity.rs @@ -128,7 +128,7 @@ mod tests { #[test] fn does_not_error() { - let store = EncryptedMessageStore::default(); + let store = EncryptedMessageStore::new_test(); Identity::new( &store, &XmtpOpenMlsProvider::new(&store), diff --git a/xmtp_mls/src/lib.rs b/xmtp_mls/src/lib.rs index 294dbde8d..a6ea9c2e6 100644 --- a/xmtp_mls/src/lib.rs +++ b/xmtp_mls/src/lib.rs @@ -3,12 +3,14 @@ pub mod association; pub mod builder; pub mod client; mod configuration; +pub mod groups; pub mod identity; pub mod mock_xmtp_api_client; pub mod owner; mod proto_wrapper; pub mod storage; pub mod types; +pub mod utils; pub mod verified_key_package; mod xmtp_openmls_provider; diff --git a/xmtp_mls/src/storage/encrypted_store/group.rs b/xmtp_mls/src/storage/encrypted_store/group.rs index 3caaaef47..a54a475dc 100644 --- a/xmtp_mls/src/storage/encrypted_store/group.rs +++ b/xmtp_mls/src/storage/encrypted_store/group.rs @@ -102,10 +102,8 @@ pub(crate) mod tests { use super::*; use crate::{ assert_ok, - storage::encrypted_store::{ - schema::groups::dsl::groups, - tests::{rand_time, rand_vec, with_store}, - }, + storage::encrypted_store::{schema::groups::dsl::groups, tests::with_store}, + utils::test::{rand_time, rand_vec}, Fetch, Store, }; diff --git a/xmtp_mls/src/storage/encrypted_store/group_intent.rs b/xmtp_mls/src/storage/encrypted_store/group_intent.rs index 512584a83..5c0665c86 100644 --- a/xmtp_mls/src/storage/encrypted_store/group_intent.rs +++ b/xmtp_mls/src/storage/encrypted_store/group_intent.rs @@ -96,6 +96,8 @@ impl EncryptedMessageStore { query = query.filter(dsl::kind.eq_any(allowed_kinds)); } + query = query.order(dsl::id.asc()); + Ok(query.load::(conn)?) } @@ -246,8 +248,9 @@ mod tests { use crate::{ storage::encrypted_store::{ group::{GroupMembershipState, StoredGroup}, - tests::{rand_vec, with_store}, + tests::with_store, }, + utils::test::rand_vec, Fetch, Store, }; diff --git a/xmtp_mls/src/storage/encrypted_store/group_message.rs b/xmtp_mls/src/storage/encrypted_store/group_message.rs index 1b387d295..98feb6952 100644 --- a/xmtp_mls/src/storage/encrypted_store/group_message.rs +++ b/xmtp_mls/src/storage/encrypted_store/group_message.rs @@ -117,10 +117,8 @@ mod tests { use super::*; use crate::{ assert_err, assert_ok, - storage::encrypted_store::{ - group::tests::generate_group, - tests::{rand_time, rand_vec, with_store}, - }, + storage::encrypted_store::{group::tests::generate_group, tests::with_store}, + utils::test::{rand_time, rand_vec}, Store, }; diff --git a/xmtp_mls/src/storage/encrypted_store/identity.rs b/xmtp_mls/src/storage/encrypted_store/identity.rs index 777700b07..36a89a90d 100644 --- a/xmtp_mls/src/storage/encrypted_store/identity.rs +++ b/xmtp_mls/src/storage/encrypted_store/identity.rs @@ -60,10 +60,10 @@ impl From for Identity { #[cfg(test)] mod tests { use super::{ - super::{tests::rand_vec, EncryptedMessageStore, StorageOption}, + super::{EncryptedMessageStore, StorageOption}, StoredIdentity, }; - use crate::Store; + use crate::{utils::test::rand_vec, Store}; #[test] fn can_only_store_one_identity() { diff --git a/xmtp_mls/src/storage/encrypted_store/key_store.rs b/xmtp_mls/src/storage/encrypted_store/key_store.rs deleted file mode 100644 index 295120503..000000000 --- a/xmtp_mls/src/storage/encrypted_store/key_store.rs +++ /dev/null @@ -1,22 +0,0 @@ -use super::DbConnection; -use super::{schema::openmls_key_store, StorageError}; -use crate::{Delete, impl_fetch_and_store}; -use diesel::prelude::*; - -#[derive(Insertable, Queryable, Debug, Clone)] -#[diesel(table_name = openmls_key_store)] -#[diesel(primary_key(key_bytes))] -pub struct StoredKeyStoreEntry { - pub key_bytes: Vec, - pub value_bytes: Vec, -} - -impl_fetch_and_store!(StoredKeyStoreEntry, openmls_key_store, Vec); - -impl Delete for DbConnection { - type Key = Vec; - fn delete(&mut self, key: Vec) -> Result where { - use super::schema::openmls_key_store::dsl::*; - Ok(diesel::delete(openmls_key_store.filter(key_bytes.eq(key))).execute(self)?) - } -} diff --git a/xmtp_mls/src/storage/encrypted_store/key_store_entry.rs b/xmtp_mls/src/storage/encrypted_store/key_store_entry.rs index b15d2d590..59c2adb8c 100644 --- a/xmtp_mls/src/storage/encrypted_store/key_store_entry.rs +++ b/xmtp_mls/src/storage/encrypted_store/key_store_entry.rs @@ -1,6 +1,6 @@ use diesel::prelude::*; -use super::{schema::openmls_key_store, DbConnection, StorageError}; +use super::{schema::openmls_key_store, DbConnection, EncryptedMessageStore, StorageError}; use crate::{impl_fetch, impl_store, Delete}; #[derive(Insertable, Queryable, Debug, Clone)] @@ -21,3 +21,23 @@ impl Delete for DbConnection { Ok(diesel::delete(openmls_key_store.filter(key_bytes.eq(key))).execute(self)?) } } + +impl EncryptedMessageStore { + pub fn insert_or_update_key_store_entry( + &self, + conn: &mut DbConnection, + key: Vec, + value: Vec, + ) -> Result<(), StorageError> { + use super::schema::openmls_key_store::dsl::*; + let entry = StoredKeyStoreEntry { + key_bytes: key, + value_bytes: value, + }; + + diesel::replace_into(openmls_key_store) + .values(entry) + .execute(conn)?; + Ok(()) + } +} diff --git a/xmtp_mls/src/storage/encrypted_store/mod.rs b/xmtp_mls/src/storage/encrypted_store/mod.rs index 269174954..e0ac313b9 100644 --- a/xmtp_mls/src/storage/encrypted_store/mod.rs +++ b/xmtp_mls/src/storage/encrypted_store/mod.rs @@ -66,13 +66,6 @@ pub struct EncryptedMessageStore { pool: Pool>, } -impl Default for EncryptedMessageStore { - fn default() -> Self { - Self::new(StorageOption::Ephemeral, Self::generate_enc_key()) - .expect("Error Occurred: trying to create default Ephemeral store") - } -} - impl<'a> From<&'a EncryptedMessageStore> for Cow<'a, EncryptedMessageStore> { fn from(store: &'a EncryptedMessageStore) -> Cow<'a, EncryptedMessageStore> { Cow::Borrowed(store) @@ -231,26 +224,11 @@ where mod tests { use std::{boxed::Box, fs}; - use rand::{ - distributions::{Alphanumeric, DistString}, - Rng, - }; - use super::{identity::StoredIdentity, EncryptedMessageStore, StorageError, StorageOption}; - use crate::{Fetch, Store}; - - pub(crate) fn rand_string() -> String { - Alphanumeric.sample_string(&mut rand::thread_rng(), 16) - } - - pub(crate) fn rand_vec() -> Vec { - rand::thread_rng().gen::<[u8; 16]>().to_vec() - } - - pub(crate) fn rand_time() -> i64 { - let mut rng = rand::thread_rng(); - rng.gen_range(0..1_000_000_000) - } + use crate::{ + utils::test::{rand_vec, tmp_path}, + Fetch, Store, + }; /// Test harness that loads an Ephemeral store. pub fn with_store(fun: F) -> R @@ -267,6 +245,17 @@ mod tests { fun(store, conn) } + impl EncryptedMessageStore { + pub fn new_test() -> Self { + let tmp_path = tmp_path(); + EncryptedMessageStore::new( + StorageOption::Persistent(tmp_path), + EncryptedMessageStore::generate_enc_key(), + ) + .unwrap() + } + } + #[test] fn ephemeral_store() { let store = EncryptedMessageStore::new( @@ -287,7 +276,7 @@ mod tests { #[test] fn persistent_store() { - let db_path = format!("{}.db3", rand_string()); + let db_path = tmp_path(); { let store = EncryptedMessageStore::new( StorageOption::Persistent(db_path.clone()), @@ -312,7 +301,7 @@ mod tests { fn mismatched_encryption_key() { let mut enc_key = [1u8; 32]; - let db_path = format!("{}.db3", rand_string()); + let db_path = tmp_path(); { // Setup a persistent store let store = diff --git a/xmtp_mls/src/storage/mod.rs b/xmtp_mls/src/storage/mod.rs index d9414cf57..85d7fc25a 100644 --- a/xmtp_mls/src/storage/mod.rs +++ b/xmtp_mls/src/storage/mod.rs @@ -4,7 +4,7 @@ mod serialization; pub mod sql_key_store; pub use encrypted_store::{ - group_intent, group_message, identity, key_store_entry, topic_refresh_state, DbConnection, - EncryptedMessageStore, EncryptionKey, StorageOption, + group, group_intent, group_message, identity, key_store_entry, topic_refresh_state, + DbConnection, EncryptedMessageStore, EncryptionKey, StorageOption, }; pub use errors::StorageError; diff --git a/xmtp_mls/src/storage/sql_key_store.rs b/xmtp_mls/src/storage/sql_key_store.rs index 68b1f6812..442bccf69 100644 --- a/xmtp_mls/src/storage/sql_key_store.rs +++ b/xmtp_mls/src/storage/sql_key_store.rs @@ -8,7 +8,7 @@ use super::{ serialization::{db_deserialize, db_serialize}, EncryptedMessageStore, StorageError, }; -use crate::{Delete, Fetch, Store}; +use crate::{Delete, Fetch}; #[derive(Debug)] /// CRUD Operations for an [`EncryptedMessageStore`] @@ -16,14 +16,6 @@ pub struct SqlKeyStore<'a> { store: Cow<'a, EncryptedMessageStore>, } -impl Default for SqlKeyStore<'_> { - fn default() -> Self { - Self { - store: Cow::Owned(EncryptedMessageStore::default()), - } - } -} - impl<'a> SqlKeyStore<'a> { pub fn new(store: &'a EncryptedMessageStore) -> Self { SqlKeyStore { @@ -41,11 +33,11 @@ impl OpenMlsKeyStore for SqlKeyStore<'_> { /// /// Returns an error if storing fails. fn store(&self, k: &[u8], v: &V) -> Result<(), Self::Error> { - let entry = StoredKeyStoreEntry { - key_bytes: k.to_vec(), - value_bytes: db_serialize(v)?, - }; - entry.store(&mut self.store.conn()?)?; + self.store.insert_or_update_key_store_entry( + &mut self.store.conn()?, + k.to_vec(), + db_serialize(v)?, + )?; Ok(()) } @@ -90,21 +82,17 @@ impl OpenMlsKeyStore for SqlKeyStore<'_> { mod tests { use openmls_basic_credential::SignatureKeyPair; use openmls_traits::key_store::OpenMlsKeyStore; - use rand::distributions::{Alphanumeric, DistString}; use super::SqlKeyStore; use crate::{ configuration::CIPHERSUITE, storage::{EncryptedMessageStore, StorageOption}, + utils::test::tmp_path, }; - fn rand_string() -> String { - Alphanumeric.sample_string(&mut rand::thread_rng(), 16) - } - #[test] fn store_read_delete() { - let db_path = format!("{}.db3", rand_string()); + let db_path = tmp_path(); let store = EncryptedMessageStore::new( StorageOption::Persistent(db_path), EncryptedMessageStore::generate_enc_key(), diff --git a/xmtp_mls/src/utils/hash.rs b/xmtp_mls/src/utils/hash.rs new file mode 100644 index 000000000..829f2d7ea --- /dev/null +++ b/xmtp_mls/src/utils/hash.rs @@ -0,0 +1,5 @@ +use xmtp_cryptography::hash::sha256_bytes; + +pub fn sha256(bytes: &[u8]) -> Vec { + sha256_bytes(bytes) +} diff --git a/xmtp_mls/src/utils/mod.rs b/xmtp_mls/src/utils/mod.rs new file mode 100644 index 000000000..79f3f4814 --- /dev/null +++ b/xmtp_mls/src/utils/mod.rs @@ -0,0 +1,5 @@ +pub mod hash; +#[cfg(test)] +pub mod test; +pub mod time; +pub mod topic; diff --git a/xmtp_mls/src/utils/test.rs b/xmtp_mls/src/utils/test.rs new file mode 100644 index 000000000..4c1e426cb --- /dev/null +++ b/xmtp_mls/src/utils/test.rs @@ -0,0 +1,24 @@ +use std::env; + +use rand::{ + distributions::{Alphanumeric, DistString}, + Rng, +}; + +pub fn rand_string() -> String { + Alphanumeric.sample_string(&mut rand::thread_rng(), 24) +} + +pub fn rand_vec() -> Vec { + rand::thread_rng().gen::<[u8; 24]>().to_vec() +} + +pub fn tmp_path() -> String { + let db_name = rand_string(); + format!("{}/{}.db3", env::temp_dir().to_str().unwrap(), db_name) +} + +pub fn rand_time() -> i64 { + let mut rng = rand::thread_rng(); + rng.gen_range(0..1_000_000_000) +} diff --git a/xmtp_mls/src/utils/time.rs b/xmtp_mls/src/utils/time.rs new file mode 100644 index 000000000..455bf56e0 --- /dev/null +++ b/xmtp_mls/src/utils/time.rs @@ -0,0 +1,9 @@ +use std::time::{SystemTime, UNIX_EPOCH}; + +pub fn now_ns() -> i64 { + let now = SystemTime::now(); + + now.duration_since(UNIX_EPOCH) + .expect("Time went backwards") + .as_nanos() as i64 +} diff --git a/xmtp_mls/src/utils/topic.rs b/xmtp_mls/src/utils/topic.rs new file mode 100644 index 000000000..4b2dc05f7 --- /dev/null +++ b/xmtp_mls/src/utils/topic.rs @@ -0,0 +1,3 @@ +pub fn get_group_topic(group_id: &Vec) -> String { + format!("/xmtp/3/g-{}/proto", hex::encode(group_id)) +} diff --git a/xmtp_proto/Cargo.toml b/xmtp_proto/Cargo.toml index fc81cc890..1b63f5673 100644 --- a/xmtp_proto/Cargo.toml +++ b/xmtp_proto/Cargo.toml @@ -20,11 +20,12 @@ grpc = ["tonic"] # @@protoc_deletion_point(features) # This section is automatically generated by protoc-gen-prost-crate. # Changes in this area may be lost on regeneration. -proto_full = ["xmtp-keystore_api-v1","xmtp-message_api-v1","xmtp-message_api-v3","xmtp-message_contents","xmtp-mls-message_contents","xmtp-mls_validation-v1","xmtp-v3-message_contents"] +proto_full = ["xmtp-keystore_api-v1","xmtp-message_api-v1","xmtp-message_api-v3","xmtp-message_contents","xmtp-mls-database","xmtp-mls-message_contents","xmtp-mls_validation-v1","xmtp-v3-message_contents"] "xmtp-keystore_api-v1" = ["xmtp-message_contents"] "xmtp-message_api-v1" = ["xmtp-message_contents"] "xmtp-message_api-v3" = ["xmtp-message_contents","xmtp-mls-message_contents"] "xmtp-message_contents" = [] +"xmtp-mls-database" = [] "xmtp-mls-message_contents" = [] "xmtp-mls_validation-v1" = [] "xmtp-v3-message_contents" = [] diff --git a/xmtp_proto/src/gen/mod.rs b/xmtp_proto/src/gen/mod.rs index b1a310b76..7dae81696 100644 --- a/xmtp_proto/src/gen/mod.rs +++ b/xmtp_proto/src/gen/mod.rs @@ -29,6 +29,12 @@ pub mod xmtp { // @@protoc_insertion_point(xmtp.message_contents) } pub mod mls { + #[cfg(feature = "xmtp-mls-database")] + // @@protoc_insertion_point(attribute:xmtp.mls.database) + pub mod database { + include!("xmtp.mls.database.rs"); + // @@protoc_insertion_point(xmtp.mls.database) + } #[cfg(feature = "xmtp-mls-message_contents")] // @@protoc_insertion_point(attribute:xmtp.mls.message_contents) pub mod message_contents { diff --git a/xmtp_proto/src/gen/xmtp.mls.database.rs b/xmtp_proto/src/gen/xmtp.mls.database.rs new file mode 100644 index 000000000..b48c33f0c --- /dev/null +++ b/xmtp_proto/src/gen/xmtp.mls.database.rs @@ -0,0 +1,240 @@ +// @generated +/// The data required to publish a message +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SendMessagePublishData { + #[prost(oneof="send_message_publish_data::Version", tags="1")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `SendMessagePublishData`. +pub mod send_message_publish_data { + /// V1 of SendMessagePublishData + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] + pub struct V1 { + #[prost(bytes="vec", tag="1")] + pub payload_bytes: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag="1")] + V1(V1), + } +} +/// The data required to add members to a group +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AddMembersPublishData { + #[prost(oneof="add_members_publish_data::Version", tags="1")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `AddMembersPublishData`. +pub mod add_members_publish_data { + /// V1 of AddMembersPublishData + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] + pub struct V1 { + #[prost(bytes="vec", repeated, tag="1")] + pub key_packages_bytes_tls_serialized: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, + } + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag="1")] + V1(V1), + } +} +/// The data required to remove members from a group +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RemoveMembersPublishData { + #[prost(oneof="remove_members_publish_data::Version", tags="1")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `RemoveMembersPublishData`. +pub mod remove_members_publish_data { + /// V1 of RemoveMembersPublishData + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] + pub struct V1 { + #[prost(bytes="vec", repeated, tag="1")] + pub installation_ids: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, + } + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag="1")] + V1(V1), + } +} +/// Generic data-type for all post-commit actions +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PostCommitAction { + #[prost(oneof="post_commit_action::Kind", tags="1")] + pub kind: ::core::option::Option, +} +/// Nested message and enum types in `PostCommitAction`. +pub mod post_commit_action { + /// SendWelcome message + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] + pub struct SendWelcomes { + #[prost(bytes="vec", repeated, tag="1")] + pub installation_ids: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, + #[prost(bytes="vec", tag="2")] + pub welcome_message: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Kind { + #[prost(message, tag="1")] + SendWelcomes(SendWelcomes), + } +} +/// Encoded file descriptor set for the `xmtp.mls.database` package +pub const FILE_DESCRIPTOR_SET: &[u8] = &[ + 0x0a, 0xb9, 0x11, 0x0a, 0x1a, 0x6d, 0x6c, 0x73, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x11, 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x22, 0x8e, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3e, 0x0a, + 0x02, 0x76, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x78, 0x6d, 0x74, 0x70, + 0x2e, 0x6d, 0x6c, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x53, 0x65, + 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x44, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x31, 0x48, 0x00, 0x52, 0x02, 0x76, 0x31, 0x1a, 0x29, 0x0a, + 0x02, 0x56, 0x31, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0xb1, 0x01, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3d, 0x0a, + 0x02, 0x76, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x78, 0x6d, 0x74, 0x70, + 0x2e, 0x6d, 0x6c, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x41, 0x64, + 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x44, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x31, 0x48, 0x00, 0x52, 0x02, 0x76, 0x31, 0x1a, 0x4e, 0x0a, 0x02, + 0x56, 0x31, 0x12, 0x48, 0x0a, 0x21, 0x6b, 0x65, 0x79, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x1d, 0x6b, + 0x65, 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x54, + 0x6c, 0x73, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x42, 0x09, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x98, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x02, 0x76, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x31, + 0x48, 0x00, 0x52, 0x02, 0x76, 0x31, 0x1a, 0x2f, 0x0a, 0x02, 0x56, 0x31, 0x12, 0x29, 0x0a, 0x10, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0xd7, 0x01, 0x0a, 0x10, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x57, 0x0a, 0x0d, 0x73, 0x65, 0x6e, 0x64, 0x5f, + 0x77, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, + 0x2e, 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x73, + 0x48, 0x00, 0x52, 0x0c, 0x73, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x73, + 0x1a, 0x62, 0x0a, 0x0c, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x73, + 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x77, + 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x77, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x42, 0xb5, 0x01, 0x0a, + 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, 0x73, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x42, 0x0c, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x78, 0x6d, 0x74, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x33, + 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6c, 0x73, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0xa2, 0x02, 0x03, 0x58, 0x4d, 0x44, 0xaa, 0x02, 0x11, 0x58, 0x6d, 0x74, 0x70, 0x2e, 0x4d, 0x6c, + 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0xca, 0x02, 0x11, 0x58, 0x6d, 0x74, + 0x70, 0x5c, 0x4d, 0x6c, 0x73, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0xe2, 0x02, + 0x1d, 0x58, 0x6d, 0x74, 0x70, 0x5c, 0x4d, 0x6c, 0x73, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x13, 0x58, 0x6d, 0x74, 0x70, 0x3a, 0x3a, 0x4d, 0x6c, 0x73, 0x3a, 0x3a, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4a, 0x8d, 0x0a, 0x0a, 0x06, 0x12, 0x04, 0x01, 0x00, 0x37, 0x01, 0x0a, + 0x27, 0x0a, 0x01, 0x0c, 0x12, 0x03, 0x01, 0x00, 0x12, 0x1a, 0x1d, 0x20, 0x56, 0x33, 0x20, 0x69, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x0a, 0x0a, 0x08, 0x0a, 0x01, 0x02, 0x12, 0x03, 0x03, + 0x00, 0x1a, 0x0a, 0x08, 0x0a, 0x01, 0x08, 0x12, 0x03, 0x05, 0x00, 0x3f, 0x0a, 0x09, 0x0a, 0x02, + 0x08, 0x0b, 0x12, 0x03, 0x05, 0x00, 0x3f, 0x0a, 0x34, 0x0a, 0x02, 0x04, 0x00, 0x12, 0x04, 0x09, + 0x00, 0x12, 0x01, 0x1a, 0x28, 0x20, 0x54, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x20, 0x61, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x0a, 0x0a, 0x0a, 0x0a, + 0x03, 0x04, 0x00, 0x01, 0x12, 0x03, 0x09, 0x08, 0x1e, 0x0a, 0x2c, 0x0a, 0x04, 0x04, 0x00, 0x03, + 0x00, 0x12, 0x04, 0x0b, 0x04, 0x0d, 0x05, 0x1a, 0x1e, 0x20, 0x56, 0x31, 0x20, 0x6f, 0x66, 0x20, + 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x44, 0x61, 0x74, 0x61, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x00, 0x01, + 0x12, 0x03, 0x0b, 0x0c, 0x0e, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, + 0x03, 0x0c, 0x08, 0x20, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, + 0x03, 0x0c, 0x08, 0x0d, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, + 0x03, 0x0c, 0x0e, 0x1b, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, + 0x03, 0x0c, 0x1e, 0x1f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x00, 0x08, 0x00, 0x12, 0x04, 0x0f, 0x04, + 0x11, 0x05, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x08, 0x00, 0x01, 0x12, 0x03, 0x0f, 0x0a, 0x11, + 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x00, 0x12, 0x03, 0x10, 0x08, 0x12, 0x0a, 0x0c, 0x0a, + 0x05, 0x04, 0x00, 0x02, 0x00, 0x06, 0x12, 0x03, 0x10, 0x08, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, + 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x10, 0x0b, 0x0d, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, + 0x00, 0x03, 0x12, 0x03, 0x10, 0x10, 0x11, 0x0a, 0x39, 0x0a, 0x02, 0x04, 0x01, 0x12, 0x04, 0x15, + 0x00, 0x1e, 0x01, 0x1a, 0x2d, 0x20, 0x54, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x01, 0x01, 0x12, 0x03, 0x15, 0x08, 0x1d, 0x0a, 0x2b, + 0x0a, 0x04, 0x04, 0x01, 0x03, 0x00, 0x12, 0x04, 0x17, 0x04, 0x19, 0x05, 0x1a, 0x1d, 0x20, 0x56, + 0x31, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x44, 0x61, 0x74, 0x61, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, + 0x01, 0x03, 0x00, 0x01, 0x12, 0x03, 0x17, 0x0c, 0x0e, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x03, + 0x00, 0x02, 0x00, 0x12, 0x03, 0x18, 0x08, 0x3d, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, + 0x02, 0x00, 0x04, 0x12, 0x03, 0x18, 0x08, 0x10, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, + 0x02, 0x00, 0x05, 0x12, 0x03, 0x18, 0x11, 0x16, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, + 0x02, 0x00, 0x01, 0x12, 0x03, 0x18, 0x17, 0x38, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, + 0x02, 0x00, 0x03, 0x12, 0x03, 0x18, 0x3b, 0x3c, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x01, 0x08, 0x00, + 0x12, 0x04, 0x1b, 0x04, 0x1d, 0x05, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x08, 0x00, 0x01, 0x12, + 0x03, 0x1b, 0x0a, 0x11, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x00, 0x12, 0x03, 0x1c, 0x08, + 0x12, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x06, 0x12, 0x03, 0x1c, 0x08, 0x0a, 0x0a, + 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x01, 0x12, 0x03, 0x1c, 0x0b, 0x0d, 0x0a, 0x0c, 0x0a, + 0x05, 0x04, 0x01, 0x02, 0x00, 0x03, 0x12, 0x03, 0x1c, 0x10, 0x11, 0x0a, 0x3e, 0x0a, 0x02, 0x04, + 0x02, 0x12, 0x04, 0x21, 0x00, 0x2a, 0x01, 0x1a, 0x32, 0x20, 0x54, 0x68, 0x65, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, + 0x02, 0x01, 0x12, 0x03, 0x21, 0x08, 0x20, 0x0a, 0x2e, 0x0a, 0x04, 0x04, 0x02, 0x03, 0x00, 0x12, + 0x04, 0x23, 0x04, 0x25, 0x05, 0x1a, 0x20, 0x20, 0x56, 0x31, 0x20, 0x6f, 0x66, 0x20, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x44, 0x61, 0x74, 0x61, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x03, 0x00, 0x01, + 0x12, 0x03, 0x23, 0x0c, 0x0e, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x02, 0x03, 0x00, 0x02, 0x00, 0x12, + 0x03, 0x24, 0x08, 0x2c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x02, 0x03, 0x00, 0x02, 0x00, 0x04, 0x12, + 0x03, 0x24, 0x08, 0x10, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x02, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, + 0x03, 0x24, 0x11, 0x16, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x02, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, + 0x03, 0x24, 0x17, 0x27, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x02, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, + 0x03, 0x24, 0x2a, 0x2b, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x02, 0x08, 0x00, 0x12, 0x04, 0x27, 0x04, + 0x29, 0x05, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x08, 0x00, 0x01, 0x12, 0x03, 0x27, 0x0a, 0x11, + 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x02, 0x02, 0x00, 0x12, 0x03, 0x28, 0x08, 0x12, 0x0a, 0x0c, 0x0a, + 0x05, 0x04, 0x02, 0x02, 0x00, 0x06, 0x12, 0x03, 0x28, 0x08, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, + 0x02, 0x02, 0x00, 0x01, 0x12, 0x03, 0x28, 0x0b, 0x0d, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, + 0x00, 0x03, 0x12, 0x03, 0x28, 0x10, 0x11, 0x0a, 0x3b, 0x0a, 0x02, 0x04, 0x03, 0x12, 0x04, 0x2d, + 0x00, 0x37, 0x01, 0x1a, 0x2f, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, + 0x70, 0x6f, 0x73, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x03, 0x01, 0x12, 0x03, 0x2d, 0x08, 0x18, + 0x0a, 0x23, 0x0a, 0x04, 0x04, 0x03, 0x03, 0x00, 0x12, 0x04, 0x2f, 0x04, 0x32, 0x05, 0x1a, 0x15, + 0x20, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x03, 0x00, 0x01, 0x12, 0x03, + 0x2f, 0x0c, 0x18, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x03, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x30, + 0x08, 0x2c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x00, 0x04, 0x12, 0x03, 0x30, + 0x08, 0x10, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x30, + 0x11, 0x16, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x30, + 0x17, 0x27, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x30, + 0x2a, 0x2b, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x03, 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x31, 0x08, + 0x22, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x01, 0x05, 0x12, 0x03, 0x31, 0x08, + 0x0d, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x31, 0x0e, + 0x1d, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x31, 0x20, + 0x21, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x03, 0x08, 0x00, 0x12, 0x04, 0x34, 0x04, 0x36, 0x05, 0x0a, + 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x08, 0x00, 0x01, 0x12, 0x03, 0x34, 0x0a, 0x0e, 0x0a, 0x0b, 0x0a, + 0x04, 0x04, 0x03, 0x02, 0x00, 0x12, 0x03, 0x35, 0x08, 0x27, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, + 0x02, 0x00, 0x06, 0x12, 0x03, 0x35, 0x08, 0x14, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x00, + 0x01, 0x12, 0x03, 0x35, 0x15, 0x22, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x12, + 0x03, 0x35, 0x25, 0x26, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +]; +include!("xmtp.mls.database.serde.rs"); +// @@protoc_insertion_point(module) \ No newline at end of file diff --git a/xmtp_proto/src/gen/xmtp.mls.database.serde.rs b/xmtp_proto/src/gen/xmtp.mls.database.serde.rs new file mode 100644 index 000000000..930372481 --- /dev/null +++ b/xmtp_proto/src/gen/xmtp.mls.database.serde.rs @@ -0,0 +1,785 @@ +// @generated +impl serde::Serialize for AddMembersPublishData { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.version.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("xmtp.mls.database.AddMembersPublishData", len)?; + if let Some(v) = self.version.as_ref() { + match v { + add_members_publish_data::Version::V1(v) => { + struct_ser.serialize_field("v1", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for AddMembersPublishData { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "v1", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + V1, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "v1" => Ok(GeneratedField::V1), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = AddMembersPublishData; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct xmtp.mls.database.AddMembersPublishData") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut version__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::V1 => { + if version__.is_some() { + return Err(serde::de::Error::duplicate_field("v1")); + } + version__ = map.next_value::<::std::option::Option<_>>()?.map(add_members_publish_data::Version::V1) +; + } + } + } + Ok(AddMembersPublishData { + version: version__, + }) + } + } + deserializer.deserialize_struct("xmtp.mls.database.AddMembersPublishData", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for add_members_publish_data::V1 { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.key_packages_bytes_tls_serialized.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("xmtp.mls.database.AddMembersPublishData.V1", len)?; + if !self.key_packages_bytes_tls_serialized.is_empty() { + struct_ser.serialize_field("keyPackagesBytesTlsSerialized", &self.key_packages_bytes_tls_serialized.iter().map(pbjson::private::base64::encode).collect::>())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for add_members_publish_data::V1 { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "key_packages_bytes_tls_serialized", + "keyPackagesBytesTlsSerialized", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + KeyPackagesBytesTlsSerialized, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "keyPackagesBytesTlsSerialized" | "key_packages_bytes_tls_serialized" => Ok(GeneratedField::KeyPackagesBytesTlsSerialized), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = add_members_publish_data::V1; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct xmtp.mls.database.AddMembersPublishData.V1") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut key_packages_bytes_tls_serialized__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::KeyPackagesBytesTlsSerialized => { + if key_packages_bytes_tls_serialized__.is_some() { + return Err(serde::de::Error::duplicate_field("keyPackagesBytesTlsSerialized")); + } + key_packages_bytes_tls_serialized__ = + Some(map.next_value::>>()? + .into_iter().map(|x| x.0).collect()) + ; + } + } + } + Ok(add_members_publish_data::V1 { + key_packages_bytes_tls_serialized: key_packages_bytes_tls_serialized__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("xmtp.mls.database.AddMembersPublishData.V1", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for PostCommitAction { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.kind.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("xmtp.mls.database.PostCommitAction", len)?; + if let Some(v) = self.kind.as_ref() { + match v { + post_commit_action::Kind::SendWelcomes(v) => { + struct_ser.serialize_field("sendWelcomes", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for PostCommitAction { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "send_welcomes", + "sendWelcomes", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + SendWelcomes, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "sendWelcomes" | "send_welcomes" => Ok(GeneratedField::SendWelcomes), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = PostCommitAction; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct xmtp.mls.database.PostCommitAction") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut kind__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::SendWelcomes => { + if kind__.is_some() { + return Err(serde::de::Error::duplicate_field("sendWelcomes")); + } + kind__ = map.next_value::<::std::option::Option<_>>()?.map(post_commit_action::Kind::SendWelcomes) +; + } + } + } + Ok(PostCommitAction { + kind: kind__, + }) + } + } + deserializer.deserialize_struct("xmtp.mls.database.PostCommitAction", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for post_commit_action::SendWelcomes { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.installation_ids.is_empty() { + len += 1; + } + if !self.welcome_message.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("xmtp.mls.database.PostCommitAction.SendWelcomes", len)?; + if !self.installation_ids.is_empty() { + struct_ser.serialize_field("installationIds", &self.installation_ids.iter().map(pbjson::private::base64::encode).collect::>())?; + } + if !self.welcome_message.is_empty() { + struct_ser.serialize_field("welcomeMessage", pbjson::private::base64::encode(&self.welcome_message).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for post_commit_action::SendWelcomes { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "installation_ids", + "installationIds", + "welcome_message", + "welcomeMessage", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InstallationIds, + WelcomeMessage, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "installationIds" | "installation_ids" => Ok(GeneratedField::InstallationIds), + "welcomeMessage" | "welcome_message" => Ok(GeneratedField::WelcomeMessage), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = post_commit_action::SendWelcomes; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct xmtp.mls.database.PostCommitAction.SendWelcomes") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut installation_ids__ = None; + let mut welcome_message__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::InstallationIds => { + if installation_ids__.is_some() { + return Err(serde::de::Error::duplicate_field("installationIds")); + } + installation_ids__ = + Some(map.next_value::>>()? + .into_iter().map(|x| x.0).collect()) + ; + } + GeneratedField::WelcomeMessage => { + if welcome_message__.is_some() { + return Err(serde::de::Error::duplicate_field("welcomeMessage")); + } + welcome_message__ = + Some(map.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + } + } + Ok(post_commit_action::SendWelcomes { + installation_ids: installation_ids__.unwrap_or_default(), + welcome_message: welcome_message__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("xmtp.mls.database.PostCommitAction.SendWelcomes", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for RemoveMembersPublishData { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.version.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("xmtp.mls.database.RemoveMembersPublishData", len)?; + if let Some(v) = self.version.as_ref() { + match v { + remove_members_publish_data::Version::V1(v) => { + struct_ser.serialize_field("v1", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for RemoveMembersPublishData { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "v1", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + V1, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "v1" => Ok(GeneratedField::V1), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = RemoveMembersPublishData; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct xmtp.mls.database.RemoveMembersPublishData") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut version__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::V1 => { + if version__.is_some() { + return Err(serde::de::Error::duplicate_field("v1")); + } + version__ = map.next_value::<::std::option::Option<_>>()?.map(remove_members_publish_data::Version::V1) +; + } + } + } + Ok(RemoveMembersPublishData { + version: version__, + }) + } + } + deserializer.deserialize_struct("xmtp.mls.database.RemoveMembersPublishData", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for remove_members_publish_data::V1 { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.installation_ids.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("xmtp.mls.database.RemoveMembersPublishData.V1", len)?; + if !self.installation_ids.is_empty() { + struct_ser.serialize_field("installationIds", &self.installation_ids.iter().map(pbjson::private::base64::encode).collect::>())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for remove_members_publish_data::V1 { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "installation_ids", + "installationIds", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InstallationIds, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "installationIds" | "installation_ids" => Ok(GeneratedField::InstallationIds), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = remove_members_publish_data::V1; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct xmtp.mls.database.RemoveMembersPublishData.V1") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut installation_ids__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::InstallationIds => { + if installation_ids__.is_some() { + return Err(serde::de::Error::duplicate_field("installationIds")); + } + installation_ids__ = + Some(map.next_value::>>()? + .into_iter().map(|x| x.0).collect()) + ; + } + } + } + Ok(remove_members_publish_data::V1 { + installation_ids: installation_ids__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("xmtp.mls.database.RemoveMembersPublishData.V1", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for SendMessagePublishData { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.version.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("xmtp.mls.database.SendMessagePublishData", len)?; + if let Some(v) = self.version.as_ref() { + match v { + send_message_publish_data::Version::V1(v) => { + struct_ser.serialize_field("v1", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for SendMessagePublishData { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "v1", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + V1, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "v1" => Ok(GeneratedField::V1), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = SendMessagePublishData; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct xmtp.mls.database.SendMessagePublishData") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut version__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::V1 => { + if version__.is_some() { + return Err(serde::de::Error::duplicate_field("v1")); + } + version__ = map.next_value::<::std::option::Option<_>>()?.map(send_message_publish_data::Version::V1) +; + } + } + } + Ok(SendMessagePublishData { + version: version__, + }) + } + } + deserializer.deserialize_struct("xmtp.mls.database.SendMessagePublishData", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for send_message_publish_data::V1 { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.payload_bytes.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("xmtp.mls.database.SendMessagePublishData.V1", len)?; + if !self.payload_bytes.is_empty() { + struct_ser.serialize_field("payloadBytes", pbjson::private::base64::encode(&self.payload_bytes).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for send_message_publish_data::V1 { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "payload_bytes", + "payloadBytes", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PayloadBytes, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "payloadBytes" | "payload_bytes" => Ok(GeneratedField::PayloadBytes), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = send_message_publish_data::V1; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct xmtp.mls.database.SendMessagePublishData.V1") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut payload_bytes__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::PayloadBytes => { + if payload_bytes__.is_some() { + return Err(serde::de::Error::duplicate_field("payloadBytes")); + } + payload_bytes__ = + Some(map.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + } + } + Ok(send_message_publish_data::V1 { + payload_bytes: payload_bytes__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("xmtp.mls.database.SendMessagePublishData.V1", FIELDS, GeneratedVisitor) + } +} diff --git a/xmtp_proto/src/gen/xmtp.mls_validation.v1.rs b/xmtp_proto/src/gen/xmtp.mls_validation.v1.rs index 660f72a59..2407976ef 100644 --- a/xmtp_proto/src/gen/xmtp.mls_validation.v1.rs +++ b/xmtp_proto/src/gen/xmtp.mls_validation.v1.rs @@ -77,13 +77,11 @@ pub mod validate_group_messages_response { pub error_message: ::prost::alloc::string::String, #[prost(string, tag="3")] pub group_id: ::prost::alloc::string::String, - #[prost(uint64, tag="4")] - pub epoch: u64, } } /// Encoded file descriptor set for the `xmtp.mls_validation.v1` package pub const FILE_DESCRIPTOR_SET: &[u8] = &[ - 0x0a, 0xb5, 0x1b, 0x0a, 0x1f, 0x6d, 0x6c, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x0a, 0xe0, 0x1a, 0x0a, 0x1f, 0x6d, 0x6c, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x22, 0xd4, 0x01, 0x0a, @@ -136,7 +134,7 @@ pub const FILE_DESCRIPTOR_SET: &[u8] = &[ 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x1e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x54, 0x6c, 0x73, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x88, 0x02, + 0x54, 0x6c, 0x73, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x22, 0xf2, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, @@ -145,164 +143,159 @@ pub const FILE_DESCRIPTOR_SET: &[u8] = &[ 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x7f, 0x0a, 0x12, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x69, 0x0a, 0x12, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x69, 0x73, 0x5f, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x69, 0x73, 0x4f, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x32, 0x9b, 0x02, 0x0a, 0x0d, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x69, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x73, 0x12, 0x32, 0x2e, 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, 0x73, 0x5f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, - 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x86, 0x01, - 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x34, 0x2e, 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, + 0x49, 0x64, 0x32, 0x9b, 0x02, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x41, 0x70, 0x69, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x78, + 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x33, 0x2e, 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x86, 0x01, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x12, 0x34, 0x2e, 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, 0x73, 0x5f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, - 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xcf, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x78, - 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x78, 0x6d, 0x74, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x33, 0x2f, - 0x67, 0x6f, 0x2f, 0x6d, 0x6c, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x58, 0x4d, 0x58, 0xaa, 0x02, 0x15, 0x58, 0x6d, 0x74, - 0x70, 0x2e, 0x4d, 0x6c, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x56, 0x31, 0xca, 0x02, 0x15, 0x58, 0x6d, 0x74, 0x70, 0x5c, 0x4d, 0x6c, 0x73, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x21, 0x58, 0x6d, 0x74, - 0x70, 0x5c, 0x4d, 0x6c, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, - 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, - 0x17, 0x58, 0x6d, 0x74, 0x70, 0x3a, 0x3a, 0x4d, 0x6c, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x4a, 0xd5, 0x0e, 0x0a, 0x06, 0x12, 0x04, 0x01, - 0x00, 0x3c, 0x01, 0x0a, 0x17, 0x0a, 0x01, 0x0c, 0x12, 0x03, 0x01, 0x00, 0x12, 0x1a, 0x0d, 0x20, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x0a, 0x0a, 0x08, 0x0a, 0x01, - 0x02, 0x12, 0x03, 0x02, 0x00, 0x1f, 0x0a, 0x08, 0x0a, 0x01, 0x08, 0x12, 0x03, 0x04, 0x00, 0x44, - 0x0a, 0x09, 0x0a, 0x02, 0x08, 0x0b, 0x12, 0x03, 0x04, 0x00, 0x44, 0x0a, 0x26, 0x0a, 0x02, 0x06, - 0x00, 0x12, 0x04, 0x07, 0x00, 0x0d, 0x01, 0x1a, 0x1a, 0x20, 0x52, 0x50, 0x43, 0x73, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x4c, 0x53, 0x20, 0x41, - 0x50, 0x49, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x06, 0x00, 0x01, 0x12, 0x03, 0x07, 0x08, 0x15, 0x0a, - 0x58, 0x0a, 0x04, 0x06, 0x00, 0x02, 0x00, 0x12, 0x03, 0x09, 0x02, 0x5e, 0x1a, 0x4b, 0x20, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x6b, - 0x65, 0x79, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, - 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x06, 0x00, 0x02, - 0x00, 0x01, 0x12, 0x03, 0x09, 0x06, 0x19, 0x0a, 0x0c, 0x0a, 0x05, 0x06, 0x00, 0x02, 0x00, 0x02, - 0x12, 0x03, 0x09, 0x1a, 0x34, 0x0a, 0x0c, 0x0a, 0x05, 0x06, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, - 0x09, 0x3f, 0x5a, 0x0a, 0x50, 0x0a, 0x04, 0x06, 0x00, 0x02, 0x01, 0x12, 0x03, 0x0c, 0x02, 0x64, - 0x1a, 0x43, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x06, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, - 0x0c, 0x06, 0x1b, 0x0a, 0x0c, 0x0a, 0x05, 0x06, 0x00, 0x02, 0x01, 0x02, 0x12, 0x03, 0x0c, 0x1c, - 0x38, 0x0a, 0x0c, 0x0a, 0x05, 0x06, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x0c, 0x43, 0x60, 0x0a, - 0x39, 0x0a, 0x02, 0x04, 0x00, 0x12, 0x04, 0x10, 0x00, 0x17, 0x01, 0x1a, 0x2d, 0x20, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6f, - 0x66, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x4b, 0x65, 0x79, - 0x20, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x00, - 0x01, 0x12, 0x03, 0x10, 0x08, 0x22, 0x0a, 0x2c, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x00, 0x12, 0x04, - 0x12, 0x02, 0x14, 0x03, 0x1a, 0x1e, 0x20, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x00, 0x01, 0x12, 0x03, 0x12, - 0x0a, 0x14, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x13, 0x04, - 0x2f, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x13, 0x04, - 0x09, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x13, 0x0a, - 0x2a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x13, 0x2d, - 0x2e, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x00, 0x12, 0x03, 0x16, 0x02, 0x27, 0x0a, 0x0c, - 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x04, 0x12, 0x03, 0x16, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, - 0x04, 0x00, 0x02, 0x00, 0x06, 0x12, 0x03, 0x16, 0x0b, 0x15, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, - 0x02, 0x00, 0x01, 0x12, 0x03, 0x16, 0x16, 0x22, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, - 0x03, 0x12, 0x03, 0x16, 0x25, 0x26, 0x0a, 0x34, 0x0a, 0x02, 0x04, 0x01, 0x12, 0x04, 0x1a, 0x00, - 0x25, 0x01, 0x1a, 0x28, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x6f, - 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, - 0x04, 0x01, 0x01, 0x12, 0x03, 0x1a, 0x08, 0x23, 0x0a, 0x39, 0x0a, 0x04, 0x04, 0x01, 0x03, 0x00, - 0x12, 0x04, 0x1c, 0x02, 0x22, 0x03, 0x1a, 0x2b, 0x20, 0x41, 0x6e, 0x20, 0x69, 0x6e, 0x64, 0x69, - 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, - 0x74, 0x6f, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x03, 0x00, 0x01, 0x12, 0x03, 0x1c, 0x0a, - 0x1c, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x1d, 0x04, 0x13, - 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x1d, 0x04, 0x08, - 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x1d, 0x09, 0x0e, - 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x1d, 0x11, 0x12, - 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x1e, 0x04, 0x1d, 0x0a, - 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x01, 0x05, 0x12, 0x03, 0x1e, 0x04, 0x0a, 0x0a, - 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x1e, 0x0b, 0x18, 0x0a, - 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x1e, 0x1b, 0x1c, 0x0a, - 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x03, 0x00, 0x02, 0x02, 0x12, 0x03, 0x1f, 0x04, 0x1e, 0x0a, 0x0e, - 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x02, 0x05, 0x12, 0x03, 0x1f, 0x04, 0x09, 0x0a, 0x0e, - 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x1f, 0x0a, 0x19, 0x0a, 0x0e, - 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x02, 0x03, 0x12, 0x03, 0x1f, 0x1c, 0x1d, 0x0a, 0x0d, - 0x0a, 0x06, 0x04, 0x01, 0x03, 0x00, 0x02, 0x03, 0x12, 0x03, 0x20, 0x04, 0x1e, 0x0a, 0x0e, 0x0a, - 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x03, 0x05, 0x12, 0x03, 0x20, 0x04, 0x0a, 0x0a, 0x0e, 0x0a, - 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x03, 0x01, 0x12, 0x03, 0x20, 0x0b, 0x19, 0x0a, 0x0e, 0x0a, - 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x03, 0x03, 0x12, 0x03, 0x20, 0x1c, 0x1d, 0x0a, 0x0d, 0x0a, - 0x06, 0x04, 0x01, 0x03, 0x00, 0x02, 0x04, 0x12, 0x03, 0x21, 0x04, 0x28, 0x0a, 0x0e, 0x0a, 0x07, - 0x04, 0x01, 0x03, 0x00, 0x02, 0x04, 0x05, 0x12, 0x03, 0x21, 0x04, 0x09, 0x0a, 0x0e, 0x0a, 0x07, - 0x04, 0x01, 0x03, 0x00, 0x02, 0x04, 0x01, 0x12, 0x03, 0x21, 0x0a, 0x23, 0x0a, 0x0e, 0x0a, 0x07, - 0x04, 0x01, 0x03, 0x00, 0x02, 0x04, 0x03, 0x12, 0x03, 0x21, 0x26, 0x27, 0x0a, 0x0b, 0x0a, 0x04, - 0x04, 0x01, 0x02, 0x00, 0x12, 0x03, 0x24, 0x02, 0x2c, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, - 0x00, 0x04, 0x12, 0x03, 0x24, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x06, - 0x12, 0x03, 0x24, 0x0b, 0x1d, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x01, 0x12, 0x03, - 0x24, 0x1e, 0x27, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x03, 0x12, 0x03, 0x24, 0x2a, - 0x2b, 0x0a, 0x3b, 0x0a, 0x02, 0x04, 0x02, 0x12, 0x04, 0x28, 0x00, 0x2f, 0x01, 0x1a, 0x2f, 0x20, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, - 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x20, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x0a, 0x0a, 0x0a, - 0x0a, 0x03, 0x04, 0x02, 0x01, 0x12, 0x03, 0x28, 0x08, 0x24, 0x0a, 0x28, 0x0a, 0x04, 0x04, 0x02, - 0x03, 0x00, 0x12, 0x04, 0x2a, 0x02, 0x2c, 0x03, 0x1a, 0x1a, 0x20, 0x57, 0x72, 0x61, 0x70, 0x70, - 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x03, 0x00, 0x01, 0x12, 0x03, 0x2a, - 0x0a, 0x16, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x02, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x2b, 0x04, - 0x31, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x02, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x2b, 0x04, - 0x09, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x02, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x2b, 0x0a, - 0x2c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x02, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x2b, 0x2f, - 0x30, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x02, 0x02, 0x00, 0x12, 0x03, 0x2e, 0x02, 0x2b, 0x0a, 0x0c, - 0x0a, 0x05, 0x04, 0x02, 0x02, 0x00, 0x04, 0x12, 0x03, 0x2e, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, - 0x04, 0x02, 0x02, 0x00, 0x06, 0x12, 0x03, 0x2e, 0x0b, 0x17, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, - 0x02, 0x00, 0x01, 0x12, 0x03, 0x2e, 0x18, 0x26, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x00, - 0x03, 0x12, 0x03, 0x2e, 0x29, 0x2a, 0x0a, 0x36, 0x0a, 0x02, 0x04, 0x03, 0x12, 0x04, 0x32, 0x00, - 0x3c, 0x01, 0x1a, 0x2a, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x6f, - 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x0a, 0x0a, 0x0a, - 0x0a, 0x03, 0x04, 0x03, 0x01, 0x12, 0x03, 0x32, 0x08, 0x25, 0x0a, 0x35, 0x0a, 0x04, 0x04, 0x03, - 0x03, 0x00, 0x12, 0x04, 0x34, 0x02, 0x39, 0x03, 0x1a, 0x27, 0x20, 0x41, 0x6e, 0x20, 0x69, 0x6e, - 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x03, 0x00, 0x01, 0x12, 0x03, 0x34, 0x0a, 0x1c, 0x0a, - 0x0d, 0x0a, 0x06, 0x04, 0x03, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x35, 0x04, 0x13, 0x0a, 0x0e, - 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x35, 0x04, 0x08, 0x0a, 0x0e, - 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x35, 0x09, 0x0e, 0x0a, 0x0e, - 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x35, 0x11, 0x12, 0x0a, 0x0d, - 0x0a, 0x06, 0x04, 0x03, 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x36, 0x04, 0x1d, 0x0a, 0x0e, 0x0a, - 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x01, 0x05, 0x12, 0x03, 0x36, 0x04, 0x0a, 0x0a, 0x0e, 0x0a, - 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x36, 0x0b, 0x18, 0x0a, 0x0e, 0x0a, - 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x36, 0x1b, 0x1c, 0x0a, 0x0d, 0x0a, - 0x06, 0x04, 0x03, 0x03, 0x00, 0x02, 0x02, 0x12, 0x03, 0x37, 0x04, 0x18, 0x0a, 0x0e, 0x0a, 0x07, - 0x04, 0x03, 0x03, 0x00, 0x02, 0x02, 0x05, 0x12, 0x03, 0x37, 0x04, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, - 0x04, 0x03, 0x03, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x37, 0x0b, 0x13, 0x0a, 0x0e, 0x0a, 0x07, - 0x04, 0x03, 0x03, 0x00, 0x02, 0x02, 0x03, 0x12, 0x03, 0x37, 0x16, 0x17, 0x0a, 0x0d, 0x0a, 0x06, - 0x04, 0x03, 0x03, 0x00, 0x02, 0x03, 0x12, 0x03, 0x38, 0x04, 0x15, 0x0a, 0x0e, 0x0a, 0x07, 0x04, - 0x03, 0x03, 0x00, 0x02, 0x03, 0x05, 0x12, 0x03, 0x38, 0x04, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, - 0x03, 0x03, 0x00, 0x02, 0x03, 0x01, 0x12, 0x03, 0x38, 0x0b, 0x10, 0x0a, 0x0e, 0x0a, 0x07, 0x04, - 0x03, 0x03, 0x00, 0x02, 0x03, 0x03, 0x12, 0x03, 0x38, 0x13, 0x14, 0x0a, 0x0b, 0x0a, 0x04, 0x04, - 0x03, 0x02, 0x00, 0x12, 0x03, 0x3b, 0x02, 0x2c, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x00, - 0x04, 0x12, 0x03, 0x3b, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x00, 0x06, 0x12, - 0x03, 0x3b, 0x0b, 0x1d, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x00, 0x01, 0x12, 0x03, 0x3b, - 0x1e, 0x27, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x12, 0x03, 0x3b, 0x2a, 0x2b, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x42, 0xcf, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x74, 0x70, 0x2e, 0x6d, 0x6c, + 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, + 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x6d, 0x74, 0x70, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x33, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6c, 0x73, + 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0xa2, 0x02, + 0x03, 0x58, 0x4d, 0x58, 0xaa, 0x02, 0x15, 0x58, 0x6d, 0x74, 0x70, 0x2e, 0x4d, 0x6c, 0x73, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x15, 0x58, + 0x6d, 0x74, 0x70, 0x5c, 0x4d, 0x6c, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x21, 0x58, 0x6d, 0x74, 0x70, 0x5c, 0x4d, 0x6c, 0x73, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x17, 0x58, 0x6d, 0x74, 0x70, 0x3a, + 0x3a, 0x4d, 0x6c, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3a, + 0x56, 0x31, 0x4a, 0x96, 0x0e, 0x0a, 0x06, 0x12, 0x04, 0x01, 0x00, 0x3b, 0x01, 0x0a, 0x17, 0x0a, + 0x01, 0x0c, 0x12, 0x03, 0x01, 0x00, 0x12, 0x1a, 0x0d, 0x20, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x41, 0x50, 0x49, 0x0a, 0x0a, 0x08, 0x0a, 0x01, 0x02, 0x12, 0x03, 0x02, 0x00, 0x1f, + 0x0a, 0x08, 0x0a, 0x01, 0x08, 0x12, 0x03, 0x04, 0x00, 0x44, 0x0a, 0x09, 0x0a, 0x02, 0x08, 0x0b, + 0x12, 0x03, 0x04, 0x00, 0x44, 0x0a, 0x26, 0x0a, 0x02, 0x06, 0x00, 0x12, 0x04, 0x07, 0x00, 0x0d, + 0x01, 0x1a, 0x1a, 0x20, 0x52, 0x50, 0x43, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x4c, 0x53, 0x20, 0x41, 0x50, 0x49, 0x0a, 0x0a, 0x0a, 0x0a, + 0x03, 0x06, 0x00, 0x01, 0x12, 0x03, 0x07, 0x08, 0x15, 0x0a, 0x58, 0x0a, 0x04, 0x06, 0x00, 0x02, + 0x00, 0x12, 0x03, 0x09, 0x02, 0x5e, 0x1a, 0x4b, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, + 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x06, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x09, 0x06, + 0x19, 0x0a, 0x0c, 0x0a, 0x05, 0x06, 0x00, 0x02, 0x00, 0x02, 0x12, 0x03, 0x09, 0x1a, 0x34, 0x0a, + 0x0c, 0x0a, 0x05, 0x06, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x09, 0x3f, 0x5a, 0x0a, 0x50, 0x0a, + 0x04, 0x06, 0x00, 0x02, 0x01, 0x12, 0x03, 0x0c, 0x02, 0x64, 0x1a, 0x43, 0x20, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x72, 0x65, + 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x0a, 0x0a, + 0x0c, 0x0a, 0x05, 0x06, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x0c, 0x06, 0x1b, 0x0a, 0x0c, 0x0a, + 0x05, 0x06, 0x00, 0x02, 0x01, 0x02, 0x12, 0x03, 0x0c, 0x1c, 0x38, 0x0a, 0x0c, 0x0a, 0x05, 0x06, + 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x0c, 0x43, 0x60, 0x0a, 0x39, 0x0a, 0x02, 0x04, 0x00, 0x12, + 0x04, 0x10, 0x00, 0x17, 0x01, 0x1a, 0x2d, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, + 0x20, 0x61, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x73, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x00, 0x01, 0x12, 0x03, 0x10, 0x08, 0x22, + 0x0a, 0x2c, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x00, 0x12, 0x04, 0x12, 0x02, 0x14, 0x03, 0x1a, 0x1e, + 0x20, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, + 0x68, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x0a, 0x0a, 0x0c, + 0x0a, 0x05, 0x04, 0x00, 0x03, 0x00, 0x01, 0x12, 0x03, 0x12, 0x0a, 0x14, 0x0a, 0x0d, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x13, 0x04, 0x2f, 0x0a, 0x0e, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x13, 0x04, 0x09, 0x0a, 0x0e, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x13, 0x0a, 0x2a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x13, 0x2d, 0x2e, 0x0a, 0x0b, 0x0a, 0x04, 0x04, + 0x00, 0x02, 0x00, 0x12, 0x03, 0x16, 0x02, 0x27, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, + 0x04, 0x12, 0x03, 0x16, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x06, 0x12, + 0x03, 0x16, 0x0b, 0x15, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x16, + 0x16, 0x22, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x16, 0x25, 0x26, + 0x0a, 0x34, 0x0a, 0x02, 0x04, 0x01, 0x12, 0x04, 0x1a, 0x00, 0x25, 0x01, 0x1a, 0x28, 0x20, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x01, 0x01, 0x12, 0x03, 0x1a, + 0x08, 0x23, 0x0a, 0x39, 0x0a, 0x04, 0x04, 0x01, 0x03, 0x00, 0x12, 0x04, 0x1c, 0x02, 0x22, 0x03, + 0x1a, 0x2b, 0x20, 0x41, 0x6e, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x6b, 0x65, 0x79, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x0a, 0x0a, 0x0c, 0x0a, + 0x05, 0x04, 0x01, 0x03, 0x00, 0x01, 0x12, 0x03, 0x1c, 0x0a, 0x1c, 0x0a, 0x0d, 0x0a, 0x06, 0x04, + 0x01, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x1d, 0x04, 0x13, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, + 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x1d, 0x04, 0x08, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, + 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x1d, 0x09, 0x0e, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, + 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x1d, 0x11, 0x12, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, + 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x1e, 0x04, 0x1d, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, + 0x00, 0x02, 0x01, 0x05, 0x12, 0x03, 0x1e, 0x04, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, + 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x1e, 0x0b, 0x18, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, + 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x1e, 0x1b, 0x1c, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x03, + 0x00, 0x02, 0x02, 0x12, 0x03, 0x1f, 0x04, 0x1e, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, + 0x02, 0x02, 0x05, 0x12, 0x03, 0x1f, 0x04, 0x09, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, + 0x02, 0x02, 0x01, 0x12, 0x03, 0x1f, 0x0a, 0x19, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, + 0x02, 0x02, 0x03, 0x12, 0x03, 0x1f, 0x1c, 0x1d, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x03, 0x00, + 0x02, 0x03, 0x12, 0x03, 0x20, 0x04, 0x1e, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, + 0x03, 0x05, 0x12, 0x03, 0x20, 0x04, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, + 0x03, 0x01, 0x12, 0x03, 0x20, 0x0b, 0x19, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, + 0x03, 0x03, 0x12, 0x03, 0x20, 0x1c, 0x1d, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x03, 0x00, 0x02, + 0x04, 0x12, 0x03, 0x21, 0x04, 0x28, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x04, + 0x05, 0x12, 0x03, 0x21, 0x04, 0x09, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x04, + 0x01, 0x12, 0x03, 0x21, 0x0a, 0x23, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x03, 0x00, 0x02, 0x04, + 0x03, 0x12, 0x03, 0x21, 0x26, 0x27, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x00, 0x12, 0x03, + 0x24, 0x02, 0x2c, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x04, 0x12, 0x03, 0x24, 0x02, + 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x06, 0x12, 0x03, 0x24, 0x0b, 0x1d, 0x0a, + 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x01, 0x12, 0x03, 0x24, 0x1e, 0x27, 0x0a, 0x0c, 0x0a, + 0x05, 0x04, 0x01, 0x02, 0x00, 0x03, 0x12, 0x03, 0x24, 0x2a, 0x2b, 0x0a, 0x3b, 0x0a, 0x02, 0x04, + 0x02, 0x12, 0x04, 0x28, 0x00, 0x2f, 0x01, 0x1a, 0x2f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x73, 0x20, 0x61, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x02, 0x01, 0x12, + 0x03, 0x28, 0x08, 0x24, 0x0a, 0x28, 0x0a, 0x04, 0x04, 0x02, 0x03, 0x00, 0x12, 0x04, 0x2a, 0x02, + 0x2c, 0x03, 0x1a, 0x1a, 0x20, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x0a, 0x0a, 0x0c, + 0x0a, 0x05, 0x04, 0x02, 0x03, 0x00, 0x01, 0x12, 0x03, 0x2a, 0x0a, 0x16, 0x0a, 0x0d, 0x0a, 0x06, + 0x04, 0x02, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x2b, 0x04, 0x31, 0x0a, 0x0e, 0x0a, 0x07, 0x04, + 0x02, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x2b, 0x04, 0x09, 0x0a, 0x0e, 0x0a, 0x07, 0x04, + 0x02, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x2b, 0x0a, 0x2c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, + 0x02, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x2b, 0x2f, 0x30, 0x0a, 0x0b, 0x0a, 0x04, 0x04, + 0x02, 0x02, 0x00, 0x12, 0x03, 0x2e, 0x02, 0x2b, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x00, + 0x04, 0x12, 0x03, 0x2e, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x00, 0x06, 0x12, + 0x03, 0x2e, 0x0b, 0x17, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x00, 0x01, 0x12, 0x03, 0x2e, + 0x18, 0x26, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x00, 0x03, 0x12, 0x03, 0x2e, 0x29, 0x2a, + 0x0a, 0x36, 0x0a, 0x02, 0x04, 0x03, 0x12, 0x04, 0x32, 0x00, 0x3b, 0x01, 0x1a, 0x2a, 0x20, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x03, 0x01, 0x12, + 0x03, 0x32, 0x08, 0x25, 0x0a, 0x35, 0x0a, 0x04, 0x04, 0x03, 0x03, 0x00, 0x12, 0x04, 0x34, 0x02, + 0x38, 0x03, 0x1a, 0x27, 0x20, 0x41, 0x6e, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, + 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, + 0x03, 0x03, 0x00, 0x01, 0x12, 0x03, 0x34, 0x0a, 0x1c, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x03, 0x03, + 0x00, 0x02, 0x00, 0x12, 0x03, 0x35, 0x04, 0x13, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, + 0x02, 0x00, 0x05, 0x12, 0x03, 0x35, 0x04, 0x08, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, + 0x02, 0x00, 0x01, 0x12, 0x03, 0x35, 0x09, 0x0e, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, + 0x02, 0x00, 0x03, 0x12, 0x03, 0x35, 0x11, 0x12, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x03, 0x03, 0x00, + 0x02, 0x01, 0x12, 0x03, 0x36, 0x04, 0x1d, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, + 0x01, 0x05, 0x12, 0x03, 0x36, 0x04, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, + 0x01, 0x01, 0x12, 0x03, 0x36, 0x0b, 0x18, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, + 0x01, 0x03, 0x12, 0x03, 0x36, 0x1b, 0x1c, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x03, 0x03, 0x00, 0x02, + 0x02, 0x12, 0x03, 0x37, 0x04, 0x18, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x02, + 0x05, 0x12, 0x03, 0x37, 0x04, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x02, + 0x01, 0x12, 0x03, 0x37, 0x0b, 0x13, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x03, 0x03, 0x00, 0x02, 0x02, + 0x03, 0x12, 0x03, 0x37, 0x16, 0x17, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x03, 0x02, 0x00, 0x12, 0x03, + 0x3a, 0x02, 0x2c, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x00, 0x04, 0x12, 0x03, 0x3a, 0x02, + 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x00, 0x06, 0x12, 0x03, 0x3a, 0x0b, 0x1d, 0x0a, + 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x00, 0x01, 0x12, 0x03, 0x3a, 0x1e, 0x27, 0x0a, 0x0c, 0x0a, + 0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x12, 0x03, 0x3a, 0x2a, 0x2b, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, ]; include!("xmtp.mls_validation.v1.serde.rs"); include!("xmtp.mls_validation.v1.tonic.rs"); diff --git a/xmtp_proto/src/gen/xmtp.mls_validation.v1.serde.rs b/xmtp_proto/src/gen/xmtp.mls_validation.v1.serde.rs index a0a0c847a..870addb42 100644 --- a/xmtp_proto/src/gen/xmtp.mls_validation.v1.serde.rs +++ b/xmtp_proto/src/gen/xmtp.mls_validation.v1.serde.rs @@ -293,9 +293,6 @@ impl serde::Serialize for validate_group_messages_response::ValidationResponse { if !self.group_id.is_empty() { len += 1; } - if self.epoch != 0 { - len += 1; - } let mut struct_ser = serializer.serialize_struct("xmtp.mls_validation.v1.ValidateGroupMessagesResponse.ValidationResponse", len)?; if self.is_ok { struct_ser.serialize_field("isOk", &self.is_ok)?; @@ -306,9 +303,6 @@ impl serde::Serialize for validate_group_messages_response::ValidationResponse { if !self.group_id.is_empty() { struct_ser.serialize_field("groupId", &self.group_id)?; } - if self.epoch != 0 { - struct_ser.serialize_field("epoch", ToString::to_string(&self.epoch).as_str())?; - } struct_ser.end() } } @@ -325,7 +319,6 @@ impl<'de> serde::Deserialize<'de> for validate_group_messages_response::Validati "errorMessage", "group_id", "groupId", - "epoch", ]; #[allow(clippy::enum_variant_names)] @@ -333,7 +326,6 @@ impl<'de> serde::Deserialize<'de> for validate_group_messages_response::Validati IsOk, ErrorMessage, GroupId, - Epoch, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -358,7 +350,6 @@ impl<'de> serde::Deserialize<'de> for validate_group_messages_response::Validati "isOk" | "is_ok" => Ok(GeneratedField::IsOk), "errorMessage" | "error_message" => Ok(GeneratedField::ErrorMessage), "groupId" | "group_id" => Ok(GeneratedField::GroupId), - "epoch" => Ok(GeneratedField::Epoch), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -381,7 +372,6 @@ impl<'de> serde::Deserialize<'de> for validate_group_messages_response::Validati let mut is_ok__ = None; let mut error_message__ = None; let mut group_id__ = None; - let mut epoch__ = None; while let Some(k) = map.next_key()? { match k { GeneratedField::IsOk => { @@ -402,21 +392,12 @@ impl<'de> serde::Deserialize<'de> for validate_group_messages_response::Validati } group_id__ = Some(map.next_value()?); } - GeneratedField::Epoch => { - if epoch__.is_some() { - return Err(serde::de::Error::duplicate_field("epoch")); - } - epoch__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) - ; - } } } Ok(validate_group_messages_response::ValidationResponse { is_ok: is_ok__.unwrap_or_default(), error_message: error_message__.unwrap_or_default(), group_id: group_id__.unwrap_or_default(), - epoch: epoch__.unwrap_or_default(), }) } }