From a515275013a759295a19dca5d0420a9394868d70 Mon Sep 17 00:00:00 2001 From: Spencer Judge Date: Tue, 5 Dec 2023 10:45:18 -0800 Subject: [PATCH] More Fuzzy Features (#41) * Add child wfs to generator * Add set patch * Set / await workflow state * Add memo/SA upserts * Adjustable ratios for action choices * Implement awaitable choice --- README.md | 9 +- cmd/cmdoptions/client.go | 50 + loadgen/kitchen-sink-gen/Cargo.lock | 45 + loadgen/kitchen-sink-gen/Cargo.toml | 2 + loadgen/kitchen-sink-gen/build.rs | 4 +- loadgen/kitchen-sink-gen/src/main.rs | 422 +++++-- loadgen/kitchen-sink-gen/src/protos.rs | 2 + loadgen/kitchensink/helpers.go | 10 +- loadgen/kitchensink/kitchen_sink.pb.go | 1086 ++++++++++------- loadgen/scenario.go | 14 + scenarios/workflow_with_many_actions.go | 2 +- workers/go/kitchensink/kitchen_sink.go | 161 ++- workers/go/worker/worker.go | 1 + workers/proto/kitchen_sink/kitchen_sink.proto | 21 +- workers/python/activities.py | 8 + workers/python/kitchen_sink.py | 126 +- workers/python/main.py | 11 +- workers/python/protos/kitchen_sink_pb2.py | 102 +- workers/python/protos/kitchen_sink_pb2.pyi | 27 +- 19 files changed, 1448 insertions(+), 655 deletions(-) diff --git a/README.md b/README.md index 0dbd4ae..4fe15d0 100644 --- a/README.md +++ b/README.md @@ -116,8 +116,9 @@ for more. ### Kitchen Sink Workflow -The idea here was to strike a balance between a generic workflow implementation that would work for 99% of scenarios -while maintaining code simplicity and debuggability. +The Kitchen Sink workflows accepts a DSL generated by the `kitchen-sink-gen` Rust tool, allowing us +to test a wide variety of scenarios without having to imagine all possible edge cases that could +come up in workflows. Input may be saved for regression testing, or hand written for specific cases. ### Scenario Failure @@ -129,3 +130,7 @@ workflow that waits for a signal for a configurable amount of time. - Nicer output that includes resource utilization for the worker (when running all-in-one) - More lang workers + +## Fuzzer trophy case + +* Python upsert SA with no initial attributes: [PR](https://github.com/temporalio/sdk-python/pull/440) \ No newline at end of file diff --git a/cmd/cmdoptions/client.go b/cmd/cmdoptions/client.go index 0bb68db..fc39185 100644 --- a/cmd/cmdoptions/client.go +++ b/cmd/cmdoptions/client.go @@ -3,12 +3,16 @@ package cmdoptions import ( "context" "crypto/tls" + "encoding/base64" "errors" "fmt" "os" + "github.com/golang/protobuf/proto" "github.com/spf13/pflag" + "go.temporal.io/api/common/v1" "go.temporal.io/sdk/client" + "go.temporal.io/sdk/converter" "go.uber.org/zap" ) @@ -94,6 +98,16 @@ func (c *ClientOptions) Dial(metrics *Metrics, logger *zap.SugaredLogger) (clien }) } + dataConverter := converter.NewCompositeDataConverter( + converter.NewNilPayloadConverter(), + converter.NewByteSlicePayloadConverter(), + &PassThroughPayloadConverter{}, + converter.NewProtoJSONPayloadConverter(), + converter.NewProtoPayloadConverter(), + converter.NewJSONPayloadConverter(), + ) + clientOptions.DataConverter = dataConverter + client, err := client.Dial(clientOptions) if err != nil { return nil, fmt.Errorf("failed to dial: %w", err) @@ -135,3 +149,39 @@ func (c *ClientOptions) ToFlags() (flags []string) { } return } + +type PassThroughPayloadConverter struct{} + +func (p *PassThroughPayloadConverter) ToPayload(value interface{}) (*common.Payload, error) { + if valuePayload, ok := value.(*common.Payload); ok { + asBytes, err := proto.Marshal(valuePayload) + if err != nil { + return nil, fmt.Errorf("unable to encode raw payload: %w", err) + } + + return &common.Payload{ + Metadata: map[string][]byte{ + "encoding": []byte(p.Encoding()), + }, + Data: asBytes, + }, nil + } + return nil, nil +} + +func (p *PassThroughPayloadConverter) FromPayload(payload *common.Payload, valuePtr interface{}) error { + innerPayload := &common.Payload{} + err := proto.Unmarshal(payload.GetData(), innerPayload) + if err != nil { + return fmt.Errorf("unable to decode raw payload: %w", err) + } + return converter.GetDefaultDataConverter().FromPayload(innerPayload, valuePtr) +} + +func (p *PassThroughPayloadConverter) ToString(payload *common.Payload) string { + return base64.RawStdEncoding.EncodeToString(payload.GetData()) +} + +func (p *PassThroughPayloadConverter) Encoding() string { + return "_passthrough" +} diff --git a/loadgen/kitchen-sink-gen/Cargo.lock b/loadgen/kitchen-sink-gen/Cargo.lock index 383b196..e73dcec 100644 --- a/loadgen/kitchen-sink-gen/Cargo.lock +++ b/loadgen/kitchen-sink-gen/Cargo.lock @@ -245,6 +245,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + [[package]] name = "kitchen-sink-gen" version = "0.1.0" @@ -258,6 +264,8 @@ dependencies = [ "prost-build", "prost-types", "rand", + "serde", + "serde_json", ] [[package]] @@ -484,12 +492,49 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + [[package]] name = "semver" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "strsim" version = "0.10.0" diff --git a/loadgen/kitchen-sink-gen/Cargo.toml b/loadgen/kitchen-sink-gen/Cargo.toml index 8bcd032..4dfffac 100644 --- a/loadgen/kitchen-sink-gen/Cargo.toml +++ b/loadgen/kitchen-sink-gen/Cargo.toml @@ -14,6 +14,8 @@ derive_more = "0.99" prost = "0.12" prost-types = "0.12" rand = "0.8" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" [build-dependencies] prost-build = "0.12" diff --git a/loadgen/kitchen-sink-gen/build.rs b/loadgen/kitchen-sink-gen/build.rs index 4706e0d..3739c2c 100644 --- a/loadgen/kitchen-sink-gen/build.rs +++ b/loadgen/kitchen-sink-gen/build.rs @@ -53,7 +53,7 @@ fn main() -> Result<(), Box> { cmd.arg(format!("--python_out={out_dir}")); cmd.arg(format!("--pyi_out={out_dir}")); } else if lang == "go" { - cmd.arg(format!("--go_opt=paths=source_relative")); + cmd.arg("--go_opt=paths=source_relative"); cmd.arg(format!("--go_out={out_dir}")); } @@ -78,7 +78,7 @@ fn main() -> Result<(), Box> { let new_data = content.replace("from temporal.api", "from temporalio.api"); let mut dst = fs::File::create(&fpath)?; - dst.write(new_data.as_bytes())?; + dst.write_all(new_data.as_bytes())?; } } } diff --git a/loadgen/kitchen-sink-gen/src/main.rs b/loadgen/kitchen-sink-gen/src/main.rs index 2359f3c..d5b5b23 100644 --- a/loadgen/kitchen-sink-gen/src/main.rs +++ b/loadgen/kitchen-sink-gen/src/main.rs @@ -1,13 +1,15 @@ mod protos; use crate::protos::temporal::{ - api::common::v1::{Payload, Payloads}, + api::common::v1::{Memo, Payload, Payloads}, omes::kitchen_sink::{ - action, client_action, do_actions_update, do_query, do_signal, + action, awaitable_choice, client_action, do_actions_update, do_query, do_signal, do_signal::do_signal_actions, do_update, execute_activity_action, Action, ActionSet, - ClientAction, ClientActionSet, ClientSequence, DoQuery, DoSignal, DoUpdate, - ExecuteActivityAction, HandlerInvocation, RemoteActivityOptions, ReturnResultAction, - TestInput, TimerAction, WorkflowInput, + AwaitWorkflowState, AwaitableChoice, ClientAction, ClientActionSet, ClientSequence, + DoQuery, DoSignal, DoUpdate, ExecuteActivityAction, ExecuteChildWorkflowAction, + HandlerInvocation, RemoteActivityOptions, ReturnResultAction, SetPatchMarkerAction, + TestInput, TimerAction, UpsertMemoAction, UpsertSearchAttributesAction, WorkflowInput, + WorkflowState, }, }; use anyhow::Error; @@ -15,7 +17,10 @@ use arbitrary::{Arbitrary, Unstructured}; use clap::Parser; use prost::Message; use rand::{Rng, SeedableRng}; -use std::{cell::RefCell, io::Write, ops::RangeInclusive, path::PathBuf, time::Duration}; +use std::{ + cell::RefCell, collections::HashMap, io::Write, ops::RangeInclusive, path::PathBuf, + time::Duration, +}; /// A tool for generating client actions and inputs to the kitchen sink workflows in omes. #[derive(Parser, Debug)] @@ -44,35 +49,43 @@ struct GenerateCmd { #[command(flatten)] proto_output: OutputConfig, - #[command(flatten)] - generator_config: GeneratorConfig, + /// When specified, override the generator configuration with the JSON config in the specified + /// file. + #[arg(long)] + generator_config_override: Option, } -// TODO: Make this restorable from serialized form -#[derive(clap::Args, Debug, Default)] +#[derive(Debug, serde::Serialize, serde::Deserialize)] struct GeneratorConfig { /// The maximum number of client action sets that will be generated. - #[arg(long, default_value_t = 250)] max_client_action_sets: usize, - /// The maximum number of actions in a single client action set. - #[arg(long, default_value_t = 5)] max_client_actions_per_set: usize, - /// The maximum number of actions in an action set (in the workflow context). - #[arg(long, default_value_t = 5)] max_actions_per_set: usize, - - /// The max timer duration in milliseconds - #[arg(long, default_value_t = 1000)] - max_timer_ms: u64, - + /// The max timer duration + max_timer: Duration, /// Max size in bytes that a payload will be - #[arg(long, default_value_t = 256)] max_payload_size: usize, - - #[arg(long, default_value_t = 1000)] - max_client_action_set_wait_ms: u64, + /// The maximum time that a client action set will wait at the end of the set before moving on + /// to the next set. + max_client_action_set_wait: Duration, + /// How likely various actions are to be generated + action_chances: ActionChances, +} + +impl Default for GeneratorConfig { + fn default() -> Self { + Self { + max_client_action_sets: 250, + max_client_actions_per_set: 5, + max_actions_per_set: 5, + max_timer: Duration::from_secs(1), + max_payload_size: 256, + max_client_action_set_wait: Duration::from_secs(1), + action_chances: Default::default(), + } + } } #[derive(clap::Args, Debug)] @@ -94,6 +107,82 @@ struct OutputConfig { output_path: Option, } +/// The relative likelihood of each action type being generated as floats which must sum to exactly +/// 100. +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] +struct ActionChances { + timer: f32, + activity: f32, + child_workflow: f32, + patch_marker: f32, + set_workflow_state: f32, + await_workflow_state: f32, + upsert_memo: f32, + upsert_search_attributes: f32, + nested_action_set: f32, +} +impl Default for ActionChances { + fn default() -> Self { + Self { + timer: 25.0, + activity: 25.0, + child_workflow: 25.0, + nested_action_set: 12.5, + patch_marker: 2.5, + set_workflow_state: 2.5, + await_workflow_state: 2.5, + upsert_memo: 2.5, + upsert_search_attributes: 2.5, + } + } +} +impl ActionChances { + fn verify(&self) -> bool { + let sum = self.timer + + self.activity + + self.child_workflow + + self.patch_marker + + self.set_workflow_state + + self.await_workflow_state + + self.upsert_memo + + self.upsert_search_attributes + + self.nested_action_set; + sum == 100.0 + } +} +macro_rules! define_action_chances { + ($($field:ident),+) => { + impl ActionChances { + pub fn get_field_order(&self) -> Vec<(&'static str, f32)> { + vec![$((stringify!($field), self.$field),)+] + } + + $( + pub fn $field(&self, value: f32) -> bool { + let chances = self.get_field_order(); + let mut lower_bound = 0.0; + for (_, chance) in chances.iter().take_while(|(f, _)| *f != stringify!($field)) { + lower_bound += chance; + } + let upper_bound = lower_bound + self.$field; + value >= lower_bound && value <= upper_bound + } + )+ + } + }; +} +define_action_chances!( + timer, + activity, + child_workflow, + nested_action_set, + patch_marker, + set_workflow_state, + await_workflow_state, + upsert_memo, + upsert_search_attributes +); + fn main() -> Result<(), Error> { let args = Args::parse(); match args.command { @@ -110,38 +199,39 @@ fn main() -> Result<(), Error> { fn example(args: ExampleCmd) -> Result<(), Error> { let mut example_input = TestInput::default(); - let mut client_sequence = ClientSequence::default(); - client_sequence.action_sets = vec![ - ClientActionSet { - actions: vec![mk_client_signal_action([TimerAction { - milliseconds: 100, - awaitable_choice: None, - } - .into()])], - concurrent: false, - wait_at_end: Some(Duration::from_secs(1).try_into().unwrap()), - }, - ClientActionSet { - actions: vec![mk_client_signal_action([ - TimerAction { + let client_sequence = ClientSequence { + action_sets: vec![ + ClientActionSet { + actions: vec![mk_client_signal_action([TimerAction { milliseconds: 100, awaitable_choice: None, } - .into(), - ExecuteActivityAction { - activity_type: "noop".to_string(), - start_to_close_timeout: Some(Duration::from_secs(1).try_into().unwrap()), - ..Default::default() - } - .into(), - ReturnResultAction { - return_this: Some(Payload::default()), - } - .into(), - ])], - ..Default::default() - }, - ]; + .into()])], + concurrent: false, + wait_at_end: Some(Duration::from_secs(1).try_into().unwrap()), + }, + ClientActionSet { + actions: vec![mk_client_signal_action([ + TimerAction { + milliseconds: 100, + awaitable_choice: None, + } + .into(), + ExecuteActivityAction { + activity_type: Some(execute_activity_action::ActivityType::Noop(())), + start_to_close_timeout: Some(Duration::from_secs(1).try_into().unwrap()), + ..Default::default() + } + .into(), + ReturnResultAction { + return_this: Some(Payload::default()), + } + .into(), + ])], + ..Default::default() + }, + ], + }; example_input.client_sequence = Some(client_sequence); output_proto(example_input, args.proto_output)?; Ok(()) @@ -156,9 +246,22 @@ fn generate(args: GenerateCmd) -> Result<(), Error> { (rand::rngs::StdRng::seed_from_u64(seed), seed) }; eprintln!("Using seed: {}", seed); - eprintln!("Using config: {:?}", &args.generator_config); + let config = if let Some(path) = args.generator_config_override { + let config_str = std::fs::read_to_string(path)?; + serde_json::from_str(&config_str)? + } else { + GeneratorConfig::default() + }; + if !config.action_chances.verify() { + return Err(anyhow::anyhow!( + "ActionChances must sum to exactly 100, got {:?}", + config.action_chances + )); + } + eprintln!("Using config: {:?}", serde_json::to_string(&config)?); let context = ArbContext { - config: args.generator_config, + config, + cur_workflow_state: Default::default(), }; ARB_CONTEXT.set(context); @@ -177,9 +280,12 @@ thread_local! { static ARB_CONTEXT: RefCell = RefCell::new(ArbContext::default()); } +static WF_STATE_FIELD_VALUE: &str = "x"; + #[derive(Default)] struct ArbContext { config: GeneratorConfig, + cur_workflow_state: WorkflowState, } impl<'a> Arbitrary<'a> for TestInput { @@ -205,7 +311,7 @@ impl<'a> Arbitrary<'a> for TestInput { } impl<'a> Arbitrary<'a> for WorkflowInput { - fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { + fn arbitrary(_: &mut Unstructured<'a>) -> arbitrary::Result { // TODO impl Ok(Self { initial_actions: vec![], @@ -330,13 +436,53 @@ impl<'a> Arbitrary<'a> for ActionSet { impl<'a> Arbitrary<'a> for Action { fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { - // TODO: Adjustable ratio of choice? - // TODO: The rest of the kinds of actions - let action_kind = u.int_in_range(0..=1)?; - let variant = match action_kind { - 0 => action::Variant::Timer(u.arbitrary()?), - 1 => action::Variant::ExecActivity(u.arbitrary()?), - _ => unreachable!(), + let action_kind = u.int_in_range(0..=100)? as f32; + let chances = ARB_CONTEXT.with_borrow(|c| c.config.action_chances.clone()); + let variant = if chances.timer(action_kind) { + action::Variant::Timer(u.arbitrary()?) + } else if chances.activity(action_kind) { + action::Variant::ExecActivity(u.arbitrary()?) + } else if chances.child_workflow(action_kind) { + action::Variant::ExecChildWorkflow(u.arbitrary()?) + } else if chances.patch_marker(action_kind) { + action::Variant::SetPatchMarker(u.arbitrary()?) + } else if chances.set_workflow_state(action_kind) { + action::Variant::SetWorkflowState({ + let chosen_int = u.int_in_range(1..=100)?; + ARB_CONTEXT.with_borrow_mut(|c| { + c.cur_workflow_state + .kvs + .insert(chosen_int.to_string(), WF_STATE_FIELD_VALUE.to_string()); + c.cur_workflow_state.clone() + }) + }) + } else if chances.await_workflow_state(action_kind) { + let key = ARB_CONTEXT.with_borrow(|c| { + if c.cur_workflow_state.kvs.is_empty() { + None + } else { + let keys = c.cur_workflow_state.kvs.keys().collect::>(); + Some(u.choose(&keys).map(|s| s.to_string())) + } + }); + if let Some(key) = key { + action::Variant::AwaitWorkflowState(AwaitWorkflowState { + key: key?, + value: WF_STATE_FIELD_VALUE.to_string(), + }) + } else { + // Pick a different action if we've never set anything in state + let action: Action = u.arbitrary()?; + action.variant.unwrap() + } + } else if chances.upsert_memo(action_kind) { + action::Variant::UpsertMemo(u.arbitrary()?) + } else if chances.upsert_search_attributes(action_kind) { + action::Variant::UpsertSearchAttributes(u.arbitrary()?) + } else if chances.nested_action_set(action_kind) { + action::Variant::NestedActionSet(u.arbitrary()?) + } else { + unreachable!() }; Ok(Self { variant: Some(variant), @@ -347,9 +493,10 @@ impl<'a> Arbitrary<'a> for Action { impl<'a> Arbitrary<'a> for TimerAction { fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { Ok(Self { - milliseconds: u.int_in_range(0..=ARB_CONTEXT.with_borrow(|c| c.config.max_timer_ms))?, - // TODO: implement - awaitable_choice: None, + milliseconds: u.int_in_range( + 0..=ARB_CONTEXT.with_borrow(|c| c.config.max_timer.as_millis() as u64), + )?, + awaitable_choice: Some(u.arbitrary()?), }) } } @@ -362,24 +509,118 @@ impl<'a> Arbitrary<'a> for ExecuteActivityAction { } else { execute_activity_action::Locality::IsLocal(()) }; + let delay = u.int_in_range(0..=1_000)?; Ok(Self { - activity_type: "noop".to_string(), - task_queue: "".to_string(), - headers: Default::default(), - arguments: vec![], - schedule_to_close_timeout: None, - schedule_to_start_timeout: None, + activity_type: Some(execute_activity_action::ActivityType::Delay( + Duration::from_millis(delay) + .try_into() + .expect("proto duration works"), + )), start_to_close_timeout: Some(Duration::from_secs(5).try_into().unwrap()), - heartbeat_timeout: None, - retry_policy: None, - awaitable_choice: None, locality: Some(locality), + awaitable_choice: Some(u.arbitrary()?), + ..Default::default() }) } } -impl<'a> Arbitrary<'a> for RemoteActivityOptions { +impl<'a> Arbitrary<'a> for ExecuteChildWorkflowAction { + fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { + let input = WorkflowInput { + initial_actions: vec![ActionSet { + actions: vec![ + Action { + variant: Some(action::Variant::Timer(TimerAction { + milliseconds: u.int_in_range(0..=1_000)?, + awaitable_choice: None, + })), + }, + Action { + variant: Some(action::Variant::ReturnResult(ReturnResultAction { + return_this: Some(Payload::default()), + })), + }, + ], + concurrent: false, + }], + }; + let input = to_proto_payload(input, "temporal.omes.kitchen_sink.WorkflowInput"); + Ok(Self { + // Use KS as own child, with an input to just return right away + workflow_type: "kitchenSink".to_string(), + input: vec![input], + awaitable_choice: Some(u.arbitrary()?), + ..Default::default() + }) + } +} + +impl<'a> Arbitrary<'a> for SetPatchMarkerAction { + fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { + let patch_id = u.int_in_range(1..=10)?; + Ok(Self { + patch_id: patch_id.to_string(), + // Patches should be consistently deprecated or not for the same ID + deprecated: patch_id % 2 == 0, + inner_action: Some(u.arbitrary()?), + }) + } +} + +impl<'a> Arbitrary<'a> for UpsertMemoAction { + fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { + Ok(Self { + upserted_memo: Some(Memo { + fields: { + let mut hm = HashMap::new(); + let chosen_int = u.int_in_range(1..=100)?; + hm.insert( + chosen_int.to_string(), + Payload { + metadata: Default::default(), + data: vec![chosen_int], + }, + ); + hm + }, + }), + }) + } +} + +static SEARCH_ATTR_KEYS: [&str; 2] = ["KS_Keyword", "KS_Int"]; + +impl<'a> Arbitrary<'a> for UpsertSearchAttributesAction { fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { + let chosen_sa = *u.choose(&SEARCH_ATTR_KEYS)?; + Ok(Self { + search_attributes: { + let mut hm = HashMap::new(); + let data = if chosen_sa == "KS_Keyword" { + serde_json::to_vec(&u.int_in_range(1..=255)?.to_string()) + } else { + serde_json::to_vec(&u.int_in_range(1..=255)?) + } + .expect("serializes"); + hm.insert( + chosen_sa.to_string(), + Payload { + metadata: { + let mut m = HashMap::new(); + m.insert("encoding".to_string(), "json/plain".into()); + m + }, + data, + }, + ); + hm + }, + }) + } +} + +impl<'a> Arbitrary<'a> for RemoteActivityOptions { + fn arbitrary(_: &mut Unstructured<'a>) -> arbitrary::Result { // TODO: impl Ok(Self::default()) } @@ -416,7 +657,7 @@ struct ClientActionWait { impl<'a> Arbitrary<'a> for ClientActionWait { fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { let duration_ms = u.int_in_range( - 0..=ARB_CONTEXT.with_borrow(|c| c.config.max_client_action_set_wait_ms), + 0..=ARB_CONTEXT.with_borrow(|c| c.config.max_client_action_set_wait.as_millis() as u64), )?; Ok(Self { duration: Duration::from_millis(duration_ms), @@ -429,6 +670,21 @@ impl From for prost_types::Duration { } } +impl<'a> Arbitrary<'a> for AwaitableChoice { + fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { + let choices = [ + awaitable_choice::Condition::WaitFinish(()), + awaitable_choice::Condition::Abandon(()), + awaitable_choice::Condition::CancelBeforeStarted(()), + awaitable_choice::Condition::CancelAfterStarted(()), + awaitable_choice::Condition::CancelAfterCompleted(()), + ]; + Ok(AwaitableChoice { + condition: Some(u.choose(&choices)?.clone()), + }) + } +} + fn vec_of_size<'a, T: Arbitrary<'a>>( u: &mut Unstructured<'a>, size_range: RangeInclusive, @@ -480,3 +736,15 @@ fn mk_action_set(actions: impl IntoIterator) -> ActionSe concurrent: true, } } + +fn to_proto_payload(msg: impl Message, type_name: &str) -> Payload { + Payload { + metadata: { + let mut m = HashMap::new(); + m.insert("encoding".to_string(), "binary/protobuf".into()); + m.insert("messageType".to_string(), type_name.into()); + m + }, + data: msg.encode_to_vec(), + } +} diff --git a/loadgen/kitchen-sink-gen/src/protos.rs b/loadgen/kitchen-sink-gen/src/protos.rs index 343fd20..4378483 100644 --- a/loadgen/kitchen-sink-gen/src/protos.rs +++ b/loadgen/kitchen-sink-gen/src/protos.rs @@ -1,5 +1,6 @@ pub mod temporal { pub mod omes { + #[allow(clippy::all)] pub mod kitchen_sink { include!(concat!(env!("OUT_DIR"), "/temporal.omes.kitchen_sink.rs")); impl HandlerInvocation { @@ -13,6 +14,7 @@ pub mod temporal { } } + #[allow(clippy::all)] pub mod api { pub mod common { pub mod v1 { diff --git a/loadgen/kitchensink/helpers.go b/loadgen/kitchensink/helpers.go index fa02202..bf72e23 100644 --- a/loadgen/kitchensink/helpers.go +++ b/loadgen/kitchensink/helpers.go @@ -19,7 +19,7 @@ func NoOpSingleActivityActionSet() *ActionSet { { Variant: &Action_ExecActivity{ ExecActivity: &ExecuteActivityAction{ - ActivityType: "noop", + ActivityType: &ExecuteActivityAction_Noop{}, StartToCloseTimeout: &durationpb.Duration{Seconds: 5}, }, }, @@ -99,6 +99,7 @@ func (e *ClientActionsExecutor) executeClientAction(ctx context.Context, action } else { return fmt.Errorf("do_signal must recognizable variant") } + return err } else if update := action.GetDoUpdate(); update != nil { if actionsUpdate := update.GetDoActions(); actionsUpdate != nil { _, err = e.Client.UpdateWorkflow(ctx, e.WorkflowID, e.RunID, "do_actions_update", actionsUpdate) @@ -110,6 +111,7 @@ func (e *ClientActionsExecutor) executeClientAction(ctx context.Context, action if update.FailureExpected { err = nil } + return err } else if query := action.GetDoQuery(); query != nil { if query.GetReportState() != nil { // TODO: Use args @@ -122,9 +124,11 @@ func (e *ClientActionsExecutor) executeClientAction(ctx context.Context, action if query.FailureExpected { err = nil } + return err } else if action.GetNestedActions() != nil { err = e.executeClientActionSet(ctx, action.GetNestedActions()) + return err + } else { + return fmt.Errorf("client action must be set") } - - return err } diff --git a/loadgen/kitchensink/kitchen_sink.pb.go b/loadgen/kitchensink/kitchen_sink.pb.go index 84bccb9..467e58d 100644 --- a/loadgen/kitchensink/kitchen_sink.pb.go +++ b/loadgen/kitchensink/kitchen_sink.pb.go @@ -1544,12 +1544,15 @@ type ExecuteActivityAction struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ActivityType string `protobuf:"bytes,2,opt,name=activity_type,json=activityType,proto3" json:"activity_type,omitempty"` + // Types that are assignable to ActivityType: + // + // *ExecuteActivityAction_Generic + // *ExecuteActivityAction_Delay + // *ExecuteActivityAction_Noop + ActivityType isExecuteActivityAction_ActivityType `protobuf_oneof:"activity_type"` // The name of the task queue to place this activity request in - TaskQueue string `protobuf:"bytes,3,opt,name=task_queue,json=taskQueue,proto3" json:"task_queue,omitempty"` - Headers map[string]*v1.Payload `protobuf:"bytes,4,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Arguments/input to the activity. Called "input" upstream. - Arguments []*v1.Payload `protobuf:"bytes,5,rep,name=arguments,proto3" json:"arguments,omitempty"` + TaskQueue string `protobuf:"bytes,4,opt,name=task_queue,json=taskQueue,proto3" json:"task_queue,omitempty"` + Headers map[string]*v1.Payload `protobuf:"bytes,5,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Indicates how long the caller is willing to wait for an activity completion. Limits how long // retries will be attempted. Either this or start_to_close_timeout_seconds must be specified. // When not specified defaults to the workflow execution timeout. @@ -1609,11 +1612,32 @@ func (*ExecuteActivityAction) Descriptor() ([]byte, []int) { return file_kitchen_sink_proto_rawDescGZIP(), []int{15} } -func (x *ExecuteActivityAction) GetActivityType() string { - if x != nil { - return x.ActivityType +func (m *ExecuteActivityAction) GetActivityType() isExecuteActivityAction_ActivityType { + if m != nil { + return m.ActivityType } - return "" + return nil +} + +func (x *ExecuteActivityAction) GetGeneric() *ExecuteActivityAction_GenericActivity { + if x, ok := x.GetActivityType().(*ExecuteActivityAction_Generic); ok { + return x.Generic + } + return nil +} + +func (x *ExecuteActivityAction) GetDelay() *durationpb.Duration { + if x, ok := x.GetActivityType().(*ExecuteActivityAction_Delay); ok { + return x.Delay + } + return nil +} + +func (x *ExecuteActivityAction) GetNoop() *emptypb.Empty { + if x, ok := x.GetActivityType().(*ExecuteActivityAction_Noop); ok { + return x.Noop + } + return nil } func (x *ExecuteActivityAction) GetTaskQueue() string { @@ -1630,13 +1654,6 @@ func (x *ExecuteActivityAction) GetHeaders() map[string]*v1.Payload { return nil } -func (x *ExecuteActivityAction) GetArguments() []*v1.Payload { - if x != nil { - return x.Arguments - } - return nil -} - func (x *ExecuteActivityAction) GetScheduleToCloseTimeout() *durationpb.Duration { if x != nil { return x.ScheduleToCloseTimeout @@ -1700,6 +1717,31 @@ func (x *ExecuteActivityAction) GetAwaitableChoice() *AwaitableChoice { return nil } +type isExecuteActivityAction_ActivityType interface { + isExecuteActivityAction_ActivityType() +} + +type ExecuteActivityAction_Generic struct { + Generic *ExecuteActivityAction_GenericActivity `protobuf:"bytes,1,opt,name=generic,proto3,oneof"` +} + +type ExecuteActivityAction_Delay struct { + // There must be an activity named `delay` which accepts some kind of duration and waits + // for that long + Delay *durationpb.Duration `protobuf:"bytes,2,opt,name=delay,proto3,oneof"` +} + +type ExecuteActivityAction_Noop struct { + // There must be an activity named `noop` which does nothing + Noop *emptypb.Empty `protobuf:"bytes,3,opt,name=noop,proto3,oneof"` +} + +func (*ExecuteActivityAction_Generic) isExecuteActivityAction_ActivityType() {} + +func (*ExecuteActivityAction_Delay) isExecuteActivityAction_ActivityType() {} + +func (*ExecuteActivityAction_Noop) isExecuteActivityAction_ActivityType() {} + type isExecuteActivityAction_Locality interface { isExecuteActivityAction_Locality() } @@ -2127,6 +2169,8 @@ type SetPatchMarkerAction struct { // Can be set to true to indicate that branches using this change are being removed, and all // future worker deployments will only have the "with change" code in them. Deprecated bool `protobuf:"varint,2,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + // Perform this action behind the if guard + InnerAction *Action `protobuf:"bytes,3,opt,name=inner_action,json=innerAction,proto3" json:"inner_action,omitempty"` } func (x *SetPatchMarkerAction) Reset() { @@ -2175,6 +2219,13 @@ func (x *SetPatchMarkerAction) GetDeprecated() bool { return false } +func (x *SetPatchMarkerAction) GetInnerAction() *Action { + if x != nil { + return x.InnerAction + } + return nil +} + type UpsertSearchAttributesAction struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2655,6 +2706,61 @@ func (*DoSignal_DoSignalActions_DoActions) isDoSignal_DoSignalActions_Variant() func (*DoSignal_DoSignalActions_DoActionsInMain) isDoSignal_DoSignalActions_Variant() {} +type ExecuteActivityAction_GenericActivity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Arguments []*v1.Payload `protobuf:"bytes,2,rep,name=arguments,proto3" json:"arguments,omitempty"` +} + +func (x *ExecuteActivityAction_GenericActivity) Reset() { + *x = ExecuteActivityAction_GenericActivity{} + if protoimpl.UnsafeEnabled { + mi := &file_kitchen_sink_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecuteActivityAction_GenericActivity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecuteActivityAction_GenericActivity) ProtoMessage() {} + +func (x *ExecuteActivityAction_GenericActivity) ProtoReflect() protoreflect.Message { + mi := &file_kitchen_sink_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExecuteActivityAction_GenericActivity.ProtoReflect.Descriptor instead. +func (*ExecuteActivityAction_GenericActivity) Descriptor() ([]byte, []int) { + return file_kitchen_sink_proto_rawDescGZIP(), []int{15, 0} +} + +func (x *ExecuteActivityAction_GenericActivity) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ExecuteActivityAction_GenericActivity) GetArguments() []*v1.Payload { + if x != nil { + return x.Arguments + } + return nil +} + var File_kitchen_sink_proto protoreflect.FileDescriptor var file_kitchen_sink_proto_rawDesc = []byte{ @@ -2921,359 +3027,377 @@ var file_kitchen_sink_proto_rawDesc = []byte{ 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x41, 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x0f, 0x61, 0x77, 0x61, 0x69, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x22, 0xc3, 0x07, 0x0a, 0x15, 0x45, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x22, 0x96, 0x09, 0x0a, 0x15, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x73, - 0x6b, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, - 0x61, 0x73, 0x6b, 0x51, 0x75, 0x65, 0x75, 0x65, 0x12, 0x58, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x6d, 0x70, - 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, - 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x54, 0x0a, 0x19, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x6f, - 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, + 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, + 0x6e, 0x6b, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x69, 0x63, 0x12, 0x31, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, + 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x2c, 0x0a, 0x04, 0x6e, 0x6f, 0x6f, 0x70, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x04, + 0x6e, 0x6f, 0x6f, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x71, 0x75, 0x65, + 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x51, 0x75, + 0x65, 0x75, 0x65, 0x12, 0x58, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, + 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, + 0x6b, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x54, 0x0a, + 0x19, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x6f, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x54, 0x0a, 0x19, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x16, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x6f, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4e, 0x0a, 0x16, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x6f, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x46, 0x0a, 0x11, 0x68, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x16, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x6f, 0x43, 0x6c, 0x6f, 0x73, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x54, 0x0a, 0x19, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, - 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4e, 0x0a, - 0x16, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, - 0x6f, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x46, 0x0a, - 0x11, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, - 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x33, 0x0a, - 0x08, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x07, 0x69, 0x73, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x12, 0x4b, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, - 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, - 0x56, 0x0a, 0x10, 0x61, 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x6f, - 0x69, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x6d, 0x70, - 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, - 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x41, 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x0f, 0x61, 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x1a, 0x5b, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, - 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x22, 0xe6, 0x0c, 0x0a, 0x1a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x68, 0x69, 0x6c, - 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x23, - 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x71, 0x75, 0x65, 0x75, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x51, 0x75, 0x65, - 0x75, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x57, 0x0a, 0x1a, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x72, - 0x75, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x75, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, - 0x4d, 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x61, 0x73, 0x6b, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x5d, - 0x0a, 0x13, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x65, - 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, - 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, - 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x11, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x65, 0x0a, - 0x18, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x5f, 0x72, 0x65, 0x75, - 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x2c, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x65, - 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x49, 0x64, 0x52, 0x65, 0x75, 0x73, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x15, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x52, 0x65, 0x75, 0x73, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x46, 0x0a, 0x0c, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x6d, + 0x10, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, + 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0b, 0x72, 0x65, + 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x69, 0x73, 0x5f, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x48, 0x01, 0x52, 0x07, 0x69, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x4b, + 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, + 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, + 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x48, 0x01, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x10, 0x61, + 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, + 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, + 0x6e, 0x6b, 0x2e, 0x41, 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, + 0x63, 0x65, 0x52, 0x0f, 0x61, 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x6f, + 0x69, 0x63, 0x65, 0x1a, 0x64, 0x0a, 0x0f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x5b, 0x0a, 0x0c, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, - 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x12, 0x5d, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x0f, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, - 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x54, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x22, 0xe6, 0x0c, 0x0a, 0x1a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, + 0x68, 0x69, 0x6c, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x71, + 0x75, 0x65, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, + 0x51, 0x75, 0x65, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x57, 0x0a, 0x1a, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4b, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x75, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x12, 0x4d, 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, + 0x61, 0x73, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x12, 0x5d, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, - 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x12, 0x79, 0x0a, 0x11, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x4c, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, + 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x50, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x11, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x65, 0x0a, 0x18, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x5f, + 0x72, 0x65, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x52, 0x65, 0x75, 0x73, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x52, 0x65, 0x75, 0x73, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x46, 0x0a, 0x0c, 0x72, 0x65, 0x74, 0x72, 0x79, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x12, 0x5d, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, + 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, + 0x6e, 0x6b, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x12, 0x54, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x10, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x10, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, - 0x73, 0x12, 0x66, 0x0a, 0x11, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x74, - 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, - 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x59, 0x0a, 0x11, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x13, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, + 0x6c, 0x6f, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x12, 0x79, 0x0a, 0x11, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x11, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, - 0x6b, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x52, 0x10, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x56, 0x0a, 0x10, 0x61, 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, - 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, - 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x41, 0x77, 0x61, 0x69, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x0f, 0x61, 0x77, 0x61, - 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x1a, 0x5b, 0x0a, 0x0c, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x09, 0x4d, 0x65, 0x6d, - 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, - 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x64, 0x0a, 0x15, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3c, 0x0a, 0x12, 0x41, 0x77, 0x61, - 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x6b, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x10, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x12, 0x66, 0x0a, 0x11, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x39, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, + 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x63, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x59, 0x0a, 0x11, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, + 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, + 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x10, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, + 0x67, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x56, 0x0a, 0x10, 0x61, 0x77, 0x61, 0x69, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, + 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x41, + 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x0f, + 0x61, 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x1a, + 0x5b, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xaa, 0x03, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x15, 0x0a, - 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, - 0x75, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x53, 0x0a, 0x07, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, - 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, - 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, - 0x56, 0x0a, 0x10, 0x61, 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x6f, - 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x6d, 0x70, - 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, - 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x41, 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x0f, 0x61, 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x1a, 0x5b, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, - 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x14, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x15, 0x0a, - 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, - 0x75, 0x6e, 0x49, 0x64, 0x22, 0x51, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x63, 0x68, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, - 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x81, 0x02, 0x0a, 0x1c, 0x55, 0x70, 0x73, 0x65, - 0x72, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x7b, 0x0a, 0x11, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, - 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, - 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x10, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x64, 0x0a, 0x15, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x55, 0x0a, 0x10, 0x55, - 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x41, 0x0a, 0x0d, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, - 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x0c, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x4d, 0x65, - 0x6d, 0x6f, 0x22, 0x56, 0x0a, 0x12, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x5f, 0x74, 0x68, 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x0a, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x54, 0x68, 0x69, 0x73, 0x22, 0x4f, 0x0a, 0x11, 0x52, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3a, 0x0a, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, - 0x72, 0x65, 0x52, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x22, 0x8f, 0x08, 0x0a, 0x13, - 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, 0x73, 0x4e, 0x65, 0x77, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, - 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, - 0x73, 0x6b, 0x51, 0x75, 0x65, 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, + 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x09, + 0x4d, 0x65, 0x6d, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x75, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x4d, 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, - 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x12, 0x4d, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x39, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, - 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, 0x73, 0x4e, 0x65, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x6d, 0x65, 0x6d, - 0x6f, 0x12, 0x56, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, - 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, 0x73, 0x4e, 0x65, 0x77, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x72, 0x0a, 0x11, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, - 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, - 0x6b, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, 0x73, 0x4e, 0x65, 0x77, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x46, 0x0a, - 0x0c, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, - 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x59, 0x0a, 0x11, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, - 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x10, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x1a, 0x58, 0x0a, 0x09, 0x4d, 0x65, 0x6d, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x0c, 0x48, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x64, 0x0a, 0x15, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3c, 0x0a, 0x12, + 0x41, 0x77, 0x61, 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xaa, 0x03, 0x0a, 0x10, 0x53, + 0x65, 0x6e, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, + 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, + 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x53, 0x0a, + 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, + 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, + 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x53, 0x65, 0x6e, 0x64, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x56, 0x0a, 0x10, 0x61, 0x77, 0x61, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, + 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, + 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x41, 0x77, 0x61, 0x69, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x0f, 0x61, 0x77, 0x61, 0x69, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x1a, 0x5b, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x64, 0x0a, 0x15, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8a, 0x02, - 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x61, 0x0a, 0x11, 0x63, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, - 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x64, 0x6f, - 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x65, 0x61, 0x67, 0x65, 0x72, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x6f, 0x4e, 0x6f, - 0x74, 0x45, 0x61, 0x67, 0x65, 0x72, 0x6c, 0x79, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, - 0x59, 0x0a, 0x11, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6d, - 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, - 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, - 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x10, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2a, 0xa4, 0x01, 0x0a, 0x11, 0x50, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x12, 0x23, 0x0a, 0x1f, 0x50, 0x41, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, - 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x41, 0x52, 0x45, 0x4e, 0x54, 0x5f, - 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x54, 0x45, 0x52, - 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x41, 0x52, 0x45, - 0x4e, 0x54, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, - 0x41, 0x42, 0x41, 0x4e, 0x44, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x41, 0x52, - 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, - 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x10, - 0x03, 0x2a, 0x40, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x54, - 0x49, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, - 0x54, 0x10, 0x02, 0x2a, 0xa2, 0x01, 0x0a, 0x1d, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x57, - 0x46, 0x5f, 0x41, 0x42, 0x41, 0x4e, 0x44, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x43, - 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x57, 0x46, 0x5f, 0x54, 0x52, 0x59, 0x5f, 0x43, 0x41, 0x4e, 0x43, - 0x45, 0x4c, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x57, 0x46, - 0x5f, 0x57, 0x41, 0x49, 0x54, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x28, - 0x0a, 0x24, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x57, 0x46, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x5f, - 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x51, - 0x55, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x58, 0x0a, 0x18, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x69, 0x74, 0x79, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x52, 0x59, 0x5f, 0x43, 0x41, 0x4e, 0x43, - 0x45, 0x4c, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x41, 0x49, 0x54, 0x5f, 0x43, 0x41, 0x4e, - 0x43, 0x45, 0x4c, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, - 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x42, 0x41, 0x4e, 0x44, 0x4f, 0x4e, - 0x10, 0x02, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x69, 0x6f, 0x2f, 0x6f, 0x6d, 0x65, 0x73, - 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, - 0x73, 0x69, 0x6e, 0x6b, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x14, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, + 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x22, 0x98, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, + 0x61, 0x74, 0x63, 0x68, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, + 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0c, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, + 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x81, 0x02, 0x0a, 0x1c, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x7b, 0x0a, 0x11, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4e, + 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, + 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x55, 0x70, 0x73, 0x65, + 0x72, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x1a, 0x64, 0x0a, 0x15, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, + 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x55, 0x0a, 0x10, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, + 0x4d, 0x65, 0x6d, 0x6f, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0d, 0x75, 0x70, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, + 0x0c, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x22, 0x56, 0x0a, + 0x12, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x74, 0x68, + 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, + 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x54, 0x68, 0x69, 0x73, 0x22, 0x4f, 0x0a, 0x11, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x07, 0x66, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x65, + 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x66, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x07, 0x66, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x22, 0x8f, 0x08, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x65, 0x41, 0x73, 0x4e, 0x65, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, + 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x71, 0x75, 0x65, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x51, 0x75, 0x65, + 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x4b, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x75, + 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x75, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4d, + 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4d, 0x0a, + 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, + 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, + 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x41, 0x73, 0x4e, 0x65, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x6d, + 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x12, 0x56, 0x0a, 0x07, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, + 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, + 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x65, 0x41, 0x73, 0x4e, 0x65, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x72, 0x0a, 0x11, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x45, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, + 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, 0x73, 0x4e, 0x65, 0x77, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0c, 0x72, 0x65, 0x74, 0x72, + 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x59, 0x0a, 0x11, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x65, + 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, + 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x10, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x58, 0x0a, 0x09, 0x4d, + 0x65, 0x6d, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, + 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, + 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x64, 0x0a, 0x15, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, + 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8a, 0x02, 0x0a, 0x15, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x61, 0x0a, 0x11, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, + 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, + 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x10, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x64, 0x6f, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, + 0x65, 0x61, 0x67, 0x65, 0x72, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x6f, 0x4e, 0x6f, 0x74, 0x45, 0x61, 0x67, 0x65, + 0x72, 0x6c, 0x79, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x59, 0x0a, 0x11, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, + 0x2e, 0x6f, 0x6d, 0x65, 0x73, 0x2e, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x69, + 0x6e, 0x6b, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x52, 0x10, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2a, 0xa4, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x23, 0x0a, 0x1f, 0x50, + 0x41, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, + 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x41, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, + 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, + 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x41, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, + 0x4f, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x41, 0x42, 0x41, 0x4e, 0x44, + 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x41, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x43, + 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x52, 0x45, 0x51, 0x55, + 0x45, 0x53, 0x54, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x10, 0x03, 0x2a, 0x40, 0x0a, 0x10, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x54, 0x49, 0x42, 0x4c, 0x45, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x2a, 0xa2, + 0x01, 0x0a, 0x1d, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x10, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x57, 0x46, 0x5f, 0x41, 0x42, 0x41, + 0x4e, 0x44, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, + 0x57, 0x46, 0x5f, 0x54, 0x52, 0x59, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x10, 0x01, 0x12, + 0x28, 0x0a, 0x24, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x57, 0x46, 0x5f, 0x57, 0x41, 0x49, 0x54, + 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, + 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x28, 0x0a, 0x24, 0x43, 0x48, 0x49, + 0x4c, 0x44, 0x5f, 0x57, 0x46, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, + 0x4c, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x45, + 0x44, 0x10, 0x03, 0x2a, 0x58, 0x0a, 0x18, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0e, 0x0a, 0x0a, 0x54, 0x52, 0x59, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x10, 0x00, 0x12, + 0x1f, 0x0a, 0x1b, 0x57, 0x41, 0x49, 0x54, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x42, 0x41, 0x4e, 0x44, 0x4f, 0x4e, 0x10, 0x02, 0x42, 0x30, 0x5a, + 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x65, 0x6d, 0x70, + 0x6f, 0x72, 0x61, 0x6c, 0x69, 0x6f, 0x2f, 0x6f, 0x6d, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x61, 0x64, + 0x67, 0x65, 0x6e, 0x2f, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6e, 0x6b, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3289,78 +3413,79 @@ func file_kitchen_sink_proto_rawDescGZIP() []byte { } var file_kitchen_sink_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_kitchen_sink_proto_msgTypes = make([]protoimpl.MessageInfo, 38) +var file_kitchen_sink_proto_msgTypes = make([]protoimpl.MessageInfo, 39) var file_kitchen_sink_proto_goTypes = []interface{}{ - (ParentClosePolicy)(0), // 0: temporal.omes.kitchen_sink.ParentClosePolicy - (VersioningIntent)(0), // 1: temporal.omes.kitchen_sink.VersioningIntent - (ChildWorkflowCancellationType)(0), // 2: temporal.omes.kitchen_sink.ChildWorkflowCancellationType - (ActivityCancellationType)(0), // 3: temporal.omes.kitchen_sink.ActivityCancellationType - (*TestInput)(nil), // 4: temporal.omes.kitchen_sink.TestInput - (*ClientSequence)(nil), // 5: temporal.omes.kitchen_sink.ClientSequence - (*ClientActionSet)(nil), // 6: temporal.omes.kitchen_sink.ClientActionSet - (*ClientAction)(nil), // 7: temporal.omes.kitchen_sink.ClientAction - (*DoSignal)(nil), // 8: temporal.omes.kitchen_sink.DoSignal - (*DoQuery)(nil), // 9: temporal.omes.kitchen_sink.DoQuery - (*DoUpdate)(nil), // 10: temporal.omes.kitchen_sink.DoUpdate - (*DoActionsUpdate)(nil), // 11: temporal.omes.kitchen_sink.DoActionsUpdate - (*HandlerInvocation)(nil), // 12: temporal.omes.kitchen_sink.HandlerInvocation - (*WorkflowState)(nil), // 13: temporal.omes.kitchen_sink.WorkflowState - (*WorkflowInput)(nil), // 14: temporal.omes.kitchen_sink.WorkflowInput - (*ActionSet)(nil), // 15: temporal.omes.kitchen_sink.ActionSet - (*Action)(nil), // 16: temporal.omes.kitchen_sink.Action - (*AwaitableChoice)(nil), // 17: temporal.omes.kitchen_sink.AwaitableChoice - (*TimerAction)(nil), // 18: temporal.omes.kitchen_sink.TimerAction - (*ExecuteActivityAction)(nil), // 19: temporal.omes.kitchen_sink.ExecuteActivityAction - (*ExecuteChildWorkflowAction)(nil), // 20: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction - (*AwaitWorkflowState)(nil), // 21: temporal.omes.kitchen_sink.AwaitWorkflowState - (*SendSignalAction)(nil), // 22: temporal.omes.kitchen_sink.SendSignalAction - (*CancelWorkflowAction)(nil), // 23: temporal.omes.kitchen_sink.CancelWorkflowAction - (*SetPatchMarkerAction)(nil), // 24: temporal.omes.kitchen_sink.SetPatchMarkerAction - (*UpsertSearchAttributesAction)(nil), // 25: temporal.omes.kitchen_sink.UpsertSearchAttributesAction - (*UpsertMemoAction)(nil), // 26: temporal.omes.kitchen_sink.UpsertMemoAction - (*ReturnResultAction)(nil), // 27: temporal.omes.kitchen_sink.ReturnResultAction - (*ReturnErrorAction)(nil), // 28: temporal.omes.kitchen_sink.ReturnErrorAction - (*ContinueAsNewAction)(nil), // 29: temporal.omes.kitchen_sink.ContinueAsNewAction - (*RemoteActivityOptions)(nil), // 30: temporal.omes.kitchen_sink.RemoteActivityOptions - (*DoSignal_DoSignalActions)(nil), // 31: temporal.omes.kitchen_sink.DoSignal.DoSignalActions - nil, // 32: temporal.omes.kitchen_sink.WorkflowState.KvsEntry - nil, // 33: temporal.omes.kitchen_sink.ExecuteActivityAction.HeadersEntry - nil, // 34: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.HeadersEntry - nil, // 35: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.MemoEntry - nil, // 36: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.SearchAttributesEntry - nil, // 37: temporal.omes.kitchen_sink.SendSignalAction.HeadersEntry - nil, // 38: temporal.omes.kitchen_sink.UpsertSearchAttributesAction.SearchAttributesEntry - nil, // 39: temporal.omes.kitchen_sink.ContinueAsNewAction.MemoEntry - nil, // 40: temporal.omes.kitchen_sink.ContinueAsNewAction.HeadersEntry - nil, // 41: temporal.omes.kitchen_sink.ContinueAsNewAction.SearchAttributesEntry - (*durationpb.Duration)(nil), // 42: google.protobuf.Duration - (*v1.Payloads)(nil), // 43: temporal.api.common.v1.Payloads - (*emptypb.Empty)(nil), // 44: google.protobuf.Empty - (*v1.Payload)(nil), // 45: temporal.api.common.v1.Payload - (*v1.RetryPolicy)(nil), // 46: temporal.api.common.v1.RetryPolicy - (v11.WorkflowIdReusePolicy)(0), // 47: temporal.api.enums.v1.WorkflowIdReusePolicy - (*v1.Memo)(nil), // 48: temporal.api.common.v1.Memo - (*v12.Failure)(nil), // 49: temporal.api.failure.v1.Failure + (ParentClosePolicy)(0), // 0: temporal.omes.kitchen_sink.ParentClosePolicy + (VersioningIntent)(0), // 1: temporal.omes.kitchen_sink.VersioningIntent + (ChildWorkflowCancellationType)(0), // 2: temporal.omes.kitchen_sink.ChildWorkflowCancellationType + (ActivityCancellationType)(0), // 3: temporal.omes.kitchen_sink.ActivityCancellationType + (*TestInput)(nil), // 4: temporal.omes.kitchen_sink.TestInput + (*ClientSequence)(nil), // 5: temporal.omes.kitchen_sink.ClientSequence + (*ClientActionSet)(nil), // 6: temporal.omes.kitchen_sink.ClientActionSet + (*ClientAction)(nil), // 7: temporal.omes.kitchen_sink.ClientAction + (*DoSignal)(nil), // 8: temporal.omes.kitchen_sink.DoSignal + (*DoQuery)(nil), // 9: temporal.omes.kitchen_sink.DoQuery + (*DoUpdate)(nil), // 10: temporal.omes.kitchen_sink.DoUpdate + (*DoActionsUpdate)(nil), // 11: temporal.omes.kitchen_sink.DoActionsUpdate + (*HandlerInvocation)(nil), // 12: temporal.omes.kitchen_sink.HandlerInvocation + (*WorkflowState)(nil), // 13: temporal.omes.kitchen_sink.WorkflowState + (*WorkflowInput)(nil), // 14: temporal.omes.kitchen_sink.WorkflowInput + (*ActionSet)(nil), // 15: temporal.omes.kitchen_sink.ActionSet + (*Action)(nil), // 16: temporal.omes.kitchen_sink.Action + (*AwaitableChoice)(nil), // 17: temporal.omes.kitchen_sink.AwaitableChoice + (*TimerAction)(nil), // 18: temporal.omes.kitchen_sink.TimerAction + (*ExecuteActivityAction)(nil), // 19: temporal.omes.kitchen_sink.ExecuteActivityAction + (*ExecuteChildWorkflowAction)(nil), // 20: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction + (*AwaitWorkflowState)(nil), // 21: temporal.omes.kitchen_sink.AwaitWorkflowState + (*SendSignalAction)(nil), // 22: temporal.omes.kitchen_sink.SendSignalAction + (*CancelWorkflowAction)(nil), // 23: temporal.omes.kitchen_sink.CancelWorkflowAction + (*SetPatchMarkerAction)(nil), // 24: temporal.omes.kitchen_sink.SetPatchMarkerAction + (*UpsertSearchAttributesAction)(nil), // 25: temporal.omes.kitchen_sink.UpsertSearchAttributesAction + (*UpsertMemoAction)(nil), // 26: temporal.omes.kitchen_sink.UpsertMemoAction + (*ReturnResultAction)(nil), // 27: temporal.omes.kitchen_sink.ReturnResultAction + (*ReturnErrorAction)(nil), // 28: temporal.omes.kitchen_sink.ReturnErrorAction + (*ContinueAsNewAction)(nil), // 29: temporal.omes.kitchen_sink.ContinueAsNewAction + (*RemoteActivityOptions)(nil), // 30: temporal.omes.kitchen_sink.RemoteActivityOptions + (*DoSignal_DoSignalActions)(nil), // 31: temporal.omes.kitchen_sink.DoSignal.DoSignalActions + nil, // 32: temporal.omes.kitchen_sink.WorkflowState.KvsEntry + (*ExecuteActivityAction_GenericActivity)(nil), // 33: temporal.omes.kitchen_sink.ExecuteActivityAction.GenericActivity + nil, // 34: temporal.omes.kitchen_sink.ExecuteActivityAction.HeadersEntry + nil, // 35: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.HeadersEntry + nil, // 36: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.MemoEntry + nil, // 37: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.SearchAttributesEntry + nil, // 38: temporal.omes.kitchen_sink.SendSignalAction.HeadersEntry + nil, // 39: temporal.omes.kitchen_sink.UpsertSearchAttributesAction.SearchAttributesEntry + nil, // 40: temporal.omes.kitchen_sink.ContinueAsNewAction.MemoEntry + nil, // 41: temporal.omes.kitchen_sink.ContinueAsNewAction.HeadersEntry + nil, // 42: temporal.omes.kitchen_sink.ContinueAsNewAction.SearchAttributesEntry + (*durationpb.Duration)(nil), // 43: google.protobuf.Duration + (*v1.Payloads)(nil), // 44: temporal.api.common.v1.Payloads + (*emptypb.Empty)(nil), // 45: google.protobuf.Empty + (*v1.Payload)(nil), // 46: temporal.api.common.v1.Payload + (*v1.RetryPolicy)(nil), // 47: temporal.api.common.v1.RetryPolicy + (v11.WorkflowIdReusePolicy)(0), // 48: temporal.api.enums.v1.WorkflowIdReusePolicy + (*v1.Memo)(nil), // 49: temporal.api.common.v1.Memo + (*v12.Failure)(nil), // 50: temporal.api.failure.v1.Failure } var file_kitchen_sink_proto_depIdxs = []int32{ 14, // 0: temporal.omes.kitchen_sink.TestInput.workflow_input:type_name -> temporal.omes.kitchen_sink.WorkflowInput 5, // 1: temporal.omes.kitchen_sink.TestInput.client_sequence:type_name -> temporal.omes.kitchen_sink.ClientSequence 6, // 2: temporal.omes.kitchen_sink.ClientSequence.action_sets:type_name -> temporal.omes.kitchen_sink.ClientActionSet 7, // 3: temporal.omes.kitchen_sink.ClientActionSet.actions:type_name -> temporal.omes.kitchen_sink.ClientAction - 42, // 4: temporal.omes.kitchen_sink.ClientActionSet.wait_at_end:type_name -> google.protobuf.Duration + 43, // 4: temporal.omes.kitchen_sink.ClientActionSet.wait_at_end:type_name -> google.protobuf.Duration 8, // 5: temporal.omes.kitchen_sink.ClientAction.do_signal:type_name -> temporal.omes.kitchen_sink.DoSignal 9, // 6: temporal.omes.kitchen_sink.ClientAction.do_query:type_name -> temporal.omes.kitchen_sink.DoQuery 10, // 7: temporal.omes.kitchen_sink.ClientAction.do_update:type_name -> temporal.omes.kitchen_sink.DoUpdate 6, // 8: temporal.omes.kitchen_sink.ClientAction.nested_actions:type_name -> temporal.omes.kitchen_sink.ClientActionSet 31, // 9: temporal.omes.kitchen_sink.DoSignal.do_signal_actions:type_name -> temporal.omes.kitchen_sink.DoSignal.DoSignalActions 12, // 10: temporal.omes.kitchen_sink.DoSignal.custom:type_name -> temporal.omes.kitchen_sink.HandlerInvocation - 43, // 11: temporal.omes.kitchen_sink.DoQuery.report_state:type_name -> temporal.api.common.v1.Payloads + 44, // 11: temporal.omes.kitchen_sink.DoQuery.report_state:type_name -> temporal.api.common.v1.Payloads 12, // 12: temporal.omes.kitchen_sink.DoQuery.custom:type_name -> temporal.omes.kitchen_sink.HandlerInvocation 11, // 13: temporal.omes.kitchen_sink.DoUpdate.do_actions:type_name -> temporal.omes.kitchen_sink.DoActionsUpdate 12, // 14: temporal.omes.kitchen_sink.DoUpdate.custom:type_name -> temporal.omes.kitchen_sink.HandlerInvocation 15, // 15: temporal.omes.kitchen_sink.DoActionsUpdate.do_actions:type_name -> temporal.omes.kitchen_sink.ActionSet - 44, // 16: temporal.omes.kitchen_sink.DoActionsUpdate.reject_me:type_name -> google.protobuf.Empty - 45, // 17: temporal.omes.kitchen_sink.HandlerInvocation.args:type_name -> temporal.api.common.v1.Payload + 45, // 16: temporal.omes.kitchen_sink.DoActionsUpdate.reject_me:type_name -> google.protobuf.Empty + 46, // 17: temporal.omes.kitchen_sink.HandlerInvocation.args:type_name -> temporal.api.common.v1.Payload 32, // 18: temporal.omes.kitchen_sink.WorkflowState.kvs:type_name -> temporal.omes.kitchen_sink.WorkflowState.KvsEntry 15, // 19: temporal.omes.kitchen_sink.WorkflowInput.initial_actions:type_name -> temporal.omes.kitchen_sink.ActionSet 16, // 20: temporal.omes.kitchen_sink.ActionSet.actions:type_name -> temporal.omes.kitchen_sink.Action @@ -3378,68 +3503,72 @@ var file_kitchen_sink_proto_depIdxs = []int32{ 28, // 32: temporal.omes.kitchen_sink.Action.return_error:type_name -> temporal.omes.kitchen_sink.ReturnErrorAction 29, // 33: temporal.omes.kitchen_sink.Action.continue_as_new:type_name -> temporal.omes.kitchen_sink.ContinueAsNewAction 15, // 34: temporal.omes.kitchen_sink.Action.nested_action_set:type_name -> temporal.omes.kitchen_sink.ActionSet - 44, // 35: temporal.omes.kitchen_sink.AwaitableChoice.wait_finish:type_name -> google.protobuf.Empty - 44, // 36: temporal.omes.kitchen_sink.AwaitableChoice.abandon:type_name -> google.protobuf.Empty - 44, // 37: temporal.omes.kitchen_sink.AwaitableChoice.cancel_before_started:type_name -> google.protobuf.Empty - 44, // 38: temporal.omes.kitchen_sink.AwaitableChoice.cancel_after_started:type_name -> google.protobuf.Empty - 44, // 39: temporal.omes.kitchen_sink.AwaitableChoice.cancel_after_completed:type_name -> google.protobuf.Empty + 45, // 35: temporal.omes.kitchen_sink.AwaitableChoice.wait_finish:type_name -> google.protobuf.Empty + 45, // 36: temporal.omes.kitchen_sink.AwaitableChoice.abandon:type_name -> google.protobuf.Empty + 45, // 37: temporal.omes.kitchen_sink.AwaitableChoice.cancel_before_started:type_name -> google.protobuf.Empty + 45, // 38: temporal.omes.kitchen_sink.AwaitableChoice.cancel_after_started:type_name -> google.protobuf.Empty + 45, // 39: temporal.omes.kitchen_sink.AwaitableChoice.cancel_after_completed:type_name -> google.protobuf.Empty 17, // 40: temporal.omes.kitchen_sink.TimerAction.awaitable_choice:type_name -> temporal.omes.kitchen_sink.AwaitableChoice - 33, // 41: temporal.omes.kitchen_sink.ExecuteActivityAction.headers:type_name -> temporal.omes.kitchen_sink.ExecuteActivityAction.HeadersEntry - 45, // 42: temporal.omes.kitchen_sink.ExecuteActivityAction.arguments:type_name -> temporal.api.common.v1.Payload - 42, // 43: temporal.omes.kitchen_sink.ExecuteActivityAction.schedule_to_close_timeout:type_name -> google.protobuf.Duration - 42, // 44: temporal.omes.kitchen_sink.ExecuteActivityAction.schedule_to_start_timeout:type_name -> google.protobuf.Duration - 42, // 45: temporal.omes.kitchen_sink.ExecuteActivityAction.start_to_close_timeout:type_name -> google.protobuf.Duration - 42, // 46: temporal.omes.kitchen_sink.ExecuteActivityAction.heartbeat_timeout:type_name -> google.protobuf.Duration - 46, // 47: temporal.omes.kitchen_sink.ExecuteActivityAction.retry_policy:type_name -> temporal.api.common.v1.RetryPolicy - 44, // 48: temporal.omes.kitchen_sink.ExecuteActivityAction.is_local:type_name -> google.protobuf.Empty - 30, // 49: temporal.omes.kitchen_sink.ExecuteActivityAction.remote:type_name -> temporal.omes.kitchen_sink.RemoteActivityOptions - 17, // 50: temporal.omes.kitchen_sink.ExecuteActivityAction.awaitable_choice:type_name -> temporal.omes.kitchen_sink.AwaitableChoice - 45, // 51: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.input:type_name -> temporal.api.common.v1.Payload - 42, // 52: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.workflow_execution_timeout:type_name -> google.protobuf.Duration - 42, // 53: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.workflow_run_timeout:type_name -> google.protobuf.Duration - 42, // 54: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.workflow_task_timeout:type_name -> google.protobuf.Duration - 0, // 55: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.parent_close_policy:type_name -> temporal.omes.kitchen_sink.ParentClosePolicy - 47, // 56: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.workflow_id_reuse_policy:type_name -> temporal.api.enums.v1.WorkflowIdReusePolicy - 46, // 57: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.retry_policy:type_name -> temporal.api.common.v1.RetryPolicy - 34, // 58: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.headers:type_name -> temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.HeadersEntry - 35, // 59: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.memo:type_name -> temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.MemoEntry - 36, // 60: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.search_attributes:type_name -> temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.SearchAttributesEntry - 2, // 61: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.cancellation_type:type_name -> temporal.omes.kitchen_sink.ChildWorkflowCancellationType - 1, // 62: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.versioning_intent:type_name -> temporal.omes.kitchen_sink.VersioningIntent - 17, // 63: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.awaitable_choice:type_name -> temporal.omes.kitchen_sink.AwaitableChoice - 45, // 64: temporal.omes.kitchen_sink.SendSignalAction.args:type_name -> temporal.api.common.v1.Payload - 37, // 65: temporal.omes.kitchen_sink.SendSignalAction.headers:type_name -> temporal.omes.kitchen_sink.SendSignalAction.HeadersEntry - 17, // 66: temporal.omes.kitchen_sink.SendSignalAction.awaitable_choice:type_name -> temporal.omes.kitchen_sink.AwaitableChoice - 38, // 67: temporal.omes.kitchen_sink.UpsertSearchAttributesAction.search_attributes:type_name -> temporal.omes.kitchen_sink.UpsertSearchAttributesAction.SearchAttributesEntry - 48, // 68: temporal.omes.kitchen_sink.UpsertMemoAction.upserted_memo:type_name -> temporal.api.common.v1.Memo - 45, // 69: temporal.omes.kitchen_sink.ReturnResultAction.return_this:type_name -> temporal.api.common.v1.Payload - 49, // 70: temporal.omes.kitchen_sink.ReturnErrorAction.failure:type_name -> temporal.api.failure.v1.Failure - 45, // 71: temporal.omes.kitchen_sink.ContinueAsNewAction.arguments:type_name -> temporal.api.common.v1.Payload - 42, // 72: temporal.omes.kitchen_sink.ContinueAsNewAction.workflow_run_timeout:type_name -> google.protobuf.Duration - 42, // 73: temporal.omes.kitchen_sink.ContinueAsNewAction.workflow_task_timeout:type_name -> google.protobuf.Duration - 39, // 74: temporal.omes.kitchen_sink.ContinueAsNewAction.memo:type_name -> temporal.omes.kitchen_sink.ContinueAsNewAction.MemoEntry - 40, // 75: temporal.omes.kitchen_sink.ContinueAsNewAction.headers:type_name -> temporal.omes.kitchen_sink.ContinueAsNewAction.HeadersEntry - 41, // 76: temporal.omes.kitchen_sink.ContinueAsNewAction.search_attributes:type_name -> temporal.omes.kitchen_sink.ContinueAsNewAction.SearchAttributesEntry - 46, // 77: temporal.omes.kitchen_sink.ContinueAsNewAction.retry_policy:type_name -> temporal.api.common.v1.RetryPolicy - 1, // 78: temporal.omes.kitchen_sink.ContinueAsNewAction.versioning_intent:type_name -> temporal.omes.kitchen_sink.VersioningIntent - 3, // 79: temporal.omes.kitchen_sink.RemoteActivityOptions.cancellation_type:type_name -> temporal.omes.kitchen_sink.ActivityCancellationType - 1, // 80: temporal.omes.kitchen_sink.RemoteActivityOptions.versioning_intent:type_name -> temporal.omes.kitchen_sink.VersioningIntent - 15, // 81: temporal.omes.kitchen_sink.DoSignal.DoSignalActions.do_actions:type_name -> temporal.omes.kitchen_sink.ActionSet - 15, // 82: temporal.omes.kitchen_sink.DoSignal.DoSignalActions.do_actions_in_main:type_name -> temporal.omes.kitchen_sink.ActionSet - 45, // 83: temporal.omes.kitchen_sink.ExecuteActivityAction.HeadersEntry.value:type_name -> temporal.api.common.v1.Payload - 45, // 84: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.HeadersEntry.value:type_name -> temporal.api.common.v1.Payload - 45, // 85: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.MemoEntry.value:type_name -> temporal.api.common.v1.Payload - 45, // 86: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.SearchAttributesEntry.value:type_name -> temporal.api.common.v1.Payload - 45, // 87: temporal.omes.kitchen_sink.SendSignalAction.HeadersEntry.value:type_name -> temporal.api.common.v1.Payload - 45, // 88: temporal.omes.kitchen_sink.UpsertSearchAttributesAction.SearchAttributesEntry.value:type_name -> temporal.api.common.v1.Payload - 45, // 89: temporal.omes.kitchen_sink.ContinueAsNewAction.MemoEntry.value:type_name -> temporal.api.common.v1.Payload - 45, // 90: temporal.omes.kitchen_sink.ContinueAsNewAction.HeadersEntry.value:type_name -> temporal.api.common.v1.Payload - 45, // 91: temporal.omes.kitchen_sink.ContinueAsNewAction.SearchAttributesEntry.value:type_name -> temporal.api.common.v1.Payload - 92, // [92:92] is the sub-list for method output_type - 92, // [92:92] is the sub-list for method input_type - 92, // [92:92] is the sub-list for extension type_name - 92, // [92:92] is the sub-list for extension extendee - 0, // [0:92] is the sub-list for field type_name + 33, // 41: temporal.omes.kitchen_sink.ExecuteActivityAction.generic:type_name -> temporal.omes.kitchen_sink.ExecuteActivityAction.GenericActivity + 43, // 42: temporal.omes.kitchen_sink.ExecuteActivityAction.delay:type_name -> google.protobuf.Duration + 45, // 43: temporal.omes.kitchen_sink.ExecuteActivityAction.noop:type_name -> google.protobuf.Empty + 34, // 44: temporal.omes.kitchen_sink.ExecuteActivityAction.headers:type_name -> temporal.omes.kitchen_sink.ExecuteActivityAction.HeadersEntry + 43, // 45: temporal.omes.kitchen_sink.ExecuteActivityAction.schedule_to_close_timeout:type_name -> google.protobuf.Duration + 43, // 46: temporal.omes.kitchen_sink.ExecuteActivityAction.schedule_to_start_timeout:type_name -> google.protobuf.Duration + 43, // 47: temporal.omes.kitchen_sink.ExecuteActivityAction.start_to_close_timeout:type_name -> google.protobuf.Duration + 43, // 48: temporal.omes.kitchen_sink.ExecuteActivityAction.heartbeat_timeout:type_name -> google.protobuf.Duration + 47, // 49: temporal.omes.kitchen_sink.ExecuteActivityAction.retry_policy:type_name -> temporal.api.common.v1.RetryPolicy + 45, // 50: temporal.omes.kitchen_sink.ExecuteActivityAction.is_local:type_name -> google.protobuf.Empty + 30, // 51: temporal.omes.kitchen_sink.ExecuteActivityAction.remote:type_name -> temporal.omes.kitchen_sink.RemoteActivityOptions + 17, // 52: temporal.omes.kitchen_sink.ExecuteActivityAction.awaitable_choice:type_name -> temporal.omes.kitchen_sink.AwaitableChoice + 46, // 53: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.input:type_name -> temporal.api.common.v1.Payload + 43, // 54: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.workflow_execution_timeout:type_name -> google.protobuf.Duration + 43, // 55: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.workflow_run_timeout:type_name -> google.protobuf.Duration + 43, // 56: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.workflow_task_timeout:type_name -> google.protobuf.Duration + 0, // 57: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.parent_close_policy:type_name -> temporal.omes.kitchen_sink.ParentClosePolicy + 48, // 58: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.workflow_id_reuse_policy:type_name -> temporal.api.enums.v1.WorkflowIdReusePolicy + 47, // 59: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.retry_policy:type_name -> temporal.api.common.v1.RetryPolicy + 35, // 60: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.headers:type_name -> temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.HeadersEntry + 36, // 61: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.memo:type_name -> temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.MemoEntry + 37, // 62: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.search_attributes:type_name -> temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.SearchAttributesEntry + 2, // 63: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.cancellation_type:type_name -> temporal.omes.kitchen_sink.ChildWorkflowCancellationType + 1, // 64: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.versioning_intent:type_name -> temporal.omes.kitchen_sink.VersioningIntent + 17, // 65: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.awaitable_choice:type_name -> temporal.omes.kitchen_sink.AwaitableChoice + 46, // 66: temporal.omes.kitchen_sink.SendSignalAction.args:type_name -> temporal.api.common.v1.Payload + 38, // 67: temporal.omes.kitchen_sink.SendSignalAction.headers:type_name -> temporal.omes.kitchen_sink.SendSignalAction.HeadersEntry + 17, // 68: temporal.omes.kitchen_sink.SendSignalAction.awaitable_choice:type_name -> temporal.omes.kitchen_sink.AwaitableChoice + 16, // 69: temporal.omes.kitchen_sink.SetPatchMarkerAction.inner_action:type_name -> temporal.omes.kitchen_sink.Action + 39, // 70: temporal.omes.kitchen_sink.UpsertSearchAttributesAction.search_attributes:type_name -> temporal.omes.kitchen_sink.UpsertSearchAttributesAction.SearchAttributesEntry + 49, // 71: temporal.omes.kitchen_sink.UpsertMemoAction.upserted_memo:type_name -> temporal.api.common.v1.Memo + 46, // 72: temporal.omes.kitchen_sink.ReturnResultAction.return_this:type_name -> temporal.api.common.v1.Payload + 50, // 73: temporal.omes.kitchen_sink.ReturnErrorAction.failure:type_name -> temporal.api.failure.v1.Failure + 46, // 74: temporal.omes.kitchen_sink.ContinueAsNewAction.arguments:type_name -> temporal.api.common.v1.Payload + 43, // 75: temporal.omes.kitchen_sink.ContinueAsNewAction.workflow_run_timeout:type_name -> google.protobuf.Duration + 43, // 76: temporal.omes.kitchen_sink.ContinueAsNewAction.workflow_task_timeout:type_name -> google.protobuf.Duration + 40, // 77: temporal.omes.kitchen_sink.ContinueAsNewAction.memo:type_name -> temporal.omes.kitchen_sink.ContinueAsNewAction.MemoEntry + 41, // 78: temporal.omes.kitchen_sink.ContinueAsNewAction.headers:type_name -> temporal.omes.kitchen_sink.ContinueAsNewAction.HeadersEntry + 42, // 79: temporal.omes.kitchen_sink.ContinueAsNewAction.search_attributes:type_name -> temporal.omes.kitchen_sink.ContinueAsNewAction.SearchAttributesEntry + 47, // 80: temporal.omes.kitchen_sink.ContinueAsNewAction.retry_policy:type_name -> temporal.api.common.v1.RetryPolicy + 1, // 81: temporal.omes.kitchen_sink.ContinueAsNewAction.versioning_intent:type_name -> temporal.omes.kitchen_sink.VersioningIntent + 3, // 82: temporal.omes.kitchen_sink.RemoteActivityOptions.cancellation_type:type_name -> temporal.omes.kitchen_sink.ActivityCancellationType + 1, // 83: temporal.omes.kitchen_sink.RemoteActivityOptions.versioning_intent:type_name -> temporal.omes.kitchen_sink.VersioningIntent + 15, // 84: temporal.omes.kitchen_sink.DoSignal.DoSignalActions.do_actions:type_name -> temporal.omes.kitchen_sink.ActionSet + 15, // 85: temporal.omes.kitchen_sink.DoSignal.DoSignalActions.do_actions_in_main:type_name -> temporal.omes.kitchen_sink.ActionSet + 46, // 86: temporal.omes.kitchen_sink.ExecuteActivityAction.GenericActivity.arguments:type_name -> temporal.api.common.v1.Payload + 46, // 87: temporal.omes.kitchen_sink.ExecuteActivityAction.HeadersEntry.value:type_name -> temporal.api.common.v1.Payload + 46, // 88: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.HeadersEntry.value:type_name -> temporal.api.common.v1.Payload + 46, // 89: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.MemoEntry.value:type_name -> temporal.api.common.v1.Payload + 46, // 90: temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.SearchAttributesEntry.value:type_name -> temporal.api.common.v1.Payload + 46, // 91: temporal.omes.kitchen_sink.SendSignalAction.HeadersEntry.value:type_name -> temporal.api.common.v1.Payload + 46, // 92: temporal.omes.kitchen_sink.UpsertSearchAttributesAction.SearchAttributesEntry.value:type_name -> temporal.api.common.v1.Payload + 46, // 93: temporal.omes.kitchen_sink.ContinueAsNewAction.MemoEntry.value:type_name -> temporal.api.common.v1.Payload + 46, // 94: temporal.omes.kitchen_sink.ContinueAsNewAction.HeadersEntry.value:type_name -> temporal.api.common.v1.Payload + 46, // 95: temporal.omes.kitchen_sink.ContinueAsNewAction.SearchAttributesEntry.value:type_name -> temporal.api.common.v1.Payload + 96, // [96:96] is the sub-list for method output_type + 96, // [96:96] is the sub-list for method input_type + 96, // [96:96] is the sub-list for extension type_name + 96, // [96:96] is the sub-list for extension extendee + 0, // [0:96] is the sub-list for field type_name } func init() { file_kitchen_sink_proto_init() } @@ -3784,6 +3913,18 @@ func file_kitchen_sink_proto_init() { return nil } } + file_kitchen_sink_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecuteActivityAction_GenericActivity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_kitchen_sink_proto_msgTypes[3].OneofWrappers = []interface{}{ (*ClientAction_DoSignal)(nil), @@ -3831,6 +3972,9 @@ func file_kitchen_sink_proto_init() { (*AwaitableChoice_CancelAfterCompleted)(nil), } file_kitchen_sink_proto_msgTypes[15].OneofWrappers = []interface{}{ + (*ExecuteActivityAction_Generic)(nil), + (*ExecuteActivityAction_Delay)(nil), + (*ExecuteActivityAction_Noop)(nil), (*ExecuteActivityAction_IsLocal)(nil), (*ExecuteActivityAction_Remote)(nil), } @@ -3844,7 +3988,7 @@ func file_kitchen_sink_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_kitchen_sink_proto_rawDesc, NumEnums: 4, - NumMessages: 38, + NumMessages: 39, NumExtensions: 0, NumServices: 0, }, diff --git a/loadgen/scenario.go b/loadgen/scenario.go index b9272ae..baa782b 100644 --- a/loadgen/scenario.go +++ b/loadgen/scenario.go @@ -3,6 +3,8 @@ package loadgen import ( "context" "fmt" + "go.temporal.io/api/enums/v1" + "go.temporal.io/api/operatorservice/v1" "path/filepath" "runtime" "strconv" @@ -186,6 +188,18 @@ func (r *Run) ExecuteKitchenSinkWorkflow(ctx context.Context, options *KitchenSi return fmt.Errorf("failed to start kitchen sink workflow: %w", err) } + // Ensure custom search attributes are registered + _, err = r.Client.OperatorService().AddSearchAttributes(ctx, &operatorservice.AddSearchAttributesRequest{ + SearchAttributes: map[string]enums.IndexedValueType{ + "KS_Keyword": enums.INDEXED_VALUE_TYPE_KEYWORD, + "KS_Int": enums.INDEXED_VALUE_TYPE_INT, + }, + Namespace: r.Namespace, + }) + if err != nil && !strings.Contains(err.Error(), "already exists") { + return fmt.Errorf("failed to register search attributes: %w", err) + } + clientSeq := options.Params.ClientSequence cancelCtx, cancel := context.WithCancel(ctx) defer cancel() diff --git a/scenarios/workflow_with_many_actions.go b/scenarios/workflow_with_many_actions.go index e1f3930..61fa753 100644 --- a/scenarios/workflow_with_many_actions.go +++ b/scenarios/workflow_with_many_actions.go @@ -62,7 +62,7 @@ func init() { actionSet.Actions = append(actionSet.Actions, &kitchensink.Action{ Variant: &kitchensink.Action_ExecActivity{ ExecActivity: &kitchensink.ExecuteActivityAction{ - ActivityType: "noop", + ActivityType: &kitchensink.ExecuteActivityAction_Noop{}, StartToCloseTimeout: &durationpb.Duration{Seconds: 5}, }, }, diff --git a/workers/go/kitchensink/kitchen_sink.go b/workers/go/kitchensink/kitchen_sink.go index 2934d74..95f5351 100644 --- a/workers/go/kitchensink/kitchen_sink.go +++ b/workers/go/kitchensink/kitchen_sink.go @@ -2,6 +2,7 @@ package kitchensink import ( "context" + "errors" "fmt" "time" @@ -11,23 +12,29 @@ import ( "go.temporal.io/sdk/workflow" ) +type KSWorkflowState struct { + workflowState *kitchensink.WorkflowState +} + func KitchenSinkWorkflow(ctx workflow.Context, params *kitchensink.WorkflowInput) (*common.Payload, error) { workflow.GetLogger(ctx).Debug("Started kitchen sink workflow") - workflowState := &kitchensink.WorkflowState{} + state := KSWorkflowState{ + workflowState: &kitchensink.WorkflowState{}, + } queryErr := workflow.SetQueryHandler(ctx, "report_state", func(input interface{}) (*kitchensink.WorkflowState, error) { - return workflowState, nil + return state.workflowState, nil }) if queryErr != nil { return nil, queryErr } // Handle initial set - if params.InitialActions != nil { + if params != nil && params.InitialActions != nil { for _, actionSet := range params.InitialActions { - if ret, err := handleActionSet(ctx, actionSet); ret != nil || err != nil { - workflow.GetLogger(ctx).Warn("Finishing early", "ret", ret, "err", err) + if ret, err := state.handleActionSet(ctx, actionSet); ret != nil || err != nil { + workflow.GetLogger(ctx).Info("Finishing early", "ret", ret, "err", err) return ret, err } } @@ -45,7 +52,7 @@ func KitchenSinkWorkflow(ctx workflow.Context, params *kitchensink.WorkflowInput actionSet = sigActions.GetDoActions() } workflow.Go(ctx, func(ctx workflow.Context) { - ret, err := handleActionSet(ctx, actionSet) + ret, err := state.handleActionSet(ctx, actionSet) if ret != nil || err != nil { retOrErrChan.Send(ctx, ReturnOrErr{ret, err}) } @@ -55,19 +62,19 @@ func KitchenSinkWorkflow(ctx workflow.Context, params *kitchensink.WorkflowInput for { var retOrErr ReturnOrErr retOrErrChan.Receive(ctx, &retOrErr) - workflow.GetLogger(ctx).Warn("Finishing workflow", "retOrErr", retOrErr) + workflow.GetLogger(ctx).Info("Finishing workflow", "retOrErr", retOrErr) return retOrErr.retme, retOrErr.err } } -func handleActionSet( +func (ws *KSWorkflowState) handleActionSet( ctx workflow.Context, set *kitchensink.ActionSet, ) (returnValue *common.Payload, err error) { // If these are non-concurrent, just execute and return if requested if !set.Concurrent { for _, action := range set.Actions { - if returnValue, err = handleAction(ctx, action); returnValue != nil || err != nil { + if returnValue, err = ws.handleAction(ctx, action); returnValue != nil || err != nil { return } } @@ -79,7 +86,7 @@ func handleActionSet( for _, action := range set.Actions { action := action workflow.Go(ctx, func(ctx workflow.Context) { - if maybeReturnValue, maybeErr := handleAction(ctx, action); maybeReturnValue != nil || maybeErr != nil { + if maybeReturnValue, maybeErr := ws.handleAction(ctx, action); maybeReturnValue != nil || maybeErr != nil { returnValue, err = maybeReturnValue, maybeErr } actionsCompleted++ @@ -94,10 +101,10 @@ func handleActionSet( return } -func handleAction( +func (ws *KSWorkflowState) handleAction( ctx workflow.Context, action *kitchensink.Action, -) (returnValue *common.Payload, err error) { +) (*common.Payload, error) { if rr := action.GetReturnResult(); rr != nil { return rr.ReturnThis, nil } else if re := action.GetReturnError(); re != nil { @@ -105,9 +112,14 @@ func handleAction( } else if can := action.GetContinueAsNew(); can != nil { return nil, workflow.NewContinueAsNewError(ctx, KitchenSinkWorkflow, can.Arguments) } else if timer := action.GetTimer(); timer != nil { - if err := workflow.Sleep(ctx, time.Duration(timer.Milliseconds)*time.Millisecond); err != nil { - return nil, err - } + return nil, withAwaitableChoice(ctx, func(ctx workflow.Context) workflow.Future { + fut, setter := workflow.NewFuture(ctx) + workflow.Go(ctx, func(ctx workflow.Context) { + _ = workflow.Sleep(ctx, time.Duration(timer.Milliseconds)*time.Millisecond) + setter.Set(struct{}{}, nil) + }) + return fut + }, timer.AwaitableChoice) } else if act := action.GetExecActivity(); act != nil { return nil, launchActivity(ctx, action.GetExecActivity()) } else if child := action.GetExecChildWorkflow(); child != nil { @@ -116,10 +128,47 @@ func handleAction( if child.WorkflowType != "" { childType = child.WorkflowType } - err := workflow.ExecuteChildWorkflow(ctx, childType, child.GetInput()).Get(ctx, nil) + err := withAwaitableChoiceCustom(ctx, func(ctx workflow.Context) workflow.ChildWorkflowFuture { + return workflow.ExecuteChildWorkflow(ctx, childType, child.GetInput()[0]) + }, child.AwaitableChoice, + func(ctx workflow.Context, fut workflow.ChildWorkflowFuture) error { + return fut.GetChildWorkflowExecution().Get(ctx, nil) + }, + func(ctx workflow.Context, fut workflow.ChildWorkflowFuture) error { + return fut.Get(ctx, nil) + }, + ) + return nil, err + } else if patch := action.GetSetPatchMarker(); patch != nil { + if workflow.GetVersion(ctx, patch.GetPatchId(), workflow.DefaultVersion, 1) == 1 { + return ws.handleAction(ctx, patch.GetInnerAction()) + } + } else if setWfState := action.GetSetWorkflowState(); setWfState != nil { + ws.workflowState = setWfState + } else if awaitState := action.GetAwaitWorkflowState(); awaitState != nil { + err := workflow.Await(ctx, func() bool { + if val, ok := ws.workflowState.Kvs[awaitState.Key]; ok { + return val == awaitState.Value + } + return false + }) + return nil, err + } else if upsertMemo := action.GetUpsertMemo(); upsertMemo != nil { + convertedMap := make(map[string]interface{}, len(upsertMemo.GetUpsertedMemo().Fields)) + for k, v := range upsertMemo.GetUpsertedMemo().Fields { + convertedMap[k] = v + } + err := workflow.UpsertMemo(ctx, convertedMap) + return nil, err + } else if upsertSA := action.GetUpsertSearchAttributes(); upsertSA != nil { + convertedMap := make(map[string]interface{}, len(upsertSA.GetSearchAttributes())) + for k, v := range upsertSA.GetSearchAttributes() { + convertedMap[k] = v + } + err := workflow.UpsertSearchAttributes(ctx, convertedMap) return nil, err } else if action.GetNestedActionSet() != nil { - return handleActionSet(ctx, action.GetNestedActionSet()) + return ws.handleActionSet(ctx, action.GetNestedActionSet()) } else { return nil, fmt.Errorf("unrecognized action") } @@ -127,6 +176,12 @@ func handleAction( } func launchActivity(ctx workflow.Context, act *kitchensink.ExecuteActivityAction) error { + actType := "noop" + args := make([]interface{}, 0) + if delay := act.GetDelay(); delay != nil { + actType = "delay" + args = append(args, delay.AsDuration()) + } if act.GetIsLocal() != nil { opts := workflow.LocalActivityOptions{ ScheduleToCloseTimeout: act.ScheduleToCloseTimeout.AsDuration(), @@ -134,7 +189,10 @@ func launchActivity(ctx workflow.Context, act *kitchensink.ExecuteActivityAction RetryPolicy: convertFromPBRetryPolicy(act.GetRetryPolicy()), } actCtx := workflow.WithLocalActivityOptions(ctx, opts) - return workflow.ExecuteLocalActivity(actCtx, act.ActivityType, act.Arguments).Get(actCtx, nil) + + return withAwaitableChoice(actCtx, func(ctx workflow.Context) workflow.Future { + return workflow.ExecuteLocalActivity(ctx, actType, args...) + }, act.GetAwaitableChoice()) } else { waitForCancel := false if remote := act.GetRemote(); remote != nil { @@ -152,15 +210,80 @@ func launchActivity(ctx workflow.Context, act *kitchensink.ExecuteActivityAction RetryPolicy: convertFromPBRetryPolicy(act.GetRetryPolicy()), } actCtx := workflow.WithActivityOptions(ctx, opts) - return workflow.ExecuteActivity(actCtx, act.ActivityType, act.Arguments).Get(actCtx, nil) + return withAwaitableChoice(actCtx, func(ctx workflow.Context) workflow.Future { + return workflow.ExecuteActivity(ctx, actType, args...) + }, act.GetAwaitableChoice()) } } +func withAwaitableChoice[F workflow.Future]( + ctx workflow.Context, + starter func(workflow.Context) F, + awaitChoice *kitchensink.AwaitableChoice, +) error { + return withAwaitableChoiceCustom(ctx, starter, awaitChoice, + func(ctx workflow.Context, fut F) error { + _ = workflow.Sleep(ctx, 1) + return nil + }, + func(ctx workflow.Context, fut F) error { + return fut.Get(ctx, nil) + }) +} + +func withAwaitableChoiceCustom[F workflow.Future]( + ctx workflow.Context, + starter func(workflow.Context) F, + awaitChoice *kitchensink.AwaitableChoice, + afterStartedWaiter func(workflow.Context, F) error, + afterCompletedWaiter func(workflow.Context, F) error, +) error { + cancelCtx, cancel := workflow.WithCancel(ctx) + fut := starter(cancelCtx) + var err error + didCancel := false + if awaitChoice.GetAbandon() != nil { + return nil + } else if awaitChoice.GetCancelBeforeStarted() != nil { + cancel() + didCancel = true + err = fut.Get(ctx, nil) + } else if awaitChoice.GetCancelAfterStarted() != nil { + err = afterStartedWaiter(ctx, fut) + if err != nil { + return err + } + cancel() + didCancel = true + err = fut.Get(ctx, nil) + } else if awaitChoice.GetCancelAfterCompleted() != nil { + res := afterCompletedWaiter(ctx, fut) + cancel() + err = res + } else { + err = fut.Get(ctx, nil) + } + + // If we intentionally cancelled we want to swallow the cancel error to avoid bombing out the + // whole workflow + var canceledErr *temporal.CanceledError + if didCancel && errors.As(err, &canceledErr) { + err = nil + } + return err +} + // Noop is used as a no-op activity func Noop(_ context.Context, _ []*common.Payload) error { return nil } +// Delay runs for the provided delay period +func Delay(_ context.Context, delayFor time.Duration) error { + time.Sleep(delayFor) + return nil +} + func convertFromPBRetryPolicy(retryPolicy *common.RetryPolicy) *temporal.RetryPolicy { if retryPolicy == nil { return nil diff --git a/workers/go/worker/worker.go b/workers/go/worker/worker.go index cfb3530..01999c1 100644 --- a/workers/go/worker/worker.go +++ b/workers/go/worker/worker.go @@ -68,6 +68,7 @@ func runWorkers(client client.Client, taskQueues []string, options cmdoptions.Wo }) w.RegisterWorkflowWithOptions(kitchensink.KitchenSinkWorkflow, workflow.RegisterOptions{Name: "kitchenSink"}) w.RegisterActivityWithOptions(kitchensink.Noop, activity.RegisterOptions{Name: "noop"}) + w.RegisterActivityWithOptions(kitchensink.Delay, activity.RegisterOptions{Name: "delay"}) w.RegisterWorkflowWithOptions(throughputstress.ThroughputStressWorkflow, workflow.RegisterOptions{Name: "throughputStress"}) w.RegisterWorkflow(throughputstress.ThroughputStressChild) w.RegisterActivity(&tpsActivities) diff --git a/workers/proto/kitchen_sink/kitchen_sink.proto b/workers/proto/kitchen_sink/kitchen_sink.proto index a4a6435..a141f2f 100644 --- a/workers/proto/kitchen_sink/kitchen_sink.proto +++ b/workers/proto/kitchen_sink/kitchen_sink.proto @@ -178,12 +178,21 @@ message TimerAction { } message ExecuteActivityAction { - string activity_type = 2; + message GenericActivity { + string type = 1; + repeated temporal.api.common.v1.Payload arguments = 2; + } + oneof activity_type { + GenericActivity generic = 1; + // There must be an activity named `delay` which accepts some kind of duration and waits + // for that long + google.protobuf.Duration delay = 2; + // There must be an activity named `noop` which does nothing + google.protobuf.Empty noop = 3; + } // The name of the task queue to place this activity request in - string task_queue = 3; - map headers = 4; - // Arguments/input to the activity. Called "input" upstream. - repeated temporal.api.common.v1.Payload arguments = 5; + string task_queue = 4; + map headers = 5; // Indicates how long the caller is willing to wait for an activity completion. Limits how long // retries will be attempted. Either this or start_to_close_timeout_seconds must be specified. // When not specified defaults to the workflow execution timeout. @@ -276,6 +285,8 @@ message SetPatchMarkerAction { // Can be set to true to indicate that branches using this change are being removed, and all // future worker deployments will only have the "with change" code in them. bool deprecated = 2; + // Perform this action behind the if guard + Action inner_action = 3; } message UpsertSearchAttributesAction { diff --git a/workers/python/activities.py b/workers/python/activities.py index ce67cdc..17ee90f 100644 --- a/workers/python/activities.py +++ b/workers/python/activities.py @@ -1,6 +1,14 @@ +import asyncio + +from google.protobuf.duration_pb2 import Duration from temporalio import activity @activity.defn(name="noop") async def noop_activity(): return + + +@activity.defn(name="delay") +async def delay_activity(delay_for: Duration): + await asyncio.sleep(delay_for.ToSeconds()) diff --git a/workers/python/kitchen_sink.py b/workers/python/kitchen_sink.py index 1a7d8ea..711f908 100644 --- a/workers/python/kitchen_sink.py +++ b/workers/python/kitchen_sink.py @@ -2,17 +2,24 @@ import asyncio from datetime import timedelta -from typing import Any, Awaitable, Optional +from typing import Any, Awaitable, Callable, Coroutine, Optional, TypeVar, Union import temporalio.workflow from temporalio import exceptions, workflow from temporalio.api.common.v1 import Payload -from temporalio.common import RawValue, RetryPolicy +from temporalio.common import ( + RawValue, + RetryPolicy, + SearchAttributeKey, + SearchAttributeUpdate, +) +from temporalio.workflow import ActivityHandle, ChildWorkflowHandle from protos.kitchen_sink_pb2 import ( Action, ActionSet, ActivityCancellationType, + AwaitableChoice, DoActionsUpdate, DoSignal, ExecuteActivityAction, @@ -104,16 +111,57 @@ async def handle_action(self, action: Action) -> Optional[Payload]: elif action.HasField("continue_as_new"): workflow.continue_as_new(action.continue_as_new.arguments) elif action.HasField("timer"): - await asyncio.sleep(action.timer.milliseconds / 1000) + await handle_awaitable_choice( + asyncio.sleep(action.timer.milliseconds / 1000), + action.timer.awaitable_choice, + ) elif action.HasField("exec_activity"): - await launch_activity(action.exec_activity) + await handle_awaitable_choice( + launch_activity(action.exec_activity), + action.exec_activity.awaitable_choice, + ) elif action.HasField("exec_child_workflow"): child_action = action.exec_child_workflow child = child_action.workflow_type or "kitchenSink" args = [RawValue(i) for i in child_action.input] - await workflow.execute_child_workflow( - child, id=child_action.workflow_id, args=args + await handle_awaitable_choice( + workflow.start_child_workflow( + child, id=child_action.workflow_id, args=args + ), + child_action.awaitable_choice, + after_started_fn=wait_task_complete, + after_completed_fn=wait_child_wf_complete, + ) + elif action.HasField("set_patch_marker"): + if action.set_patch_marker.deprecated: + workflow.deprecate_patch(action.set_patch_marker.patch_id) + was_patched = True + else: + was_patched = workflow.patched(action.set_patch_marker.patch_id) + + if was_patched: + return await self.handle_action(action.set_patch_marker.inner_action) + elif action.HasField("set_workflow_state"): + self.workflow_state = action.set_workflow_state + elif action.HasField("await_workflow_state"): + await workflow.wait_condition( + lambda: self.workflow_state.kvs.get(action.await_workflow_state.key) + == action.await_workflow_state.value ) + elif action.HasField("upsert_memo"): + pass # Python doesn't have memo upserting + elif action.HasField("upsert_search_attributes"): + updates: list[SearchAttributeUpdate[Any]] = [] + # TODO: Use RawValue after https://github.com/temporalio/sdk-python/issues/438 + # and avoid checking key by name + for k, v in action.upsert_search_attributes.search_attributes.items(): + if "Keyword" in k: + updates.append( + SearchAttributeKey.for_keyword(k).value_set(str(v.data[0])) + ) + else: + updates.append(SearchAttributeKey.for_int(k).value_set(v.data[0])) + workflow.upsert_search_attributes(updates) elif action.HasField("nested_action_set"): return await self.handle_action_set(action.nested_action_set) else: @@ -122,15 +170,17 @@ async def handle_action(self, action: Action) -> Optional[Payload]: return None -def launch_activity(execute_activity: ExecuteActivityAction) -> Awaitable: - args = execute_activity.arguments +def launch_activity(execute_activity: ExecuteActivityAction) -> ActivityHandle: + act_type = "noop" + args = [] - if args is None: - args = [] + if execute_activity.HasField("delay"): + act_type = "delay" + args.append(execute_activity.delay) if execute_activity.HasField("is_local"): activity_task = workflow.start_local_activity( - activity=execute_activity.activity_type, + activity=act_type, args=args, schedule_to_close_timeout=timeout_or_none( execute_activity, "schedule_to_close_timeout" @@ -148,7 +198,7 @@ def launch_activity(execute_activity: ExecuteActivityAction) -> Awaitable: ) else: activity_task = workflow.start_activity( - activity=execute_activity.activity_type, + activity=act_type, args=args, task_queue=execute_activity.task_queue, schedule_to_close_timeout=timeout_or_none( @@ -168,10 +218,60 @@ def launch_activity(execute_activity: ExecuteActivityAction) -> Awaitable: execute_activity.remote.cancellation_type ), ) - # TODO: Handle cancels + return activity_task +async def brief_wait(_: asyncio.Task): + await asyncio.sleep(0.001) + + +async def wait_task_complete(task: asyncio.Task): + await task + + +async def wait_child_wf_complete(task: asyncio.Task[ChildWorkflowHandle]): + res = await task + await res + + +async def handle_awaitable_choice( + awaitable: Union[Coroutine, asyncio.Task], + choice: AwaitableChoice, + after_started_fn: Callable[[asyncio.Task], Awaitable] = brief_wait, + after_completed_fn: Callable[[asyncio.Task], Awaitable] = wait_task_complete, +): + if isinstance(awaitable, asyncio.Task): + task = awaitable + else: + # Place the awaitable into a task so we can cancel it easily + task = asyncio.create_task(awaitable) + + did_cancel = False + try: + if choice.HasField("abandon"): + # Do nothing + return + elif choice.HasField("cancel_before_started"): + task.cancel() + did_cancel = True + await task + elif choice.HasField("cancel_after_started"): + await after_started_fn(task) + task.cancel() + did_cancel = True + await task + elif choice.HasField("cancel_after_completed"): + await after_completed_fn(task) + task.cancel() + did_cancel = True + else: + await task + except asyncio.CancelledError: + if not did_cancel: + raise + + # Various proto conversions below ============================================== diff --git a/workers/python/main.py b/workers/python/main.py index 1669c7b..36e0518 100644 --- a/workers/python/main.py +++ b/workers/python/main.py @@ -1,6 +1,7 @@ import argparse import asyncio import logging +import os import sys import threading from typing import List @@ -19,7 +20,7 @@ ) from temporalio.worker import Worker -from activities import noop_activity +from activities import delay_activity, noop_activity from kitchen_sink import KitchenSinkWorkflow nameToLevel = { @@ -141,12 +142,14 @@ def prom_app(environ, start_fn): t.start() prometheus = PrometheusConfig(bind_address=parser.prom_listen_address) - # TODO: Env var / arg for filter new_runtime = Runtime( telemetry=TelemetryConfig( metrics=prometheus, logging=LoggingConfig( - filter=TelemetryFilter(core_level="DEBUG", other_level="WARN") + filter=TelemetryFilter( + core_level=os.getenv("TEMPORAL_CORE_LOG_LEVEL", "INFO"), + other_level="WARN", + ) ), ), ) @@ -194,7 +197,7 @@ def prom_app(environ, start_fn): client, task_queue=task_queue, workflows=[KitchenSinkWorkflow], - activities=[noop_activity], + activities=[noop_activity, delay_activity], **worker_kwargs, ) for task_queue in task_queues diff --git a/workers/python/protos/kitchen_sink_pb2.py b/workers/python/protos/kitchen_sink_pb2.py index 233d409..15c7322 100644 --- a/workers/python/protos/kitchen_sink_pb2.py +++ b/workers/python/protos/kitchen_sink_pb2.py @@ -19,7 +19,7 @@ from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12kitchen_sink.proto\x12\x1atemporal.omes.kitchen_sink\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\"\x93\x01\n\tTestInput\x12\x41\n\x0eworkflow_input\x18\x01 \x01(\x0b\x32).temporal.omes.kitchen_sink.WorkflowInput\x12\x43\n\x0f\x63lient_sequence\x18\x02 \x01(\x0b\x32*.temporal.omes.kitchen_sink.ClientSequence\"R\n\x0e\x43lientSequence\x12@\n\x0b\x61\x63tion_sets\x18\x01 \x03(\x0b\x32+.temporal.omes.kitchen_sink.ClientActionSet\"\x90\x01\n\x0f\x43lientActionSet\x12\x39\n\x07\x61\x63tions\x18\x01 \x03(\x0b\x32(.temporal.omes.kitchen_sink.ClientAction\x12\x12\n\nconcurrent\x18\x02 \x01(\x08\x12.\n\x0bwait_at_end\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x8f\x02\n\x0c\x43lientAction\x12\x39\n\tdo_signal\x18\x01 \x01(\x0b\x32$.temporal.omes.kitchen_sink.DoSignalH\x00\x12\x37\n\x08\x64o_query\x18\x02 \x01(\x0b\x32#.temporal.omes.kitchen_sink.DoQueryH\x00\x12\x39\n\tdo_update\x18\x03 \x01(\x0b\x32$.temporal.omes.kitchen_sink.DoUpdateH\x00\x12\x45\n\x0enested_actions\x18\x04 \x01(\x0b\x32+.temporal.omes.kitchen_sink.ClientActionSetH\x00\x42\t\n\x07variant\"\xca\x02\n\x08\x44oSignal\x12Q\n\x11\x64o_signal_actions\x18\x01 \x01(\x0b\x32\x34.temporal.omes.kitchen_sink.DoSignal.DoSignalActionsH\x00\x12?\n\x06\x63ustom\x18\x02 \x01(\x0b\x32-.temporal.omes.kitchen_sink.HandlerInvocationH\x00\x1a\x9e\x01\n\x0f\x44oSignalActions\x12;\n\ndo_actions\x18\x01 \x01(\x0b\x32%.temporal.omes.kitchen_sink.ActionSetH\x00\x12\x43\n\x12\x64o_actions_in_main\x18\x02 \x01(\x0b\x32%.temporal.omes.kitchen_sink.ActionSetH\x00\x42\t\n\x07variantB\t\n\x07variant\"\xa9\x01\n\x07\x44oQuery\x12\x38\n\x0creport_state\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.PayloadsH\x00\x12?\n\x06\x63ustom\x18\x02 \x01(\x0b\x32-.temporal.omes.kitchen_sink.HandlerInvocationH\x00\x12\x18\n\x10\x66\x61ilure_expected\x18\n \x01(\x08\x42\t\n\x07variant\"\xb3\x01\n\x08\x44oUpdate\x12\x41\n\ndo_actions\x18\x01 \x01(\x0b\x32+.temporal.omes.kitchen_sink.DoActionsUpdateH\x00\x12?\n\x06\x63ustom\x18\x02 \x01(\x0b\x32-.temporal.omes.kitchen_sink.HandlerInvocationH\x00\x12\x18\n\x10\x66\x61ilure_expected\x18\n \x01(\x08\x42\t\n\x07variant\"\x86\x01\n\x0f\x44oActionsUpdate\x12;\n\ndo_actions\x18\x01 \x01(\x0b\x32%.temporal.omes.kitchen_sink.ActionSetH\x00\x12+\n\treject_me\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x42\t\n\x07variant\"P\n\x11HandlerInvocation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12-\n\x04\x61rgs\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\"|\n\rWorkflowState\x12?\n\x03kvs\x18\x01 \x03(\x0b\x32\x32.temporal.omes.kitchen_sink.WorkflowState.KvsEntry\x1a*\n\x08KvsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"O\n\rWorkflowInput\x12>\n\x0finitial_actions\x18\x01 \x03(\x0b\x32%.temporal.omes.kitchen_sink.ActionSet\"T\n\tActionSet\x12\x33\n\x07\x61\x63tions\x18\x01 \x03(\x0b\x32\".temporal.omes.kitchen_sink.Action\x12\x12\n\nconcurrent\x18\x02 \x01(\x08\"\xac\x08\n\x06\x41\x63tion\x12\x38\n\x05timer\x18\x01 \x01(\x0b\x32\'.temporal.omes.kitchen_sink.TimerActionH\x00\x12J\n\rexec_activity\x18\x02 \x01(\x0b\x32\x31.temporal.omes.kitchen_sink.ExecuteActivityActionH\x00\x12U\n\x13\x65xec_child_workflow\x18\x03 \x01(\x0b\x32\x36.temporal.omes.kitchen_sink.ExecuteChildWorkflowActionH\x00\x12N\n\x14\x61wait_workflow_state\x18\x04 \x01(\x0b\x32..temporal.omes.kitchen_sink.AwaitWorkflowStateH\x00\x12\x43\n\x0bsend_signal\x18\x05 \x01(\x0b\x32,.temporal.omes.kitchen_sink.SendSignalActionH\x00\x12K\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32\x30.temporal.omes.kitchen_sink.CancelWorkflowActionH\x00\x12L\n\x10set_patch_marker\x18\x07 \x01(\x0b\x32\x30.temporal.omes.kitchen_sink.SetPatchMarkerActionH\x00\x12\\\n\x18upsert_search_attributes\x18\x08 \x01(\x0b\x32\x38.temporal.omes.kitchen_sink.UpsertSearchAttributesActionH\x00\x12\x43\n\x0bupsert_memo\x18\t \x01(\x0b\x32,.temporal.omes.kitchen_sink.UpsertMemoActionH\x00\x12G\n\x12set_workflow_state\x18\n \x01(\x0b\x32).temporal.omes.kitchen_sink.WorkflowStateH\x00\x12G\n\rreturn_result\x18\x0b \x01(\x0b\x32..temporal.omes.kitchen_sink.ReturnResultActionH\x00\x12\x45\n\x0creturn_error\x18\x0c \x01(\x0b\x32-.temporal.omes.kitchen_sink.ReturnErrorActionH\x00\x12J\n\x0f\x63ontinue_as_new\x18\r \x01(\x0b\x32/.temporal.omes.kitchen_sink.ContinueAsNewActionH\x00\x12\x42\n\x11nested_action_set\x18\x0e \x01(\x0b\x32%.temporal.omes.kitchen_sink.ActionSetH\x00\x42\t\n\x07variant\"\xa3\x02\n\x0f\x41waitableChoice\x12-\n\x0bwait_finish\x18\x01 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12)\n\x07\x61\x62\x61ndon\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x37\n\x15\x63\x61ncel_before_started\x18\x03 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x36\n\x14\x63\x61ncel_after_started\x18\x04 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x38\n\x16\x63\x61ncel_after_completed\x18\x05 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x42\x0b\n\tcondition\"j\n\x0bTimerAction\x12\x14\n\x0cmilliseconds\x18\x01 \x01(\x04\x12\x45\n\x10\x61waitable_choice\x18\x02 \x01(\x0b\x32+.temporal.omes.kitchen_sink.AwaitableChoice\"\x84\x06\n\x15\x45xecuteActivityAction\x12\x15\n\ractivity_type\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12O\n\x07headers\x18\x04 \x03(\x0b\x32>.temporal.omes.kitchen_sink.ExecuteActivityAction.HeadersEntry\x12\x32\n\targuments\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\n \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12*\n\x08is_local\x18\x0b \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x43\n\x06remote\x18\x0c \x01(\x0b\x32\x31.temporal.omes.kitchen_sink.RemoteActivityOptionsH\x00\x12\x45\n\x10\x61waitable_choice\x18\r \x01(\x0b\x32+.temporal.omes.kitchen_sink.AwaitableChoice\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\n\n\x08locality\"\xad\n\n\x1a\x45xecuteChildWorkflowAction\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12J\n\x13parent_close_policy\x18\n \x01(\x0e\x32-.temporal.omes.kitchen_sink.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.MemoEntry\x12g\n\x11search_attributes\x18\x11 \x03(\x0b\x32L.temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.SearchAttributesEntry\x12T\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x39.temporal.omes.kitchen_sink.ChildWorkflowCancellationType\x12G\n\x11versioning_intent\x18\x13 \x01(\x0e\x32,.temporal.omes.kitchen_sink.VersioningIntent\x12\x45\n\x10\x61waitable_choice\x18\x14 \x01(\x0b\x32+.temporal.omes.kitchen_sink.AwaitableChoice\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aX\n\x15SearchAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"0\n\x12\x41waitWorkflowState\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xdf\x02\n\x10SendSignalAction\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12-\n\x04\x61rgs\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12J\n\x07headers\x18\x05 \x03(\x0b\x32\x39.temporal.omes.kitchen_sink.SendSignalAction.HeadersEntry\x12\x45\n\x10\x61waitable_choice\x18\x06 \x01(\x0b\x32+.temporal.omes.kitchen_sink.AwaitableChoice\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\";\n\x14\x43\x61ncelWorkflowAction\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"<\n\x14SetPatchMarkerAction\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\xe3\x01\n\x1cUpsertSearchAttributesAction\x12i\n\x11search_attributes\x18\x01 \x03(\x0b\x32N.temporal.omes.kitchen_sink.UpsertSearchAttributesAction.SearchAttributesEntry\x1aX\n\x15SearchAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"G\n\x10UpsertMemoAction\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"J\n\x12ReturnResultAction\x12\x34\n\x0breturn_this\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"F\n\x11ReturnErrorAction\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xde\x06\n\x13\x43ontinueAsNewAction\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x04memo\x18\x06 \x03(\x0b\x32\x39.temporal.omes.kitchen_sink.ContinueAsNewAction.MemoEntry\x12M\n\x07headers\x18\x07 \x03(\x0b\x32<.temporal.omes.kitchen_sink.ContinueAsNewAction.HeadersEntry\x12`\n\x11search_attributes\x18\x08 \x03(\x0b\x32\x45.temporal.omes.kitchen_sink.ContinueAsNewAction.SearchAttributesEntry\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12G\n\x11versioning_intent\x18\n \x01(\x0e\x32,.temporal.omes.kitchen_sink.VersioningIntent\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aX\n\x15SearchAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xd1\x01\n\x15RemoteActivityOptions\x12O\n\x11\x63\x61ncellation_type\x18\x01 \x01(\x0e\x32\x34.temporal.omes.kitchen_sink.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x02 \x01(\x08\x12G\n\x11versioning_intent\x18\x03 \x01(\x0e\x32,.temporal.omes.kitchen_sink.VersioningIntent*\xa4\x01\n\x11ParentClosePolicy\x12#\n\x1fPARENT_CLOSE_POLICY_UNSPECIFIED\x10\x00\x12!\n\x1dPARENT_CLOSE_POLICY_TERMINATE\x10\x01\x12\x1f\n\x1bPARENT_CLOSE_POLICY_ABANDON\x10\x02\x12&\n\"PARENT_CLOSE_POLICY_REQUEST_CANCEL\x10\x03*@\n\x10VersioningIntent\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCOMPATIBLE\x10\x01\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x02*\xa2\x01\n\x1d\x43hildWorkflowCancellationType\x12\x14\n\x10\x43HILD_WF_ABANDON\x10\x00\x12\x17\n\x13\x43HILD_WF_TRY_CANCEL\x10\x01\x12(\n$CHILD_WF_WAIT_CANCELLATION_COMPLETED\x10\x02\x12(\n$CHILD_WF_WAIT_CANCELLATION_REQUESTED\x10\x03*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x30Z.github.com/temporalio/omes/loadgen/kitchensinkb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12kitchen_sink.proto\x12\x1atemporal.omes.kitchen_sink\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\"\x93\x01\n\tTestInput\x12\x41\n\x0eworkflow_input\x18\x01 \x01(\x0b\x32).temporal.omes.kitchen_sink.WorkflowInput\x12\x43\n\x0f\x63lient_sequence\x18\x02 \x01(\x0b\x32*.temporal.omes.kitchen_sink.ClientSequence\"R\n\x0e\x43lientSequence\x12@\n\x0b\x61\x63tion_sets\x18\x01 \x03(\x0b\x32+.temporal.omes.kitchen_sink.ClientActionSet\"\x90\x01\n\x0f\x43lientActionSet\x12\x39\n\x07\x61\x63tions\x18\x01 \x03(\x0b\x32(.temporal.omes.kitchen_sink.ClientAction\x12\x12\n\nconcurrent\x18\x02 \x01(\x08\x12.\n\x0bwait_at_end\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x8f\x02\n\x0c\x43lientAction\x12\x39\n\tdo_signal\x18\x01 \x01(\x0b\x32$.temporal.omes.kitchen_sink.DoSignalH\x00\x12\x37\n\x08\x64o_query\x18\x02 \x01(\x0b\x32#.temporal.omes.kitchen_sink.DoQueryH\x00\x12\x39\n\tdo_update\x18\x03 \x01(\x0b\x32$.temporal.omes.kitchen_sink.DoUpdateH\x00\x12\x45\n\x0enested_actions\x18\x04 \x01(\x0b\x32+.temporal.omes.kitchen_sink.ClientActionSetH\x00\x42\t\n\x07variant\"\xca\x02\n\x08\x44oSignal\x12Q\n\x11\x64o_signal_actions\x18\x01 \x01(\x0b\x32\x34.temporal.omes.kitchen_sink.DoSignal.DoSignalActionsH\x00\x12?\n\x06\x63ustom\x18\x02 \x01(\x0b\x32-.temporal.omes.kitchen_sink.HandlerInvocationH\x00\x1a\x9e\x01\n\x0f\x44oSignalActions\x12;\n\ndo_actions\x18\x01 \x01(\x0b\x32%.temporal.omes.kitchen_sink.ActionSetH\x00\x12\x43\n\x12\x64o_actions_in_main\x18\x02 \x01(\x0b\x32%.temporal.omes.kitchen_sink.ActionSetH\x00\x42\t\n\x07variantB\t\n\x07variant\"\xa9\x01\n\x07\x44oQuery\x12\x38\n\x0creport_state\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.PayloadsH\x00\x12?\n\x06\x63ustom\x18\x02 \x01(\x0b\x32-.temporal.omes.kitchen_sink.HandlerInvocationH\x00\x12\x18\n\x10\x66\x61ilure_expected\x18\n \x01(\x08\x42\t\n\x07variant\"\xb3\x01\n\x08\x44oUpdate\x12\x41\n\ndo_actions\x18\x01 \x01(\x0b\x32+.temporal.omes.kitchen_sink.DoActionsUpdateH\x00\x12?\n\x06\x63ustom\x18\x02 \x01(\x0b\x32-.temporal.omes.kitchen_sink.HandlerInvocationH\x00\x12\x18\n\x10\x66\x61ilure_expected\x18\n \x01(\x08\x42\t\n\x07variant\"\x86\x01\n\x0f\x44oActionsUpdate\x12;\n\ndo_actions\x18\x01 \x01(\x0b\x32%.temporal.omes.kitchen_sink.ActionSetH\x00\x12+\n\treject_me\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x42\t\n\x07variant\"P\n\x11HandlerInvocation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12-\n\x04\x61rgs\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\"|\n\rWorkflowState\x12?\n\x03kvs\x18\x01 \x03(\x0b\x32\x32.temporal.omes.kitchen_sink.WorkflowState.KvsEntry\x1a*\n\x08KvsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"O\n\rWorkflowInput\x12>\n\x0finitial_actions\x18\x01 \x03(\x0b\x32%.temporal.omes.kitchen_sink.ActionSet\"T\n\tActionSet\x12\x33\n\x07\x61\x63tions\x18\x01 \x03(\x0b\x32\".temporal.omes.kitchen_sink.Action\x12\x12\n\nconcurrent\x18\x02 \x01(\x08\"\xac\x08\n\x06\x41\x63tion\x12\x38\n\x05timer\x18\x01 \x01(\x0b\x32\'.temporal.omes.kitchen_sink.TimerActionH\x00\x12J\n\rexec_activity\x18\x02 \x01(\x0b\x32\x31.temporal.omes.kitchen_sink.ExecuteActivityActionH\x00\x12U\n\x13\x65xec_child_workflow\x18\x03 \x01(\x0b\x32\x36.temporal.omes.kitchen_sink.ExecuteChildWorkflowActionH\x00\x12N\n\x14\x61wait_workflow_state\x18\x04 \x01(\x0b\x32..temporal.omes.kitchen_sink.AwaitWorkflowStateH\x00\x12\x43\n\x0bsend_signal\x18\x05 \x01(\x0b\x32,.temporal.omes.kitchen_sink.SendSignalActionH\x00\x12K\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32\x30.temporal.omes.kitchen_sink.CancelWorkflowActionH\x00\x12L\n\x10set_patch_marker\x18\x07 \x01(\x0b\x32\x30.temporal.omes.kitchen_sink.SetPatchMarkerActionH\x00\x12\\\n\x18upsert_search_attributes\x18\x08 \x01(\x0b\x32\x38.temporal.omes.kitchen_sink.UpsertSearchAttributesActionH\x00\x12\x43\n\x0bupsert_memo\x18\t \x01(\x0b\x32,.temporal.omes.kitchen_sink.UpsertMemoActionH\x00\x12G\n\x12set_workflow_state\x18\n \x01(\x0b\x32).temporal.omes.kitchen_sink.WorkflowStateH\x00\x12G\n\rreturn_result\x18\x0b \x01(\x0b\x32..temporal.omes.kitchen_sink.ReturnResultActionH\x00\x12\x45\n\x0creturn_error\x18\x0c \x01(\x0b\x32-.temporal.omes.kitchen_sink.ReturnErrorActionH\x00\x12J\n\x0f\x63ontinue_as_new\x18\r \x01(\x0b\x32/.temporal.omes.kitchen_sink.ContinueAsNewActionH\x00\x12\x42\n\x11nested_action_set\x18\x0e \x01(\x0b\x32%.temporal.omes.kitchen_sink.ActionSetH\x00\x42\t\n\x07variant\"\xa3\x02\n\x0f\x41waitableChoice\x12-\n\x0bwait_finish\x18\x01 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12)\n\x07\x61\x62\x61ndon\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x37\n\x15\x63\x61ncel_before_started\x18\x03 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x36\n\x14\x63\x61ncel_after_started\x18\x04 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x38\n\x16\x63\x61ncel_after_completed\x18\x05 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x42\x0b\n\tcondition\"j\n\x0bTimerAction\x12\x14\n\x0cmilliseconds\x18\x01 \x01(\x04\x12\x45\n\x10\x61waitable_choice\x18\x02 \x01(\x0b\x32+.temporal.omes.kitchen_sink.AwaitableChoice\"\xc9\x07\n\x15\x45xecuteActivityAction\x12T\n\x07generic\x18\x01 \x01(\x0b\x32\x41.temporal.omes.kitchen_sink.ExecuteActivityAction.GenericActivityH\x00\x12*\n\x05\x64\x65lay\x18\x02 \x01(\x0b\x32\x19.google.protobuf.DurationH\x00\x12&\n\x04noop\x18\x03 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x12\n\ntask_queue\x18\x04 \x01(\t\x12O\n\x07headers\x18\x05 \x03(\x0b\x32>.temporal.omes.kitchen_sink.ExecuteActivityAction.HeadersEntry\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\n \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12*\n\x08is_local\x18\x0b \x01(\x0b\x32\x16.google.protobuf.EmptyH\x01\x12\x43\n\x06remote\x18\x0c \x01(\x0b\x32\x31.temporal.omes.kitchen_sink.RemoteActivityOptionsH\x01\x12\x45\n\x10\x61waitable_choice\x18\r \x01(\x0b\x32+.temporal.omes.kitchen_sink.AwaitableChoice\x1aS\n\x0fGenericActivity\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x32\n\targuments\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x0f\n\ractivity_typeB\n\n\x08locality\"\xad\n\n\x1a\x45xecuteChildWorkflowAction\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12J\n\x13parent_close_policy\x18\n \x01(\x0e\x32-.temporal.omes.kitchen_sink.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.MemoEntry\x12g\n\x11search_attributes\x18\x11 \x03(\x0b\x32L.temporal.omes.kitchen_sink.ExecuteChildWorkflowAction.SearchAttributesEntry\x12T\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x39.temporal.omes.kitchen_sink.ChildWorkflowCancellationType\x12G\n\x11versioning_intent\x18\x13 \x01(\x0e\x32,.temporal.omes.kitchen_sink.VersioningIntent\x12\x45\n\x10\x61waitable_choice\x18\x14 \x01(\x0b\x32+.temporal.omes.kitchen_sink.AwaitableChoice\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aX\n\x15SearchAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"0\n\x12\x41waitWorkflowState\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xdf\x02\n\x10SendSignalAction\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12-\n\x04\x61rgs\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12J\n\x07headers\x18\x05 \x03(\x0b\x32\x39.temporal.omes.kitchen_sink.SendSignalAction.HeadersEntry\x12\x45\n\x10\x61waitable_choice\x18\x06 \x01(\x0b\x32+.temporal.omes.kitchen_sink.AwaitableChoice\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\";\n\x14\x43\x61ncelWorkflowAction\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"v\n\x14SetPatchMarkerAction\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\x12\x38\n\x0cinner_action\x18\x03 \x01(\x0b\x32\".temporal.omes.kitchen_sink.Action\"\xe3\x01\n\x1cUpsertSearchAttributesAction\x12i\n\x11search_attributes\x18\x01 \x03(\x0b\x32N.temporal.omes.kitchen_sink.UpsertSearchAttributesAction.SearchAttributesEntry\x1aX\n\x15SearchAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"G\n\x10UpsertMemoAction\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"J\n\x12ReturnResultAction\x12\x34\n\x0breturn_this\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"F\n\x11ReturnErrorAction\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xde\x06\n\x13\x43ontinueAsNewAction\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x04memo\x18\x06 \x03(\x0b\x32\x39.temporal.omes.kitchen_sink.ContinueAsNewAction.MemoEntry\x12M\n\x07headers\x18\x07 \x03(\x0b\x32<.temporal.omes.kitchen_sink.ContinueAsNewAction.HeadersEntry\x12`\n\x11search_attributes\x18\x08 \x03(\x0b\x32\x45.temporal.omes.kitchen_sink.ContinueAsNewAction.SearchAttributesEntry\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12G\n\x11versioning_intent\x18\n \x01(\x0e\x32,.temporal.omes.kitchen_sink.VersioningIntent\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aX\n\x15SearchAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xd1\x01\n\x15RemoteActivityOptions\x12O\n\x11\x63\x61ncellation_type\x18\x01 \x01(\x0e\x32\x34.temporal.omes.kitchen_sink.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x02 \x01(\x08\x12G\n\x11versioning_intent\x18\x03 \x01(\x0e\x32,.temporal.omes.kitchen_sink.VersioningIntent*\xa4\x01\n\x11ParentClosePolicy\x12#\n\x1fPARENT_CLOSE_POLICY_UNSPECIFIED\x10\x00\x12!\n\x1dPARENT_CLOSE_POLICY_TERMINATE\x10\x01\x12\x1f\n\x1bPARENT_CLOSE_POLICY_ABANDON\x10\x02\x12&\n\"PARENT_CLOSE_POLICY_REQUEST_CANCEL\x10\x03*@\n\x10VersioningIntent\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCOMPATIBLE\x10\x01\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x02*\xa2\x01\n\x1d\x43hildWorkflowCancellationType\x12\x14\n\x10\x43HILD_WF_ABANDON\x10\x00\x12\x17\n\x13\x43HILD_WF_TRY_CANCEL\x10\x01\x12(\n$CHILD_WF_WAIT_CANCELLATION_COMPLETED\x10\x02\x12(\n$CHILD_WF_WAIT_CANCELLATION_REQUESTED\x10\x03*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x30Z.github.com/temporalio/omes/loadgen/kitchensinkb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -47,14 +47,14 @@ _globals['_CONTINUEASNEWACTION_HEADERSENTRY']._serialized_options = b'8\001' _globals['_CONTINUEASNEWACTION_SEARCHATTRIBUTESENTRY']._options = None _globals['_CONTINUEASNEWACTION_SEARCHATTRIBUTESENTRY']._serialized_options = b'8\001' - _globals['_PARENTCLOSEPOLICY']._serialized_start=7712 - _globals['_PARENTCLOSEPOLICY']._serialized_end=7876 - _globals['_VERSIONINGINTENT']._serialized_start=7878 - _globals['_VERSIONINGINTENT']._serialized_end=7942 - _globals['_CHILDWORKFLOWCANCELLATIONTYPE']._serialized_start=7945 - _globals['_CHILDWORKFLOWCANCELLATIONTYPE']._serialized_end=8107 - _globals['_ACTIVITYCANCELLATIONTYPE']._serialized_start=8109 - _globals['_ACTIVITYCANCELLATIONTYPE']._serialized_end=8197 + _globals['_PARENTCLOSEPOLICY']._serialized_start=7967 + _globals['_PARENTCLOSEPOLICY']._serialized_end=8131 + _globals['_VERSIONINGINTENT']._serialized_start=8133 + _globals['_VERSIONINGINTENT']._serialized_end=8197 + _globals['_CHILDWORKFLOWCANCELLATIONTYPE']._serialized_start=8200 + _globals['_CHILDWORKFLOWCANCELLATIONTYPE']._serialized_end=8362 + _globals['_ACTIVITYCANCELLATIONTYPE']._serialized_start=8364 + _globals['_ACTIVITYCANCELLATIONTYPE']._serialized_end=8452 _globals['_TESTINPUT']._serialized_start=227 _globals['_TESTINPUT']._serialized_end=374 _globals['_CLIENTSEQUENCE']._serialized_start=376 @@ -90,45 +90,47 @@ _globals['_TIMERACTION']._serialized_start=3445 _globals['_TIMERACTION']._serialized_end=3551 _globals['_EXECUTEACTIVITYACTION']._serialized_start=3554 - _globals['_EXECUTEACTIVITYACTION']._serialized_end=4326 - _globals['_EXECUTEACTIVITYACTION_HEADERSENTRY']._serialized_start=4235 - _globals['_EXECUTEACTIVITYACTION_HEADERSENTRY']._serialized_end=4314 - _globals['_EXECUTECHILDWORKFLOWACTION']._serialized_start=4329 - _globals['_EXECUTECHILDWORKFLOWACTION']._serialized_end=5654 - _globals['_EXECUTECHILDWORKFLOWACTION_HEADERSENTRY']._serialized_start=4235 - _globals['_EXECUTECHILDWORKFLOWACTION_HEADERSENTRY']._serialized_end=4314 - _globals['_EXECUTECHILDWORKFLOWACTION_MEMOENTRY']._serialized_start=5488 - _globals['_EXECUTECHILDWORKFLOWACTION_MEMOENTRY']._serialized_end=5564 - _globals['_EXECUTECHILDWORKFLOWACTION_SEARCHATTRIBUTESENTRY']._serialized_start=5566 - _globals['_EXECUTECHILDWORKFLOWACTION_SEARCHATTRIBUTESENTRY']._serialized_end=5654 - _globals['_AWAITWORKFLOWSTATE']._serialized_start=5656 - _globals['_AWAITWORKFLOWSTATE']._serialized_end=5704 - _globals['_SENDSIGNALACTION']._serialized_start=5707 - _globals['_SENDSIGNALACTION']._serialized_end=6058 - _globals['_SENDSIGNALACTION_HEADERSENTRY']._serialized_start=4235 - _globals['_SENDSIGNALACTION_HEADERSENTRY']._serialized_end=4314 - _globals['_CANCELWORKFLOWACTION']._serialized_start=6060 - _globals['_CANCELWORKFLOWACTION']._serialized_end=6119 - _globals['_SETPATCHMARKERACTION']._serialized_start=6121 - _globals['_SETPATCHMARKERACTION']._serialized_end=6181 - _globals['_UPSERTSEARCHATTRIBUTESACTION']._serialized_start=6184 - _globals['_UPSERTSEARCHATTRIBUTESACTION']._serialized_end=6411 - _globals['_UPSERTSEARCHATTRIBUTESACTION_SEARCHATTRIBUTESENTRY']._serialized_start=5566 - _globals['_UPSERTSEARCHATTRIBUTESACTION_SEARCHATTRIBUTESENTRY']._serialized_end=5654 - _globals['_UPSERTMEMOACTION']._serialized_start=6413 - _globals['_UPSERTMEMOACTION']._serialized_end=6484 - _globals['_RETURNRESULTACTION']._serialized_start=6486 - _globals['_RETURNRESULTACTION']._serialized_end=6560 - _globals['_RETURNERRORACTION']._serialized_start=6562 - _globals['_RETURNERRORACTION']._serialized_end=6632 - _globals['_CONTINUEASNEWACTION']._serialized_start=6635 - _globals['_CONTINUEASNEWACTION']._serialized_end=7497 - _globals['_CONTINUEASNEWACTION_MEMOENTRY']._serialized_start=5488 - _globals['_CONTINUEASNEWACTION_MEMOENTRY']._serialized_end=5564 - _globals['_CONTINUEASNEWACTION_HEADERSENTRY']._serialized_start=4235 - _globals['_CONTINUEASNEWACTION_HEADERSENTRY']._serialized_end=4314 - _globals['_CONTINUEASNEWACTION_SEARCHATTRIBUTESENTRY']._serialized_start=5566 - _globals['_CONTINUEASNEWACTION_SEARCHATTRIBUTESENTRY']._serialized_end=5654 - _globals['_REMOTEACTIVITYOPTIONS']._serialized_start=7500 - _globals['_REMOTEACTIVITYOPTIONS']._serialized_end=7709 + _globals['_EXECUTEACTIVITYACTION']._serialized_end=4523 + _globals['_EXECUTEACTIVITYACTION_GENERICACTIVITY']._serialized_start=4330 + _globals['_EXECUTEACTIVITYACTION_GENERICACTIVITY']._serialized_end=4413 + _globals['_EXECUTEACTIVITYACTION_HEADERSENTRY']._serialized_start=4415 + _globals['_EXECUTEACTIVITYACTION_HEADERSENTRY']._serialized_end=4494 + _globals['_EXECUTECHILDWORKFLOWACTION']._serialized_start=4526 + _globals['_EXECUTECHILDWORKFLOWACTION']._serialized_end=5851 + _globals['_EXECUTECHILDWORKFLOWACTION_HEADERSENTRY']._serialized_start=4415 + _globals['_EXECUTECHILDWORKFLOWACTION_HEADERSENTRY']._serialized_end=4494 + _globals['_EXECUTECHILDWORKFLOWACTION_MEMOENTRY']._serialized_start=5685 + _globals['_EXECUTECHILDWORKFLOWACTION_MEMOENTRY']._serialized_end=5761 + _globals['_EXECUTECHILDWORKFLOWACTION_SEARCHATTRIBUTESENTRY']._serialized_start=5763 + _globals['_EXECUTECHILDWORKFLOWACTION_SEARCHATTRIBUTESENTRY']._serialized_end=5851 + _globals['_AWAITWORKFLOWSTATE']._serialized_start=5853 + _globals['_AWAITWORKFLOWSTATE']._serialized_end=5901 + _globals['_SENDSIGNALACTION']._serialized_start=5904 + _globals['_SENDSIGNALACTION']._serialized_end=6255 + _globals['_SENDSIGNALACTION_HEADERSENTRY']._serialized_start=4415 + _globals['_SENDSIGNALACTION_HEADERSENTRY']._serialized_end=4494 + _globals['_CANCELWORKFLOWACTION']._serialized_start=6257 + _globals['_CANCELWORKFLOWACTION']._serialized_end=6316 + _globals['_SETPATCHMARKERACTION']._serialized_start=6318 + _globals['_SETPATCHMARKERACTION']._serialized_end=6436 + _globals['_UPSERTSEARCHATTRIBUTESACTION']._serialized_start=6439 + _globals['_UPSERTSEARCHATTRIBUTESACTION']._serialized_end=6666 + _globals['_UPSERTSEARCHATTRIBUTESACTION_SEARCHATTRIBUTESENTRY']._serialized_start=5763 + _globals['_UPSERTSEARCHATTRIBUTESACTION_SEARCHATTRIBUTESENTRY']._serialized_end=5851 + _globals['_UPSERTMEMOACTION']._serialized_start=6668 + _globals['_UPSERTMEMOACTION']._serialized_end=6739 + _globals['_RETURNRESULTACTION']._serialized_start=6741 + _globals['_RETURNRESULTACTION']._serialized_end=6815 + _globals['_RETURNERRORACTION']._serialized_start=6817 + _globals['_RETURNERRORACTION']._serialized_end=6887 + _globals['_CONTINUEASNEWACTION']._serialized_start=6890 + _globals['_CONTINUEASNEWACTION']._serialized_end=7752 + _globals['_CONTINUEASNEWACTION_MEMOENTRY']._serialized_start=5685 + _globals['_CONTINUEASNEWACTION_MEMOENTRY']._serialized_end=5761 + _globals['_CONTINUEASNEWACTION_HEADERSENTRY']._serialized_start=4415 + _globals['_CONTINUEASNEWACTION_HEADERSENTRY']._serialized_end=4494 + _globals['_CONTINUEASNEWACTION_SEARCHATTRIBUTESENTRY']._serialized_start=5763 + _globals['_CONTINUEASNEWACTION_SEARCHATTRIBUTESENTRY']._serialized_end=5851 + _globals['_REMOTEACTIVITYOPTIONS']._serialized_start=7755 + _globals['_REMOTEACTIVITYOPTIONS']._serialized_end=7964 # @@protoc_insertion_point(module_scope) diff --git a/workers/python/protos/kitchen_sink_pb2.pyi b/workers/python/protos/kitchen_sink_pb2.pyi index 2e3c4eb..b6a193e 100644 --- a/workers/python/protos/kitchen_sink_pb2.pyi +++ b/workers/python/protos/kitchen_sink_pb2.pyi @@ -220,7 +220,14 @@ class TimerAction(_message.Message): def __init__(self, milliseconds: _Optional[int] = ..., awaitable_choice: _Optional[_Union[AwaitableChoice, _Mapping]] = ...) -> None: ... class ExecuteActivityAction(_message.Message): - __slots__ = ("activity_type", "task_queue", "headers", "arguments", "schedule_to_close_timeout", "schedule_to_start_timeout", "start_to_close_timeout", "heartbeat_timeout", "retry_policy", "is_local", "remote", "awaitable_choice") + __slots__ = ("generic", "delay", "noop", "task_queue", "headers", "schedule_to_close_timeout", "schedule_to_start_timeout", "start_to_close_timeout", "heartbeat_timeout", "retry_policy", "is_local", "remote", "awaitable_choice") + class GenericActivity(_message.Message): + __slots__ = ("type", "arguments") + TYPE_FIELD_NUMBER: _ClassVar[int] + ARGUMENTS_FIELD_NUMBER: _ClassVar[int] + type: str + arguments: _containers.RepeatedCompositeFieldContainer[_message_pb2.Payload] + def __init__(self, type: _Optional[str] = ..., arguments: _Optional[_Iterable[_Union[_message_pb2.Payload, _Mapping]]] = ...) -> None: ... class HeadersEntry(_message.Message): __slots__ = ("key", "value") KEY_FIELD_NUMBER: _ClassVar[int] @@ -228,10 +235,11 @@ class ExecuteActivityAction(_message.Message): key: str value: _message_pb2.Payload def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ...) -> None: ... - ACTIVITY_TYPE_FIELD_NUMBER: _ClassVar[int] + GENERIC_FIELD_NUMBER: _ClassVar[int] + DELAY_FIELD_NUMBER: _ClassVar[int] + NOOP_FIELD_NUMBER: _ClassVar[int] TASK_QUEUE_FIELD_NUMBER: _ClassVar[int] HEADERS_FIELD_NUMBER: _ClassVar[int] - ARGUMENTS_FIELD_NUMBER: _ClassVar[int] SCHEDULE_TO_CLOSE_TIMEOUT_FIELD_NUMBER: _ClassVar[int] SCHEDULE_TO_START_TIMEOUT_FIELD_NUMBER: _ClassVar[int] START_TO_CLOSE_TIMEOUT_FIELD_NUMBER: _ClassVar[int] @@ -240,10 +248,11 @@ class ExecuteActivityAction(_message.Message): IS_LOCAL_FIELD_NUMBER: _ClassVar[int] REMOTE_FIELD_NUMBER: _ClassVar[int] AWAITABLE_CHOICE_FIELD_NUMBER: _ClassVar[int] - activity_type: str + generic: ExecuteActivityAction.GenericActivity + delay: _duration_pb2.Duration + noop: _empty_pb2.Empty task_queue: str headers: _containers.MessageMap[str, _message_pb2.Payload] - arguments: _containers.RepeatedCompositeFieldContainer[_message_pb2.Payload] schedule_to_close_timeout: _duration_pb2.Duration schedule_to_start_timeout: _duration_pb2.Duration start_to_close_timeout: _duration_pb2.Duration @@ -252,7 +261,7 @@ class ExecuteActivityAction(_message.Message): is_local: _empty_pb2.Empty remote: RemoteActivityOptions awaitable_choice: AwaitableChoice - def __init__(self, activity_type: _Optional[str] = ..., task_queue: _Optional[str] = ..., headers: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., arguments: _Optional[_Iterable[_Union[_message_pb2.Payload, _Mapping]]] = ..., schedule_to_close_timeout: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., schedule_to_start_timeout: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., start_to_close_timeout: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., heartbeat_timeout: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., retry_policy: _Optional[_Union[_message_pb2.RetryPolicy, _Mapping]] = ..., is_local: _Optional[_Union[_empty_pb2.Empty, _Mapping]] = ..., remote: _Optional[_Union[RemoteActivityOptions, _Mapping]] = ..., awaitable_choice: _Optional[_Union[AwaitableChoice, _Mapping]] = ...) -> None: ... + def __init__(self, generic: _Optional[_Union[ExecuteActivityAction.GenericActivity, _Mapping]] = ..., delay: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., noop: _Optional[_Union[_empty_pb2.Empty, _Mapping]] = ..., task_queue: _Optional[str] = ..., headers: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., schedule_to_close_timeout: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., schedule_to_start_timeout: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., start_to_close_timeout: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., heartbeat_timeout: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., retry_policy: _Optional[_Union[_message_pb2.RetryPolicy, _Mapping]] = ..., is_local: _Optional[_Union[_empty_pb2.Empty, _Mapping]] = ..., remote: _Optional[_Union[RemoteActivityOptions, _Mapping]] = ..., awaitable_choice: _Optional[_Union[AwaitableChoice, _Mapping]] = ...) -> None: ... class ExecuteChildWorkflowAction(_message.Message): __slots__ = ("namespace", "workflow_id", "workflow_type", "task_queue", "input", "workflow_execution_timeout", "workflow_run_timeout", "workflow_task_timeout", "parent_close_policy", "workflow_id_reuse_policy", "retry_policy", "cron_schedule", "headers", "memo", "search_attributes", "cancellation_type", "versioning_intent", "awaitable_choice") @@ -355,12 +364,14 @@ class CancelWorkflowAction(_message.Message): def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... class SetPatchMarkerAction(_message.Message): - __slots__ = ("patch_id", "deprecated") + __slots__ = ("patch_id", "deprecated", "inner_action") PATCH_ID_FIELD_NUMBER: _ClassVar[int] DEPRECATED_FIELD_NUMBER: _ClassVar[int] + INNER_ACTION_FIELD_NUMBER: _ClassVar[int] patch_id: str deprecated: bool - def __init__(self, patch_id: _Optional[str] = ..., deprecated: bool = ...) -> None: ... + inner_action: Action + def __init__(self, patch_id: _Optional[str] = ..., deprecated: bool = ..., inner_action: _Optional[_Union[Action, _Mapping]] = ...) -> None: ... class UpsertSearchAttributesAction(_message.Message): __slots__ = ("search_attributes",)