// This file is @generated by prost-build.
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct SchedulingState {
    /// The backend does not populate this field in GetQueuedCards; the front-end
    /// is expected to populate it based on the provided Card. If it's not set when
    /// answering a card, the existing custom data will not be updated.
    #[prost(string, optional, tag = "3")]
    pub custom_data: ::core::option::Option<::prost::alloc::string::String>,
    #[prost(oneof = "scheduling_state::Kind", tags = "1, 2")]
    pub kind: ::core::option::Option<scheduling_state::Kind>,
}
/// Nested message and enum types in `SchedulingState`.
pub mod scheduling_state {
    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
    #[must_use]
pub struct New {
        #[prost(uint32, tag = "1")]
        pub position: u32,
    }
    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
    #[must_use]
pub struct Learning {
        #[prost(uint32, tag = "1")]
        pub remaining_steps: u32,
        #[prost(uint32, tag = "2")]
        pub scheduled_secs: u32,
        #[prost(uint32, tag = "3")]
        pub elapsed_secs: u32,
        #[prost(message, optional, tag = "6")]
        pub memory_state: ::core::option::Option<super::super::cards::FsrsMemoryState>,
    }
    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
    #[must_use]
pub struct Review {
        #[prost(uint32, tag = "1")]
        pub scheduled_days: u32,
        #[prost(uint32, tag = "2")]
        pub elapsed_days: u32,
        #[prost(float, tag = "3")]
        pub ease_factor: f32,
        #[prost(uint32, tag = "4")]
        pub lapses: u32,
        #[prost(bool, tag = "5")]
        pub leeched: bool,
        #[prost(message, optional, tag = "6")]
        pub memory_state: ::core::option::Option<super::super::cards::FsrsMemoryState>,
    }
    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
    #[must_use]
pub struct Relearning {
        #[prost(message, optional, tag = "1")]
        pub review: ::core::option::Option<Review>,
        #[prost(message, optional, tag = "2")]
        pub learning: ::core::option::Option<Learning>,
    }
    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
    #[must_use]
pub struct Normal {
        #[prost(oneof = "normal::Kind", tags = "1, 2, 3, 4")]
        pub kind: ::core::option::Option<normal::Kind>,
    }
    /// Nested message and enum types in `Normal`.
    pub mod normal {
        #[derive(Clone, Copy, PartialEq, ::prost::Oneof)]
        #[must_use]
pub enum Kind {
            #[prost(message, tag = "1")]
            New(super::New),
            #[prost(message, tag = "2")]
            Learning(super::Learning),
            #[prost(message, tag = "3")]
            Review(super::Review),
            #[prost(message, tag = "4")]
            Relearning(super::Relearning),
        }
    }
    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
    #[must_use]
pub struct Preview {
        #[prost(uint32, tag = "1")]
        pub scheduled_secs: u32,
        #[prost(bool, tag = "2")]
        pub finished: bool,
    }
    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
    #[must_use]
pub struct ReschedulingFilter {
        #[prost(message, optional, tag = "1")]
        pub original_state: ::core::option::Option<Normal>,
    }
    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
    #[must_use]
pub struct Filtered {
        #[prost(oneof = "filtered::Kind", tags = "1, 2")]
        pub kind: ::core::option::Option<filtered::Kind>,
    }
    /// Nested message and enum types in `Filtered`.
    pub mod filtered {
        #[derive(Clone, Copy, PartialEq, ::prost::Oneof)]
        #[must_use]
pub enum Kind {
            #[prost(message, tag = "1")]
            Preview(super::Preview),
            #[prost(message, tag = "2")]
            Rescheduling(super::ReschedulingFilter),
        }
    }
    #[derive(Clone, Copy, PartialEq, ::prost::Oneof)]
    #[must_use]
pub enum Kind {
        #[prost(message, tag = "1")]
        Normal(Normal),
        #[prost(message, tag = "2")]
        Filtered(Filtered),
    }
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct QueuedCards {
    #[prost(message, repeated, tag = "1")]
    pub cards: ::prost::alloc::vec::Vec<queued_cards::QueuedCard>,
    #[prost(uint32, tag = "2")]
    pub new_count: u32,
    #[prost(uint32, tag = "3")]
    pub learning_count: u32,
    #[prost(uint32, tag = "4")]
    pub review_count: u32,
}
/// Nested message and enum types in `QueuedCards`.
pub mod queued_cards {
    #[derive(Clone, PartialEq, ::prost::Message)]
    #[must_use]
pub struct QueuedCard {
        #[prost(message, optional, tag = "1")]
        pub card: ::core::option::Option<super::super::cards::Card>,
        #[prost(enumeration = "Queue", tag = "2")]
        pub queue: i32,
        #[prost(message, optional, tag = "3")]
        pub states: ::core::option::Option<super::SchedulingStates>,
        #[prost(message, optional, tag = "4")]
        pub context: ::core::option::Option<super::SchedulingContext>,
    }
    #[derive(
        Clone,
        Copy,
        Debug,
        PartialEq,
        Eq,
        Hash,
        PartialOrd,
        Ord,
        ::prost::Enumeration
    )]
    #[repr(i32)]
    #[must_use]
pub enum Queue {
        New = 0,
        Learning = 1,
        Review = 2,
    }
    impl Queue {
        /// String value of the enum field names used in the ProtoBuf definition.
        ///
        /// The values are not transformed in any way and thus are considered stable
        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
        pub fn as_str_name(&self) -> &'static str {
            match self {
                Self::New => "NEW",
                Self::Learning => "LEARNING",
                Self::Review => "REVIEW",
            }
        }
        /// Creates an enum from field names used in the ProtoBuf definition.
        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
            match value {
                "NEW" => Some(Self::New),
                "LEARNING" => Some(Self::Learning),
                "REVIEW" => Some(Self::Review),
                _ => None,
            }
        }
    }
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct GetQueuedCardsRequest {
    #[prost(uint32, tag = "1")]
    pub fetch_limit: u32,
    #[prost(bool, tag = "2")]
    pub intraday_learning_only: bool,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct SchedTimingTodayResponse {
    #[prost(uint32, tag = "1")]
    pub days_elapsed: u32,
    #[prost(int64, tag = "2")]
    pub next_day_at: i64,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct StudiedTodayMessageRequest {
    #[prost(uint32, tag = "1")]
    pub cards: u32,
    #[prost(double, tag = "2")]
    pub seconds: f64,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct UpdateStatsRequest {
    #[prost(int64, tag = "1")]
    pub deck_id: i64,
    #[prost(int32, tag = "2")]
    pub new_delta: i32,
    #[prost(int32, tag = "4")]
    pub review_delta: i32,
    #[prost(int32, tag = "5")]
    pub millisecond_delta: i32,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct ExtendLimitsRequest {
    #[prost(int64, tag = "1")]
    pub deck_id: i64,
    #[prost(int32, tag = "2")]
    pub new_delta: i32,
    #[prost(int32, tag = "3")]
    pub review_delta: i32,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct CountsForDeckTodayResponse {
    #[prost(int32, tag = "1")]
    pub new: i32,
    #[prost(int32, tag = "2")]
    pub review: i32,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct CongratsInfoResponse {
    #[prost(uint32, tag = "1")]
    pub learn_remaining: u32,
    #[prost(uint32, tag = "2")]
    pub secs_until_next_learn: u32,
    #[prost(bool, tag = "3")]
    pub review_remaining: bool,
    #[prost(bool, tag = "4")]
    pub new_remaining: bool,
    #[prost(bool, tag = "5")]
    pub have_sched_buried: bool,
    #[prost(bool, tag = "6")]
    pub have_user_buried: bool,
    #[prost(bool, tag = "7")]
    pub is_filtered_deck: bool,
    #[prost(bool, tag = "8")]
    pub bridge_commands_supported: bool,
    #[prost(string, tag = "9")]
    pub deck_description: ::prost::alloc::string::String,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct UnburyDeckRequest {
    #[prost(int64, tag = "1")]
    pub deck_id: i64,
    #[prost(enumeration = "unbury_deck_request::Mode", tag = "2")]
    pub mode: i32,
}
/// Nested message and enum types in `UnburyDeckRequest`.
pub mod unbury_deck_request {
    #[derive(
        Clone,
        Copy,
        Debug,
        PartialEq,
        Eq,
        Hash,
        PartialOrd,
        Ord,
        ::prost::Enumeration
    )]
    #[repr(i32)]
    #[must_use]
pub enum Mode {
        All = 0,
        SchedOnly = 1,
        UserOnly = 2,
    }
    impl Mode {
        /// String value of the enum field names used in the ProtoBuf definition.
        ///
        /// The values are not transformed in any way and thus are considered stable
        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
        pub fn as_str_name(&self) -> &'static str {
            match self {
                Self::All => "ALL",
                Self::SchedOnly => "SCHED_ONLY",
                Self::UserOnly => "USER_ONLY",
            }
        }
        /// Creates an enum from field names used in the ProtoBuf definition.
        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
            match value {
                "ALL" => Some(Self::All),
                "SCHED_ONLY" => Some(Self::SchedOnly),
                "USER_ONLY" => Some(Self::UserOnly),
                _ => None,
            }
        }
    }
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct BuryOrSuspendCardsRequest {
    #[prost(int64, repeated, tag = "1")]
    pub card_ids: ::prost::alloc::vec::Vec<i64>,
    #[prost(int64, repeated, tag = "2")]
    pub note_ids: ::prost::alloc::vec::Vec<i64>,
    #[prost(enumeration = "bury_or_suspend_cards_request::Mode", tag = "3")]
    pub mode: i32,
}
/// Nested message and enum types in `BuryOrSuspendCardsRequest`.
pub mod bury_or_suspend_cards_request {
    #[derive(
        Clone,
        Copy,
        Debug,
        PartialEq,
        Eq,
        Hash,
        PartialOrd,
        Ord,
        ::prost::Enumeration
    )]
    #[repr(i32)]
    #[must_use]
pub enum Mode {
        Suspend = 0,
        BurySched = 1,
        BuryUser = 2,
    }
    impl Mode {
        /// String value of the enum field names used in the ProtoBuf definition.
        ///
        /// The values are not transformed in any way and thus are considered stable
        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
        pub fn as_str_name(&self) -> &'static str {
            match self {
                Self::Suspend => "SUSPEND",
                Self::BurySched => "BURY_SCHED",
                Self::BuryUser => "BURY_USER",
            }
        }
        /// Creates an enum from field names used in the ProtoBuf definition.
        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
            match value {
                "SUSPEND" => Some(Self::Suspend),
                "BURY_SCHED" => Some(Self::BurySched),
                "BURY_USER" => Some(Self::BuryUser),
                _ => None,
            }
        }
    }
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct ScheduleCardsAsNewRequest {
    #[prost(int64, repeated, tag = "1")]
    pub card_ids: ::prost::alloc::vec::Vec<i64>,
    #[prost(bool, tag = "2")]
    pub log: bool,
    #[prost(bool, tag = "3")]
    pub restore_position: bool,
    #[prost(bool, tag = "4")]
    pub reset_counts: bool,
    #[prost(enumeration = "schedule_cards_as_new_request::Context", optional, tag = "5")]
    pub context: ::core::option::Option<i32>,
}
/// Nested message and enum types in `ScheduleCardsAsNewRequest`.
pub mod schedule_cards_as_new_request {
    #[derive(
        Clone,
        Copy,
        Debug,
        PartialEq,
        Eq,
        Hash,
        PartialOrd,
        Ord,
        ::prost::Enumeration
    )]
    #[repr(i32)]
    #[must_use]
pub enum Context {
        Browser = 0,
        Reviewer = 1,
    }
    impl Context {
        /// String value of the enum field names used in the ProtoBuf definition.
        ///
        /// The values are not transformed in any way and thus are considered stable
        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
        pub fn as_str_name(&self) -> &'static str {
            match self {
                Self::Browser => "BROWSER",
                Self::Reviewer => "REVIEWER",
            }
        }
        /// Creates an enum from field names used in the ProtoBuf definition.
        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
            match value {
                "BROWSER" => Some(Self::Browser),
                "REVIEWER" => Some(Self::Reviewer),
                _ => None,
            }
        }
    }
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct ScheduleCardsAsNewDefaultsRequest {
    #[prost(enumeration = "schedule_cards_as_new_request::Context", tag = "1")]
    pub context: i32,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct ScheduleCardsAsNewDefaultsResponse {
    #[prost(bool, tag = "1")]
    pub restore_position: bool,
    #[prost(bool, tag = "2")]
    pub reset_counts: bool,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct SetDueDateRequest {
    #[prost(int64, repeated, tag = "1")]
    pub card_ids: ::prost::alloc::vec::Vec<i64>,
    #[prost(string, tag = "2")]
    pub days: ::prost::alloc::string::String,
    #[prost(message, optional, tag = "3")]
    pub config_key: ::core::option::Option<super::config::OptionalStringConfigKey>,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct GradeNowRequest {
    #[prost(int64, repeated, tag = "1")]
    pub card_ids: ::prost::alloc::vec::Vec<i64>,
    #[prost(enumeration = "card_answer::Rating", tag = "2")]
    pub rating: i32,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct SortCardsRequest {
    #[prost(int64, repeated, tag = "1")]
    pub card_ids: ::prost::alloc::vec::Vec<i64>,
    #[prost(uint32, tag = "2")]
    pub starting_from: u32,
    #[prost(uint32, tag = "3")]
    pub step_size: u32,
    #[prost(bool, tag = "4")]
    pub randomize: bool,
    #[prost(bool, tag = "5")]
    pub shift_existing: bool,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct SortDeckRequest {
    #[prost(int64, tag = "1")]
    pub deck_id: i64,
    #[prost(bool, tag = "2")]
    pub randomize: bool,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct SchedulingStates {
    #[prost(message, optional, tag = "1")]
    pub current: ::core::option::Option<SchedulingState>,
    #[prost(message, optional, tag = "2")]
    pub again: ::core::option::Option<SchedulingState>,
    #[prost(message, optional, tag = "3")]
    pub hard: ::core::option::Option<SchedulingState>,
    #[prost(message, optional, tag = "4")]
    pub good: ::core::option::Option<SchedulingState>,
    #[prost(message, optional, tag = "5")]
    pub easy: ::core::option::Option<SchedulingState>,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct CardAnswer {
    #[prost(int64, tag = "1")]
    pub card_id: i64,
    #[prost(message, optional, tag = "2")]
    pub current_state: ::core::option::Option<SchedulingState>,
    #[prost(message, optional, tag = "3")]
    pub new_state: ::core::option::Option<SchedulingState>,
    #[prost(enumeration = "card_answer::Rating", tag = "4")]
    pub rating: i32,
    #[prost(int64, tag = "5")]
    pub answered_at_millis: i64,
    #[prost(uint32, tag = "6")]
    pub milliseconds_taken: u32,
}
/// Nested message and enum types in `CardAnswer`.
pub mod card_answer {
    #[derive(
        Clone,
        Copy,
        Debug,
        PartialEq,
        Eq,
        Hash,
        PartialOrd,
        Ord,
        ::prost::Enumeration
    )]
    #[repr(i32)]
    #[must_use]
pub enum Rating {
        Again = 0,
        Hard = 1,
        Good = 2,
        Easy = 3,
    }
    impl Rating {
        /// String value of the enum field names used in the ProtoBuf definition.
        ///
        /// The values are not transformed in any way and thus are considered stable
        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
        pub fn as_str_name(&self) -> &'static str {
            match self {
                Self::Again => "AGAIN",
                Self::Hard => "HARD",
                Self::Good => "GOOD",
                Self::Easy => "EASY",
            }
        }
        /// Creates an enum from field names used in the ProtoBuf definition.
        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
            match value {
                "AGAIN" => Some(Self::Again),
                "HARD" => Some(Self::Hard),
                "GOOD" => Some(Self::Good),
                "EASY" => Some(Self::Easy),
                _ => None,
            }
        }
    }
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct CustomStudyRequest {
    #[prost(int64, tag = "1")]
    pub deck_id: i64,
    #[prost(oneof = "custom_study_request::Value", tags = "2, 3, 4, 5, 6, 7")]
    pub value: ::core::option::Option<custom_study_request::Value>,
}
/// Nested message and enum types in `CustomStudyRequest`.
pub mod custom_study_request {
    #[derive(Clone, PartialEq, ::prost::Message)]
    #[must_use]
pub struct Cram {
        #[prost(enumeration = "cram::CramKind", tag = "1")]
        pub kind: i32,
        /// the maximum number of cards
        #[prost(uint32, tag = "2")]
        pub card_limit: u32,
        /// cards must match one of these, if unempty
        #[prost(string, repeated, tag = "3")]
        pub tags_to_include: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
        /// cards must not match any of these
        #[prost(string, repeated, tag = "4")]
        pub tags_to_exclude: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    }
    /// Nested message and enum types in `Cram`.
    pub mod cram {
        #[derive(
            Clone,
            Copy,
            Debug,
            PartialEq,
            Eq,
            Hash,
            PartialOrd,
            Ord,
            ::prost::Enumeration
        )]
        #[repr(i32)]
        #[must_use]
pub enum CramKind {
            /// due cards in due order
            Due = 0,
            /// new cards in added order
            New = 1,
            /// review cards in random order
            Review = 2,
            /// all cards in random order; no rescheduling
            All = 3,
        }
        impl CramKind {
            /// String value of the enum field names used in the ProtoBuf definition.
            ///
            /// The values are not transformed in any way and thus are considered stable
            /// (if the ProtoBuf definition does not change) and safe for programmatic use.
            pub fn as_str_name(&self) -> &'static str {
                match self {
                    Self::Due => "CRAM_KIND_DUE",
                    Self::New => "CRAM_KIND_NEW",
                    Self::Review => "CRAM_KIND_REVIEW",
                    Self::All => "CRAM_KIND_ALL",
                }
            }
            /// Creates an enum from field names used in the ProtoBuf definition.
            pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
                match value {
                    "CRAM_KIND_DUE" => Some(Self::Due),
                    "CRAM_KIND_NEW" => Some(Self::New),
                    "CRAM_KIND_REVIEW" => Some(Self::Review),
                    "CRAM_KIND_ALL" => Some(Self::All),
                    _ => None,
                }
            }
        }
    }
    #[derive(Clone, PartialEq, ::prost::Oneof)]
    #[must_use]
pub enum Value {
        /// increase new limit by x
        #[prost(int32, tag = "2")]
        NewLimitDelta(i32),
        /// increase review limit by x
        #[prost(int32, tag = "3")]
        ReviewLimitDelta(i32),
        /// repeat cards forgotten in the last x days
        #[prost(uint32, tag = "4")]
        ForgotDays(u32),
        /// review cards due in the next x days
        #[prost(uint32, tag = "5")]
        ReviewAheadDays(u32),
        /// preview new cards added in the last x days
        #[prost(uint32, tag = "6")]
        PreviewDays(u32),
        #[prost(message, tag = "7")]
        Cram(Cram),
    }
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct SchedulingContext {
    #[prost(string, tag = "1")]
    pub deck_name: ::prost::alloc::string::String,
    #[prost(uint64, tag = "2")]
    pub seed: u64,
    #[prost(float, optional, tag = "3")]
    pub decay: ::core::option::Option<f32>,
    #[prost(float, optional, tag = "4")]
    pub desired_retention: ::core::option::Option<f32>,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct CustomStudyDefaultsRequest {
    #[prost(int64, tag = "1")]
    pub deck_id: i64,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct CustomStudyDefaultsResponse {
    #[prost(message, repeated, tag = "1")]
    pub tags: ::prost::alloc::vec::Vec<custom_study_defaults_response::Tag>,
    #[prost(uint32, tag = "2")]
    pub extend_new: u32,
    #[prost(uint32, tag = "3")]
    pub extend_review: u32,
    #[prost(uint32, tag = "4")]
    pub available_new: u32,
    #[prost(uint32, tag = "5")]
    pub available_review: u32,
    /// in v3, counts for children are provided separately
    #[prost(uint32, tag = "6")]
    pub available_new_in_children: u32,
    #[prost(uint32, tag = "7")]
    pub available_review_in_children: u32,
}
/// Nested message and enum types in `CustomStudyDefaultsResponse`.
pub mod custom_study_defaults_response {
    #[derive(Clone, PartialEq, ::prost::Message)]
    #[must_use]
pub struct Tag {
        #[prost(string, tag = "1")]
        pub name: ::prost::alloc::string::String,
        #[prost(bool, tag = "2")]
        pub include: bool,
        #[prost(bool, tag = "3")]
        pub exclude: bool,
    }
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct RepositionDefaultsResponse {
    #[prost(bool, tag = "1")]
    pub random: bool,
    #[prost(bool, tag = "2")]
    pub shift: bool,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct ComputeFsrsParamsRequest {
    /// / The search used to gather cards for training
    #[prost(string, tag = "1")]
    pub search: ::prost::alloc::string::String,
    #[prost(float, repeated, tag = "2")]
    pub current_params: ::prost::alloc::vec::Vec<f32>,
    #[prost(int64, tag = "3")]
    pub ignore_revlogs_before_ms: i64,
    #[prost(uint32, tag = "4")]
    pub num_of_relearning_steps: u32,
    #[prost(bool, tag = "5")]
    pub health_check: bool,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct ComputeFsrsParamsResponse {
    #[prost(float, repeated, tag = "1")]
    pub params: ::prost::alloc::vec::Vec<f32>,
    #[prost(uint32, tag = "2")]
    pub fsrs_items: u32,
    #[prost(bool, optional, tag = "3")]
    pub health_check_passed: ::core::option::Option<bool>,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct ComputeFsrsParamsFromItemsRequest {
    #[prost(message, repeated, tag = "1")]
    pub items: ::prost::alloc::vec::Vec<FsrsItem>,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct FsrsBenchmarkRequest {
    #[prost(message, repeated, tag = "1")]
    pub train_set: ::prost::alloc::vec::Vec<FsrsItem>,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct FsrsBenchmarkResponse {
    #[prost(float, repeated, tag = "1")]
    pub params: ::prost::alloc::vec::Vec<f32>,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct ExportDatasetRequest {
    #[prost(uint32, tag = "1")]
    pub min_entries: u32,
    #[prost(string, tag = "2")]
    pub target_path: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct FsrsItem {
    #[prost(message, repeated, tag = "1")]
    pub reviews: ::prost::alloc::vec::Vec<FsrsReview>,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct FsrsReview {
    #[prost(uint32, tag = "1")]
    pub rating: u32,
    #[prost(uint32, tag = "2")]
    pub delta_t: u32,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct SimulateFsrsReviewRequest {
    #[prost(float, repeated, tag = "1")]
    pub params: ::prost::alloc::vec::Vec<f32>,
    #[prost(float, tag = "2")]
    pub desired_retention: f32,
    #[prost(uint32, tag = "3")]
    pub deck_size: u32,
    #[prost(uint32, tag = "4")]
    pub days_to_simulate: u32,
    #[prost(uint32, tag = "5")]
    pub new_limit: u32,
    #[prost(uint32, tag = "6")]
    pub review_limit: u32,
    #[prost(uint32, tag = "7")]
    pub max_interval: u32,
    #[prost(string, tag = "8")]
    pub search: ::prost::alloc::string::String,
    #[prost(bool, tag = "9")]
    pub new_cards_ignore_review_limit: bool,
    #[prost(float, repeated, tag = "10")]
    pub easy_days_percentages: ::prost::alloc::vec::Vec<f32>,
    #[prost(
        enumeration = "super::deck_config::deck_config::config::ReviewCardOrder",
        tag = "11"
    )]
    pub review_order: i32,
    #[prost(uint32, optional, tag = "12")]
    pub suspend_after_lapse_count: ::core::option::Option<u32>,
    #[prost(float, tag = "13")]
    pub historical_retention: f32,
    #[prost(uint32, tag = "14")]
    pub learning_step_count: u32,
    #[prost(uint32, tag = "15")]
    pub relearning_step_count: u32,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct SimulateFsrsReviewResponse {
    #[prost(float, repeated, tag = "1")]
    pub accumulated_knowledge_acquisition: ::prost::alloc::vec::Vec<f32>,
    #[prost(uint32, repeated, tag = "2")]
    pub daily_review_count: ::prost::alloc::vec::Vec<u32>,
    #[prost(uint32, repeated, tag = "3")]
    pub daily_new_count: ::prost::alloc::vec::Vec<u32>,
    #[prost(float, repeated, tag = "4")]
    pub daily_time_cost: ::prost::alloc::vec::Vec<f32>,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct SimulateFsrsWorkloadResponse {
    #[prost(map = "uint32, float", tag = "1")]
    pub cost: ::std::collections::HashMap<u32, f32>,
    #[prost(float, tag = "2")]
    pub reviewless_end_memorized: f32,
    #[prost(map = "uint32, float", tag = "3")]
    pub memorized: ::std::collections::HashMap<u32, f32>,
    #[prost(map = "uint32, uint32", tag = "4")]
    pub review_count: ::std::collections::HashMap<u32, u32>,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct ComputeOptimalRetentionResponse {
    #[prost(float, tag = "1")]
    pub optimal_retention: f32,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct GetOptimalRetentionParametersRequest {
    #[prost(string, tag = "1")]
    pub search: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct GetOptimalRetentionParametersResponse {
    #[prost(uint32, tag = "1")]
    pub deck_size: u32,
    #[prost(uint32, tag = "2")]
    pub learn_span: u32,
    #[prost(float, tag = "3")]
    pub max_cost_perday: f32,
    #[prost(float, tag = "4")]
    pub max_ivl: f32,
    #[prost(float, repeated, tag = "5")]
    pub first_rating_prob: ::prost::alloc::vec::Vec<f32>,
    #[prost(float, repeated, tag = "6")]
    pub review_rating_prob: ::prost::alloc::vec::Vec<f32>,
    #[prost(float, tag = "7")]
    pub loss_aversion: f32,
    #[prost(uint32, tag = "8")]
    pub learn_limit: u32,
    #[prost(uint32, tag = "9")]
    pub review_limit: u32,
    #[prost(float, repeated, tag = "10")]
    pub learning_step_transitions: ::prost::alloc::vec::Vec<f32>,
    #[prost(float, repeated, tag = "11")]
    pub relearning_step_transitions: ::prost::alloc::vec::Vec<f32>,
    #[prost(float, repeated, tag = "12")]
    pub state_rating_costs: ::prost::alloc::vec::Vec<f32>,
    #[prost(uint32, tag = "13")]
    pub learning_step_count: u32,
    #[prost(uint32, tag = "14")]
    pub relearning_step_count: u32,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct EvaluateParamsRequest {
    #[prost(string, tag = "1")]
    pub search: ::prost::alloc::string::String,
    #[prost(int64, tag = "2")]
    pub ignore_revlogs_before_ms: i64,
    #[prost(uint32, tag = "3")]
    pub num_of_relearning_steps: u32,
}
#[derive(Clone, PartialEq, ::prost::Message)]
#[must_use]
pub struct EvaluateParamsLegacyRequest {
    #[prost(float, repeated, tag = "1")]
    pub params: ::prost::alloc::vec::Vec<f32>,
    #[prost(string, tag = "2")]
    pub search: ::prost::alloc::string::String,
    #[prost(int64, tag = "3")]
    pub ignore_revlogs_before_ms: i64,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct EvaluateParamsResponse {
    #[prost(float, tag = "1")]
    pub log_loss: f32,
    #[prost(float, tag = "2")]
    pub rmse_bins: f32,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct ComputeMemoryStateResponse {
    #[prost(message, optional, tag = "1")]
    pub state: ::core::option::Option<super::cards::FsrsMemoryState>,
    #[prost(float, tag = "2")]
    pub desired_retention: f32,
    #[prost(float, tag = "3")]
    pub decay: f32,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct FuzzDeltaRequest {
    #[prost(int64, tag = "1")]
    pub card_id: i64,
    #[prost(uint32, tag = "2")]
    pub interval: u32,
}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
#[must_use]
pub struct FuzzDeltaResponse {
    #[prost(sint32, tag = "1")]
    pub delta_days: i32,
}
