From 145c03a4ec828614c558996141a2cf4f53d91304 Mon Sep 17 00:00:00 2001 From: Daniel Vigovszky Date: Thu, 13 Jun 2024 11:31:43 +0200 Subject: [PATCH] Worker environment inheritance via RPC --- .../golem/worker/invocation_context.proto | 11 + .../proto/golem/worker/worker_service.proto | 3 + .../workerexecutor/worker_executor.proto | 3 + golem-common/src/model/mod.rs | 3 + golem-common/src/model/oplog.rs | 3 + .../components/worker_service/forwarding.rs | 2 + golem-test-framework/src/dsl/mod.rs | 4 + .../src/durable_host/mod.rs | 10 +- .../src/durable_host/wasm_rpc/mod.rs | 11 + golem-worker-executor-base/src/grpc.rs | 78 +++++- golem-worker-executor-base/src/model.rs | 5 + .../src/services/oplog/tests.rs | 2 + .../src/services/rpc.rs | 57 ++++- .../src/services/worker.rs | 3 + .../src/services/worker_activator.rs | 11 +- .../src/services/worker_proxy.rs | 37 ++- golem-worker-executor-base/src/worker.rs | 22 +- golem-worker-executor-base/tests/rpc.rs | 82 +++++++ .../src/service/worker/default.rs | 33 ++- golem-worker-service/src/api/worker.rs | 2 + golem-worker-service/src/grpcapi/worker.rs | 2 + .../src/worker_bridge_request_executor.rs | 1 + test-components/caller_composed.wasm | Bin 168879 -> 176625 bytes test-components/counters.wasm | Bin 71305 -> 88854 bytes test-components/rpc/caller/src/bindings.rs | 226 +++++++++++++++++- test-components/rpc/caller/src/lib.rs | 13 +- test-components/rpc/caller/wit/caller.wit | 3 +- .../caller/wit/deps/counters-stub/stub.wit | 2 + .../caller/wit/deps/rpc_counters/counters.wit | 5 +- .../rpc/counters-stub/src/bindings.rs | 166 ++++++++++++- test-components/rpc/counters-stub/src/lib.rs | 54 +++++ .../rpc/counters-stub/wit/_stub.wit | 2 + .../wit/deps/rpc_counters/counters.wit | 5 +- test-components/rpc/counters/src/bindings.rs | 166 ++++++++++++- test-components/rpc/counters/src/lib.rs | 29 ++- test-components/rpc/counters/wit/counters.wit | 5 +- 36 files changed, 1016 insertions(+), 45 deletions(-) create mode 100644 golem-api-grpc/proto/golem/worker/invocation_context.proto diff --git a/golem-api-grpc/proto/golem/worker/invocation_context.proto b/golem-api-grpc/proto/golem/worker/invocation_context.proto new file mode 100644 index 000000000..72ffdc5ba --- /dev/null +++ b/golem-api-grpc/proto/golem/worker/invocation_context.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +package golem.worker; + +import "golem/worker/worker_id.proto"; + +message InvocationContext { + golem.worker.WorkerId parent = 1; + repeated string args = 3; + map env = 4; +} diff --git a/golem-api-grpc/proto/golem/worker/worker_service.proto b/golem-api-grpc/proto/golem/worker/worker_service.proto index 852ea82fe..97a52d2c8 100644 --- a/golem-api-grpc/proto/golem/worker/worker_service.proto +++ b/golem-api-grpc/proto/golem/worker/worker_service.proto @@ -7,6 +7,7 @@ import public "golem/worker/calling_convention.proto"; import public "golem/worker/complete_parameters.proto"; import public "golem/worker/cursor.proto"; import public "golem/worker/idempotency_key.proto"; +import public "golem/worker/invocation_context.proto"; import public "golem/worker/invoke_parameters.proto"; import public "golem/worker/invoke_result.proto"; import public "golem/worker/invoke_result_json.proto"; @@ -105,6 +106,7 @@ message InvokeAndAwaitRequest { string function = 3; golem.worker.InvokeParameters invokeParameters = 4; golem.worker.CallingConvention callingConvention = 5; + optional golem.worker.InvocationContext context = 6; } message InvokeAndAwaitResponse { @@ -119,6 +121,7 @@ message InvokeRequest { golem.worker.IdempotencyKey idempotencyKey = 2; string function = 3; golem.worker.InvokeParameters invokeParameters = 4; + optional golem.worker.InvocationContext context = 6; } message InvokeResponse { diff --git a/golem-api-grpc/proto/golem/workerexecutor/worker_executor.proto b/golem-api-grpc/proto/golem/workerexecutor/worker_executor.proto index 38d9be2bc..859a14520 100644 --- a/golem-api-grpc/proto/golem/workerexecutor/worker_executor.proto +++ b/golem-api-grpc/proto/golem/workerexecutor/worker_executor.proto @@ -4,6 +4,7 @@ import public "golem/common/account_id.proto"; import public "golem/worker/calling_convention.proto"; import public "golem/common/empty.proto"; import public "golem/worker/idempotency_key.proto"; +import public "golem/worker/invocation_context.proto"; import public "golem/worker/log_event.proto"; import public "golem/worker/promise_id.proto"; import public "golem/common/resource_limits.proto"; @@ -104,6 +105,7 @@ message InvokeAndAwaitWorkerRequest { golem.worker.CallingConvention calling_convention = 5; golem.common.AccountId account_id = 6; golem.common.ResourceLimits account_limits = 7; + optional golem.worker.InvocationContext context = 8; } message InvokeAndAwaitWorkerResponse { @@ -124,6 +126,7 @@ message InvokeWorkerRequest { golem.worker.IdempotencyKey idempotency_key = 4; golem.common.AccountId account_id = 5; golem.common.ResourceLimits account_limits = 6; + optional golem.worker.InvocationContext context = 7; } message ConnectWorkerRequest { diff --git a/golem-common/src/model/mod.rs b/golem-common/src/model/mod.rs index a04cb2c41..d4b12facd 100644 --- a/golem-common/src/model/mod.rs +++ b/golem-common/src/model/mod.rs @@ -701,6 +701,7 @@ pub struct WorkerMetadata { pub env: Vec<(String, String)>, pub account_id: AccountId, pub created_at: Timestamp, + pub parent: Option, pub last_known_status: WorkerStatusRecord, } @@ -712,6 +713,7 @@ impl WorkerMetadata { env: vec![], account_id, created_at: Timestamp::now_utc(), + parent: None, last_known_status: WorkerStatusRecord::default(), } } @@ -1962,6 +1964,7 @@ mod tests { value: "account-1".to_string(), }, created_at: Timestamp::now_utc(), + parent: None, last_known_status: WorkerStatusRecord { component_version: 1, ..WorkerStatusRecord::default() diff --git a/golem-common/src/model/oplog.rs b/golem-common/src/model/oplog.rs index db24533e5..e68f18bfc 100644 --- a/golem-common/src/model/oplog.rs +++ b/golem-common/src/model/oplog.rs @@ -122,6 +122,7 @@ pub enum OplogEntry { args: Vec, env: Vec<(String, String)>, account_id: AccountId, + parent: Option, }, /// The worker invoked a host function ImportedFunctionInvoked { @@ -221,6 +222,7 @@ impl OplogEntry { args: Vec, env: Vec<(String, String)>, account_id: AccountId, + parent: Option, ) -> OplogEntry { OplogEntry::Create { timestamp: Timestamp::now_utc(), @@ -229,6 +231,7 @@ impl OplogEntry { args, env, account_id, + parent, } } diff --git a/golem-test-framework/src/components/worker_service/forwarding.rs b/golem-test-framework/src/components/worker_service/forwarding.rs index bb7e894c4..3652978f8 100644 --- a/golem-test-framework/src/components/worker_service/forwarding.rs +++ b/golem-test-framework/src/components/worker_service/forwarding.rs @@ -221,6 +221,7 @@ impl WorkerService for ForwardingWorkerService { available_fuel: i64::MAX, max_memory_per_worker: i64::MAX, }), + context: request.context, }) .await .expect("Failed to call golem-worker-executor") @@ -267,6 +268,7 @@ impl WorkerService for ForwardingWorkerService { available_fuel: i64::MAX, max_memory_per_worker: i64::MAX, }), + context: request.context, }) .await .expect("Failed to call golem-worker-executor") diff --git a/golem-test-framework/src/dsl/mod.rs b/golem-test-framework/src/dsl/mod.rs index d20b821ea..3b5a29863 100644 --- a/golem-test-framework/src/dsl/mod.rs +++ b/golem-test-framework/src/dsl/mod.rs @@ -332,6 +332,7 @@ impl TestDsl for T { invoke_parameters: Some(InvokeParameters { params: params.into_iter().map(|v| v.into()).collect(), }), + context: None, }) .await; @@ -361,6 +362,7 @@ impl TestDsl for T { invoke_parameters: Some(InvokeParameters { params: params.into_iter().map(|v| v.into()).collect(), }), + context: None, }) .await; @@ -480,6 +482,7 @@ impl TestDsl for T { params: params.into_iter().map(|v| v.into()).collect(), }), calling_convention: cc.into(), + context: None, }) .await; @@ -967,6 +970,7 @@ pub fn to_worker_metadata( current_idempotency_key: None, component_version: metadata.component_version, }, + parent: None, } } diff --git a/golem-worker-executor-base/src/durable_host/mod.rs b/golem-worker-executor-base/src/durable_host/mod.rs index 5a4fcae6a..01f8ed8fa 100644 --- a/golem-worker-executor-base/src/durable_host/mod.rs +++ b/golem-worker-executor-base/src/durable_host/mod.rs @@ -1129,7 +1129,15 @@ impl> ExternalOperations for Dur match decision { RecoveryDecision::Immediate => { - let _ = Worker::get_or_create_running(this, &owned_worker_id).await?; + let _ = Worker::get_or_create_running( + this, + &owned_worker_id, + None, + None, + None, + None, + ) + .await?; } RecoveryDecision::Delayed(_) => { panic!("Delayed recovery on startup is not supported currently") diff --git a/golem-worker-executor-base/src/durable_host/wasm_rpc/mod.rs b/golem-worker-executor-base/src/durable_host/wasm_rpc/mod.rs index 7b5be5b74..78b34d21b 100644 --- a/golem-worker-executor-base/src/durable_host/wasm_rpc/mod.rs +++ b/golem-worker-executor-base/src/durable_host/wasm_rpc/mod.rs @@ -28,6 +28,7 @@ use std::str::FromStr; use tracing::{debug, error}; use uuid::Uuid; use wasmtime::component::Resource; +use wasmtime_wasi::preview2::bindings::cli::environment::Host; #[async_trait] impl HostWasmRpc for DurableWorkerCtx { @@ -84,6 +85,8 @@ impl HostWasmRpc for DurableWorkerCtx { .await?; let idempotency_key = IdempotencyKey::from_uuid(uuid); + let args = self.get_arguments().await?; + let env = self.get_environment().await?; let result = Durability::::wrap( self, WrappedFunctionType::WriteRemote, @@ -96,6 +99,9 @@ impl HostWasmRpc for DurableWorkerCtx { Some(idempotency_key), function_name, function_params, + ctx.worker_id(), + &args, + &env, ) .await }) @@ -145,6 +151,8 @@ impl HostWasmRpc for DurableWorkerCtx { .await?; let idempotency_key = IdempotencyKey::from_uuid(uuid); + let args = self.get_arguments().await?; + let env = self.get_environment().await?; let result = Durability::::wrap( self, WrappedFunctionType::WriteRemote, @@ -157,6 +165,9 @@ impl HostWasmRpc for DurableWorkerCtx { Some(idempotency_key), function_name, function_params, + ctx.worker_id(), + &args, + &env, ) .await }) diff --git a/golem-worker-executor-base/src/grpc.rs b/golem-worker-executor-base/src/grpc.rs index aaa73bc62..c3455312a 100644 --- a/golem-worker-executor-base/src/grpc.rs +++ b/golem-worker-executor-base/src/grpc.rs @@ -256,6 +256,7 @@ impl + UsesAllDeps + Send + Sync + Some(args), Some(env), Some(component_version), + None, ) .await?; Worker::start_if_needed(worker.clone()).await?; @@ -313,7 +314,8 @@ impl + UsesAllDeps + Send + Sync + // By making sure the worker is in memory. If it was suspended because of waiting // for a promise, replaying that call will now not suspend as the promise has been // completed, and the worker will continue running. - Worker::get_or_create_running(&self.services, &owned_worker_id).await?; + Worker::get_or_create_running(&self.services, &owned_worker_id, None, None, None, None) + .await?; } let success = golem::workerexecutor::CompletePromiseSuccess { completed }; @@ -351,7 +353,8 @@ impl + UsesAllDeps + Send + Sync + if should_interrupt { let worker = - Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None).await?; + Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None, None) + .await?; if let Some(mut await_interrupted) = worker.set_interrupting(InterruptKind::Interrupt).await @@ -424,7 +427,7 @@ impl + UsesAllDeps + Send + Sync + WorkerStatus::Suspended => { debug!("Marking suspended worker as interrupted"); let worker = - Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None) + Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None, None) .await?; worker.set_interrupting(InterruptKind::Interrupt).await; // Explicitly drop from the active worker cache - this will drop websocket connections etc. @@ -433,7 +436,7 @@ impl + UsesAllDeps + Send + Sync + WorkerStatus::Retrying => { debug!("Marking worker scheduled to be retried as interrupted"); let worker = - Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None) + Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None, None) .await?; worker.set_interrupting(InterruptKind::Interrupt).await; // Explicitly drop from the active worker cache - this will drop websocket connections etc. @@ -441,7 +444,7 @@ impl + UsesAllDeps + Send + Sync + } WorkerStatus::Running => { let worker = - Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None) + Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None, None) .await?; worker .set_interrupting(if request.recover_immediately { @@ -488,7 +491,15 @@ impl + UsesAllDeps + Send + Sync + match &worker_status.status { WorkerStatus::Suspended | WorkerStatus::Interrupted => { info!("Activating ${worker_status:?} worker {worker_id} due to explicit resume request"); - let _ = Worker::get_or_create_running(&self.services, &owned_worker_id).await?; + let _ = Worker::get_or_create_running( + &self.services, + &owned_worker_id, + None, + None, + None, + None, + ) + .await?; Ok(()) } _ => Err(GolemError::invalid_request(format!( @@ -556,7 +567,15 @@ impl + UsesAllDeps + Send + Sync + Ctx::record_last_known_limits(self, &account_id, &limits.into()).await?; } - Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None).await + Worker::get_or_create_suspended( + self, + &owned_worker_id, + request.args(), + request.env(), + None, + request.parent(), + ) + .await } async fn invoke_worker_internal( @@ -817,6 +836,7 @@ impl + UsesAllDeps + Send + Sync + None, None, Some(worker_status.component_version), + None, ) .await?; @@ -849,6 +869,7 @@ impl + UsesAllDeps + Send + Sync + None, None, None, + None, ) .await?; @@ -877,7 +898,7 @@ impl + UsesAllDeps + Send + Sync + // process need to be initiated through the worker's invocation queue. let worker = - Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None) + Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None, None) .await?; worker.enqueue_manual_update(request.target_version).await; } @@ -915,7 +936,7 @@ impl + UsesAllDeps + Send + Sync + if worker_status.status != WorkerStatus::Interrupted { let event_service = - Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None) + Worker::get_or_create_suspended(self, &owned_worker_id, None, None, None, None) .await? .event_service(); @@ -1699,6 +1720,9 @@ trait GrpcInvokeRequest { fn worker_id(&self) -> Result; fn idempotency_key(&self) -> Result, GolemError>; fn name(&self) -> String; + fn args(&self) -> Option>; + fn env(&self) -> Option>; + fn parent(&self) -> Option; } impl GrpcInvokeRequest for golem::workerexecutor::InvokeWorkerRequest { @@ -1737,6 +1761,24 @@ impl GrpcInvokeRequest for golem::workerexecutor::InvokeWorkerRequest { fn name(&self) -> String { self.name.clone() } + + fn args(&self) -> Option> { + self.context.as_ref().map(|ctx| ctx.args.clone()) + } + + fn env(&self) -> Option> { + self.context + .as_ref() + .map(|ctx| ctx.env.clone().into_iter().collect::>()) + } + + fn parent(&self) -> Option { + self.context.as_ref().and_then(|ctx| { + ctx.parent + .as_ref() + .and_then(|worker_id| worker_id.clone().try_into().ok()) + }) + } } impl GrpcInvokeRequest for golem::workerexecutor::InvokeAndAwaitWorkerRequest { @@ -1778,6 +1820,24 @@ impl GrpcInvokeRequest for golem::workerexecutor::InvokeAndAwaitWorkerRequest { fn name(&self) -> String { self.name.clone() } + + fn args(&self) -> Option> { + self.context.as_ref().map(|ctx| ctx.args.clone()) + } + + fn env(&self) -> Option> { + self.context + .as_ref() + .map(|ctx| ctx.env.clone().into_iter().collect::>()) + } + + fn parent(&self) -> Option { + self.context.as_ref().and_then(|ctx| { + ctx.parent + .as_ref() + .and_then(|worker_id| worker_id.clone().try_into().ok()) + }) + } } pub trait UriBackConversion { diff --git a/golem-worker-executor-base/src/model.rs b/golem-worker-executor-base/src/model.rs index 8778d5069..f8b214d3b 100644 --- a/golem-worker-executor-base/src/model.rs +++ b/golem-worker-executor-base/src/model.rs @@ -87,6 +87,11 @@ impl WorkerConfig { let worker_name = worker_id.worker_name.clone(); let component_id = worker_id.component_id; let component_version = component_version.to_string(); + worker_env.retain(|(key, _)| { + key != "GOLEM_WORKER_NAME" + && key != "GOLEM_COMPONENT_ID" + && key != "GOLEM_COMPONENT_VERSION" + }); worker_env.push((String::from("GOLEM_WORKER_NAME"), worker_name)); worker_env.push((String::from("GOLEM_COMPONENT_ID"), component_id.to_string())); worker_env.push((String::from("GOLEM_COMPONENT_VERSION"), component_version)); diff --git a/golem-worker-executor-base/src/services/oplog/tests.rs b/golem-worker-executor-base/src/services/oplog/tests.rs index dc2e13c84..0a440abc5 100644 --- a/golem-worker-executor-base/src/services/oplog/tests.rs +++ b/golem-worker-executor-base/src/services/oplog/tests.rs @@ -45,6 +45,7 @@ fn rounded(entry: OplogEntry) -> OplogEntry { args, env, account_id, + parent, } => OplogEntry::Create { timestamp: rounded_ts(timestamp), worker_id, @@ -52,6 +53,7 @@ fn rounded(entry: OplogEntry) -> OplogEntry { args, env, account_id, + parent, }, OplogEntry::ImportedFunctionInvoked { timestamp, diff --git a/golem-worker-executor-base/src/services/rpc.rs b/golem-worker-executor-base/src/services/rpc.rs index 0d883f16d..e973cbaac 100644 --- a/golem-worker-executor-base/src/services/rpc.rs +++ b/golem-worker-executor-base/src/services/rpc.rs @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::collections::HashMap; use std::fmt::{Display, Formatter}; use std::sync::Arc; @@ -49,6 +50,9 @@ pub trait Rpc { idempotency_key: Option, function_name: String, function_params: Vec, + self_worker_id: &WorkerId, + self_args: &[String], + self_env: &[(String, String)], ) -> Result; async fn invoke( @@ -57,6 +61,9 @@ pub trait Rpc { idempotency_key: Option, function_name: String, function_params: Vec, + self_worker_id: &WorkerId, + self_args: &[String], + self_env: &[(String, String)], ) -> Result<(), RpcError>; } @@ -178,6 +185,9 @@ impl Rpc for RemoteInvocationRpc { idempotency_key: Option, function_name: String, function_params: Vec, + self_worker_id: &WorkerId, + self_args: &[String], + self_env: &[(String, String)], ) -> Result { Ok(self .worker_proxy @@ -186,6 +196,9 @@ impl Rpc for RemoteInvocationRpc { idempotency_key, function_name, function_params, + self_worker_id.clone(), + self_args.to_vec(), + HashMap::from_iter(self_env.to_vec()), ) .await?) } @@ -196,6 +209,9 @@ impl Rpc for RemoteInvocationRpc { idempotency_key: Option, function_name: String, function_params: Vec, + self_worker_id: &WorkerId, + self_args: &[String], + self_env: &[(String, String)], ) -> Result<(), RpcError> { Ok(self .worker_proxy @@ -204,6 +220,9 @@ impl Rpc for RemoteInvocationRpc { idempotency_key, function_name, function_params, + self_worker_id.clone(), + self_args.to_vec(), + HashMap::from_iter(self_env.to_vec()), ) .await?) } @@ -451,6 +470,9 @@ impl Rpc for DirectWorkerInvocationRpc { idempotency_key: Option, function_name: String, function_params: Vec, + self_worker_id: &WorkerId, + self_args: &[String], + self_env: &[(String, String)], ) -> Result { let idempotency_key = idempotency_key.unwrap_or(IdempotencyKey::fresh()); @@ -466,7 +488,15 @@ impl Rpc for DirectWorkerInvocationRpc { .map(|wit_value| wit_value.into()) .collect(); - let worker = Worker::get_or_create_running(self, owned_worker_id).await?; + let worker = Worker::get_or_create_running( + self, + owned_worker_id, + Some(self_args.to_vec()), + Some(self_env.to_vec()), + None, + Some(self_worker_id.clone()), + ) + .await?; let result_values = worker .invoke_and_await( @@ -484,6 +514,9 @@ impl Rpc for DirectWorkerInvocationRpc { Some(idempotency_key), function_name, function_params, + self_worker_id, + self_args, + self_env, ) .await } @@ -495,6 +528,9 @@ impl Rpc for DirectWorkerInvocationRpc { idempotency_key: Option, function_name: String, function_params: Vec, + self_worker_id: &WorkerId, + self_args: &[String], + self_env: &[(String, String)], ) -> Result<(), RpcError> { let idempotency_key = idempotency_key.unwrap_or(IdempotencyKey::fresh()); @@ -510,7 +546,15 @@ impl Rpc for DirectWorkerInvocationRpc { .map(|wit_value| wit_value.into()) .collect(); - let worker = Worker::get_or_create_running(self, owned_worker_id).await?; + let worker = Worker::get_or_create_running( + self, + owned_worker_id, + Some(self_args.to_vec()), + Some(self_env.to_vec()), + None, + Some(self_worker_id.clone()), + ) + .await?; worker .invoke( @@ -528,6 +572,9 @@ impl Rpc for DirectWorkerInvocationRpc { Some(idempotency_key), function_name, function_params, + self_worker_id, + self_args, + self_env, ) .await } @@ -566,6 +613,9 @@ impl Rpc for RpcMock { _idempotency_key: Option, _function_name: String, _function_params: Vec, + _self_worker_id: &WorkerId, + _self_args: &[String], + _self_env: &[(String, String)], ) -> Result { unimplemented!() } @@ -576,6 +626,9 @@ impl Rpc for RpcMock { _idempotency_key: Option, _function_name: String, _function_params: Vec, + _self_worker_id: &WorkerId, + _self_args: &[String], + _self_env: &[(String, String)], ) -> Result<(), RpcError> { unimplemented!() } diff --git a/golem-worker-executor-base/src/services/worker.rs b/golem-worker-executor-base/src/services/worker.rs index 76c6a06e6..a17c531b2 100644 --- a/golem-worker-executor-base/src/services/worker.rs +++ b/golem-worker-executor-base/src/services/worker.rs @@ -114,6 +114,7 @@ impl WorkerService for DefaultWorkerService { worker_metadata.args.clone(), worker_metadata.env.clone(), worker_metadata.account_id.clone(), + worker_metadata.parent.clone(), ); self.oplog_service .create(&owned_worker_id, initial_oplog_entry) @@ -173,6 +174,7 @@ impl WorkerService for DefaultWorkerService { env, account_id, timestamp, + parent, }, )) => { let mut details = WorkerMetadata { @@ -181,6 +183,7 @@ impl WorkerService for DefaultWorkerService { env, account_id, created_at: timestamp, + parent, last_known_status: WorkerStatusRecord { component_version, ..WorkerStatusRecord::default() diff --git a/golem-worker-executor-base/src/services/worker_activator.rs b/golem-worker-executor-base/src/services/worker_activator.rs index fc91f4b03..d533e0ff0 100644 --- a/golem-worker-executor-base/src/services/worker_activator.rs +++ b/golem-worker-executor-base/src/services/worker_activator.rs @@ -88,7 +88,16 @@ impl + Send + Sync + 'static> WorkerActivator let metadata = self.all.worker_service().get(owned_worker_id).await; match metadata { Some(_) => { - if let Err(err) = Worker::get_or_create_running(&self.all, owned_worker_id).await { + if let Err(err) = Worker::get_or_create_running( + &self.all, + owned_worker_id, + None, + None, + None, + None, + ) + .await + { error!("Failed to activate worker: {err}") } } diff --git a/golem-worker-executor-base/src/services/worker_proxy.rs b/golem-worker-executor-base/src/services/worker_proxy.rs index b6e6c76c0..0157bb256 100644 --- a/golem-worker-executor-base/src/services/worker_proxy.rs +++ b/golem-worker-executor-base/src/services/worker_proxy.rs @@ -19,13 +19,14 @@ use bincode::{Decode, Encode}; use golem_api_grpc::proto::golem::worker::worker_service_client::WorkerServiceClient; use golem_api_grpc::proto::golem::worker::{ invoke_and_await_response, invoke_response, update_worker_response, worker_error, - CallingConvention, InvokeAndAwaitRequest, InvokeAndAwaitResponse, InvokeParameters, - InvokeRequest, InvokeResponse, UpdateMode, UpdateWorkerRequest, UpdateWorkerResponse, - WorkerError, + CallingConvention, InvocationContext, InvokeAndAwaitRequest, InvokeAndAwaitResponse, + InvokeParameters, InvokeRequest, InvokeResponse, UpdateMode, UpdateWorkerRequest, + UpdateWorkerResponse, WorkerError, }; -use golem_common::model::{ComponentVersion, IdempotencyKey, OwnedWorkerId}; +use golem_common::model::{ComponentVersion, IdempotencyKey, OwnedWorkerId, WorkerId}; use golem_wasm_rpc::{Value, WitValue}; use http::Uri; +use std::collections::HashMap; use std::error::Error; use std::fmt::{Display, Formatter}; use tracing::debug; @@ -39,6 +40,9 @@ pub trait WorkerProxy { idempotency_key: Option, function_name: String, function_params: Vec, + caller_worker_id: WorkerId, + caller_args: Vec, + caller_env: HashMap, ) -> Result; async fn invoke( @@ -47,6 +51,9 @@ pub trait WorkerProxy { idempotency_key: Option, function_name: String, function_params: Vec, + caller_worker_id: WorkerId, + caller_args: Vec, + caller_env: HashMap, ) -> Result<(), WorkerProxyError>; async fn update( @@ -153,6 +160,9 @@ impl WorkerProxy for RemoteWorkerProxy { idempotency_key: Option, function_name: String, function_params: Vec, + caller_worker_id: WorkerId, + caller_args: Vec, + caller_env: HashMap, ) -> Result { debug!( "Invoking remote worker function {function_name} with parameters {function_params:?}" @@ -179,6 +189,11 @@ impl WorkerProxy for RemoteWorkerProxy { function: function_name, invoke_parameters, calling_convention: CallingConvention::Component as i32, + context: Some(InvocationContext { + parent: Some(caller_worker_id.into()), + args: caller_args, + env: caller_env, + }), }, &self.access_token, )) @@ -212,6 +227,9 @@ impl WorkerProxy for RemoteWorkerProxy { idempotency_key: Option, function_name: String, function_params: Vec, + caller_worker_id: WorkerId, + caller_args: Vec, + caller_env: HashMap, ) -> Result<(), WorkerProxyError> { debug!("Invoking remote worker function {function_name} with parameters {function_params:?} without awaiting for the result"); @@ -235,6 +253,11 @@ impl WorkerProxy for RemoteWorkerProxy { idempotency_key: idempotency_key.map(|k| k.into()), function: function_name, invoke_parameters, + context: Some(InvocationContext { + parent: Some(caller_worker_id.into()), + args: caller_args, + env: caller_env, + }), }, &self.access_token, )) @@ -308,6 +331,9 @@ impl WorkerProxy for WorkerProxyMock { _idempotency_key: Option, _function_name: String, _function_params: Vec, + _caller_worker_id: WorkerId, + _caller_args: Vec, + _caller_env: HashMap, ) -> Result { unimplemented!() } @@ -318,6 +344,9 @@ impl WorkerProxy for WorkerProxyMock { _idempotency_key: Option, _function_name: String, _function_params: Vec, + _caller_worker_id: WorkerId, + _caller_args: Vec, + _caller_env: HashMap, ) -> Result<(), WorkerProxyError> { unimplemented!() } diff --git a/golem-worker-executor-base/src/worker.rs b/golem-worker-executor-base/src/worker.rs index 5611c7a32..ea404c88a 100644 --- a/golem-worker-executor-base/src/worker.rs +++ b/golem-worker-executor-base/src/worker.rs @@ -34,7 +34,7 @@ use golem_common::model::oplog::{ use golem_common::model::regions::{DeletedRegions, DeletedRegionsBuilder, OplogRegion}; use golem_common::model::{ CallingConvention, ComponentVersion, FailedUpdateRecord, IdempotencyKey, OwnedWorkerId, - SuccessfulUpdateRecord, Timestamp, TimestampedWorkerInvocation, WorkerInvocation, + SuccessfulUpdateRecord, Timestamp, TimestampedWorkerInvocation, WorkerId, WorkerInvocation, WorkerMetadata, WorkerStatus, WorkerStatusRecord, }; @@ -104,6 +104,7 @@ impl Worker { worker_args: Option>, worker_env: Option>, component_version: Option, + parent: Option, ) -> Result, GolemError> where T: HasAll + Clone + Send + Sync + 'static, @@ -122,6 +123,7 @@ impl Worker { worker_args, worker_env, component_version, + parent, ) .in_current_span() .await?, @@ -136,11 +138,23 @@ impl Worker { pub async fn get_or_create_running( deps: &T, owned_worker_id: &OwnedWorkerId, + worker_args: Option>, + worker_env: Option>, + component_version: Option, + parent: Option, ) -> Result, GolemError> where T: HasAll + Send + Sync + Clone + 'static, { - let worker = Self::get_or_create_suspended(deps, owned_worker_id, None, None, None).await?; + let worker = Self::get_or_create_suspended( + deps, + owned_worker_id, + worker_args, + worker_env, + component_version, + parent, + ) + .await?; Self::start_if_needed(worker.clone()).await?; Ok(worker) } @@ -151,6 +165,7 @@ impl Worker { worker_args: Option>, worker_env: Option>, component_version: Option, + parent: Option, ) -> Result { let worker_metadata = Self::get_or_create_worker_metadata( deps, @@ -158,6 +173,7 @@ impl Worker { component_version, worker_args, worker_env, + parent, ) .await?; let oplog = deps.oplog_service().open(&owned_worker_id).await; @@ -779,6 +795,7 @@ impl Worker { component_version: Option, worker_args: Option>, worker_env: Option>, + parent: Option, ) -> Result { let component_id = owned_worker_id.component_id(); @@ -801,6 +818,7 @@ impl Worker { env: worker_env.unwrap_or_default(), account_id: owned_worker_id.account_id(), created_at: Timestamp::now_utc(), + parent, last_known_status: WorkerStatusRecord { component_version, ..initial_status diff --git a/golem-worker-executor-base/tests/rpc.rs b/golem-worker-executor-base/tests/rpc.rs index bee03554d..eb4b2007d 100644 --- a/golem-worker-executor-base/tests/rpc.rs +++ b/golem-worker-executor-base/tests/rpc.rs @@ -314,3 +314,85 @@ async fn counter_resource_test_3_with_restart() { check!(result1 == Ok(vec![Value::U64(1)])); check!(result2 == Ok(vec![Value::U64(2)])); } + +#[tokio::test] +#[tracing::instrument] +async fn context_inheritance() { + let context = common::TestContext::new(); + let executor = common::start(&context).await.unwrap(); + + let counters_component_id = executor.store_component("counters").await; + let caller_component_id = executor.store_component("caller_composed").await; + + let mut env = HashMap::new(); + env.insert( + "COUNTERS_COMPONENT_ID".to_string(), + counters_component_id.to_string(), + ); + env.insert("TEST_CONFIG".to_string(), "123".to_string()); + let caller_worker_id = executor + .start_worker_with( + &caller_component_id, + "rpc-counters-4", + vec!["a".to_string(), "b".to_string(), "c".to_string()], + env, + ) + .await; + + let result = executor + .invoke_and_await(&caller_worker_id, "test4", vec![]) + .await; + + drop(executor); + + let result = result.unwrap(); + let result_tuple = match &result[0] { + Value::Tuple(result) => result, + _ => panic!("Unexpected result: {:?}", result), + }; + let args = match &result_tuple[0] { + Value::List(args) => args.clone(), + _ => panic!("Unexpected result: {:?}", result), + }; + let mut env = match &result_tuple[1] { + Value::List(env) => env + .clone() + .into_iter() + .map(|value| match value { + Value::Tuple(tuple) => match (&tuple[0], &tuple[1]) { + (Value::String(key), Value::String(value)) => (key.clone(), value.clone()), + _ => panic!("Unexpected result: {:?}", result), + }, + _ => panic!("Unexpected result: {:?}", result), + }) + .collect::>(), + _ => panic!("Unexpected result: {:?}", result), + }; + env.sort_by_key(|(k, _v)| k.clone()); + + check!( + args == vec![ + Value::String("a".to_string()), + Value::String("b".to_string()), + Value::String("c".to_string()) + ] + ); + check!( + env == vec![ + ( + "COUNTERS_COMPONENT_ID".to_string(), + counters_component_id.to_string() + ), + ( + "GOLEM_COMPONENT_ID".to_string(), + counters_component_id.to_string() + ), + ("GOLEM_COMPONENT_VERSION".to_string(), "0".to_string()), + ( + "GOLEM_WORKER_NAME".to_string(), + "counters_test4".to_string() + ), + ("TEST_CONFIG".to_string(), "123".to_string()) + ] + ); +} diff --git a/golem-worker-service-base/src/service/worker/default.rs b/golem-worker-service-base/src/service/worker/default.rs index 63f87ac4b..04d9243f2 100644 --- a/golem-worker-service-base/src/service/worker/default.rs +++ b/golem-worker-service-base/src/service/worker/default.rs @@ -13,7 +13,9 @@ use tokio::time::sleep; use tonic::transport::Channel; use tracing::{debug, info}; -use golem_api_grpc::proto::golem::worker::IdempotencyKey as ProtoIdempotencyKey; +use golem_api_grpc::proto::golem::worker::{ + IdempotencyKey as ProtoIdempotencyKey, InvocationContext, +}; use golem_api_grpc::proto::golem::worker::{InvokeResult as ProtoInvokeResult, UpdateMode}; use golem_api_grpc::proto::golem::workerexecutor::worker_executor_client::WorkerExecutorClient; use golem_api_grpc::proto::golem::workerexecutor::{ @@ -76,6 +78,7 @@ pub trait WorkerService { function_name: String, params: Value, calling_convention: &CallingConvention, + invocation_context: Option, metadata: WorkerRequestMetadata, auth_ctx: &AuthCtx, ) -> WorkerResult; @@ -87,6 +90,7 @@ pub trait WorkerService { function_name: String, params: Value, calling_convention: &CallingConvention, + invocation_context: Option, metadata: WorkerRequestMetadata, auth_ctx: &AuthCtx, ) -> WorkerResult; @@ -98,6 +102,7 @@ pub trait WorkerService { function_name: String, params: Vec, calling_convention: &CallingConvention, + invocation_context: Option, metadata: WorkerRequestMetadata, auth_ctx: &AuthCtx, ) -> WorkerResult; @@ -108,6 +113,7 @@ pub trait WorkerService { idempotency_key: Option, function_name: String, params: Value, + invocation_context: Option, metadata: WorkerRequestMetadata, auth_ctx: &AuthCtx, ) -> WorkerResult<()>; @@ -118,6 +124,7 @@ pub trait WorkerService { idempotency_key: Option, function_name: String, params: Vec, + invocation_context: Option, metadata: WorkerRequestMetadata, auth_ctx: &AuthCtx, ) -> WorkerResult<()>; @@ -391,6 +398,7 @@ where function_name: String, params: Value, calling_convention: &CallingConvention, + invocation_context: Option, metadata: WorkerRequestMetadata, auth_ctx: &AuthCtx, ) -> WorkerResult { @@ -401,6 +409,7 @@ where function_name, params, calling_convention, + invocation_context, metadata, auth_ctx, ) @@ -416,6 +425,7 @@ where function_name: String, params: Value, calling_convention: &CallingConvention, + invocation_context: Option, metadata: WorkerRequestMetadata, auth_ctx: &AuthCtx, ) -> WorkerResult { @@ -449,6 +459,7 @@ where function_name, params_val, calling_convention, + invocation_context, metadata, auth_ctx, ) @@ -477,6 +488,7 @@ where function_name: String, params: Vec, calling_convention: &CallingConvention, + invocation_context: Option, metadata: WorkerRequestMetadata, auth_ctx: &AuthCtx, ) -> WorkerResult { @@ -504,8 +516,8 @@ where let invoke_response = self.retry_on_invalid_shard_id( worker_id, - &(worker_id.clone(), function_name, params_val, idempotency_key.clone(), *calling_convention, metadata), - |worker_executor_client, (worker_id, function_name, params_val, idempotency_key, calling_convention, metadata)| { + &(worker_id.clone(), function_name, params_val, idempotency_key.clone(), *calling_convention, metadata, invocation_context), + |worker_executor_client, (worker_id, function_name, params_val, idempotency_key, calling_convention, metadata, invocation_context)| { Box::pin(async move { let response = worker_executor_client.invoke_and_await_worker( InvokeAndAwaitWorkerRequest { @@ -516,6 +528,7 @@ where calling_convention: (*calling_convention).into(), account_id: metadata.account_id.clone().map(|id| id.into()), account_limits: metadata.limits.clone().map(|id| id.into()), + context: invocation_context.clone() } ).await.map_err(|err| { GolemError::RuntimeError(GolemErrorRuntimeError { @@ -554,6 +567,7 @@ where idempotency_key: Option, function_name: String, params: Value, + invocation_context: Option, metadata: WorkerRequestMetadata, auth_ctx: &AuthCtx, ) -> WorkerResult<()> { @@ -583,6 +597,7 @@ where idempotency_key.map(|k| k.into()), function_name.clone(), params_val, + invocation_context, metadata, auth_ctx, ) @@ -597,6 +612,7 @@ where idempotency_key: Option, function_name: String, params: Vec, + invocation_context: Option, metadata: WorkerRequestMetadata, auth_ctx: &AuthCtx, ) -> WorkerResult<()> { @@ -629,10 +645,11 @@ where function_name, params_val, metadata, - idempotency_key + idempotency_key, + invocation_context ), |worker_executor_client, - (worker_id, function_name, params_val, metadata, idempotency_key)| { + (worker_id, function_name, params_val, metadata, idempotency_key, invocation_context)| { Box::pin(async move { let response = worker_executor_client .invoke_worker(workerexecutor::InvokeWorkerRequest { @@ -642,6 +659,7 @@ where input: params_val.clone(), account_id: metadata.account_id.clone().map(|id| id.into()), account_limits: metadata.limits.clone().map(|id| id.into()), + context: invocation_context.clone() }) .await .map_err(|err| { @@ -1452,6 +1470,7 @@ where _function_name: String, _params: Value, _calling_convention: &CallingConvention, + _invocation_context: Option, _metadata: WorkerRequestMetadata, _auth_ctx: &AuthCtx, ) -> WorkerResult { @@ -1465,6 +1484,7 @@ where _function_name: String, _params: Value, _calling_convention: &CallingConvention, + _invocation_context: Option, _metadata: WorkerRequestMetadata, _auth_ctx: &AuthCtx, ) -> WorkerResult { @@ -1484,6 +1504,7 @@ where _function_name: String, _params: Vec, _calling_convention: &CallingConvention, + _invocation_context: Option, _metadata: WorkerRequestMetadata, _auth_ctx: &AuthCtx, ) -> WorkerResult { @@ -1496,6 +1517,7 @@ where _idempotency_key: Option, _function_name: String, _params: Value, + _invocation_context: Option, _metadata: WorkerRequestMetadata, _auth_ctx: &AuthCtx, ) -> WorkerResult<()> { @@ -1508,6 +1530,7 @@ where _idempotency_key: Option, _function_name: String, _params: Vec, + _invocation_context: Option, _metadata: WorkerRequestMetadata, _auth_ctx: &AuthCtx, ) -> WorkerResult<()> { diff --git a/golem-worker-service/src/api/worker.rs b/golem-worker-service/src/api/worker.rs index a97e1e508..376983b81 100644 --- a/golem-worker-service/src/api/worker.rs +++ b/golem-worker-service/src/api/worker.rs @@ -115,6 +115,7 @@ impl WorkerApi { function.0, params.0.params, &calling_convention, + None, empty_worker_metadata(), &EmptyAuthCtx {}, ) @@ -144,6 +145,7 @@ impl WorkerApi { idempotency_key.0, function.0, params.0.params, + None, empty_worker_metadata(), &EmptyAuthCtx {}, ) diff --git a/golem-worker-service/src/grpcapi/worker.rs b/golem-worker-service/src/grpcapi/worker.rs index 423818a36..e3f8d299d 100644 --- a/golem-worker-service/src/grpcapi/worker.rs +++ b/golem-worker-service/src/grpcapi/worker.rs @@ -378,6 +378,7 @@ impl WorkerGrpcApi { request.idempotency_key, request.function, params.params, + request.context, empty_worker_metadata(), &EmptyAuthCtx {}, ) @@ -409,6 +410,7 @@ impl WorkerGrpcApi { request.function, params.params, &calling_convention, + request.context, empty_worker_metadata(), &EmptyAuthCtx {}, ) diff --git a/golem-worker-service/src/worker_bridge_request_executor.rs b/golem-worker-service/src/worker_bridge_request_executor.rs index f966c9145..6b858161a 100644 --- a/golem-worker-service/src/worker_bridge_request_executor.rs +++ b/golem-worker-service/src/worker_bridge_request_executor.rs @@ -87,6 +87,7 @@ mod internal { worker_request_params.function_name.to_string(), Value::Array(invoke_parameters_values), &CallingConvention::Component, + None, empty_worker_metadata(), &EmptyAuthCtx {}, ) diff --git a/test-components/caller_composed.wasm b/test-components/caller_composed.wasm index 19ee366e99022b50361755ae2453e4a1a688546a..78b28ffbada700fc6f103ba4c75b2eb226df51bf 100644 GIT binary patch delta 34242 zcmbVV31C#!)qdyBOp?iD$V&)G$oggyAnXA`*d-5TlU3_p6%bGe`=a7HK> zs8F#2f`TAHM2i-e3M%$TMa3E|Z4s?vwbu5>_W#bk?@cBF{oB?~-n;kR<=k`6IrrS{ z6=lV*rHb7*Gsh7?(TBS)nOOq_lbwb)e@ejp`h(WgFR+?;7-7zW+me5@}Pi&1Q> zaNcZD(kg&}3UaJ5*3Thhtd2Ft8c1i*olbUkd*8~Wbmw%oZ!XWbDRRn{+ zU@$~!f_x$z#zP=X&C*kXK@lYU5254~q!uX03?U*p=;I=}1d-;WU@E5)A~h8e$-1;i24q#v96tK$Yp$I&an6J*=TpqgC~eic z&Fv-q$N%h-OQ&5w@0MF{m^69rQd&mK={~xL7SbYGOiSoqnw|R5Qs1NCNvI7`OjKD$ znJ}F1+GUgDgxjA_HO@utBYE>{YHAGA;lB|hWC`1>E=8cmu$&Hg!)d;AOP)nfJ^ElC z(GF)_{z_!)Snx~4A1xSUx`sA7 zTZ&3LJf)}<$Qw-w8zB^FN3G-x)gZJbjY2l*Ce<6xg7*C{c55(173u&p3ZlaH&kBRt zkt8eGUb6(G+hhgfq*y-7u>5X`1H%x=5YpYR(g{xIwCK=|zHq8Kj5tqM8zw7ICd%zv zHw^+635`R$QE!%A|CFu@fn4?3In<#wt=aXL4r@uqW>HFAY#L4SJ2TJgkoEvdHqw#N zTsdF9Ii4!%0q3cz+}@9Id_*AL;WtZg8p~(iuj2h7%O46Gh#~U<-5UrIQm>frw67{H zJGuZQREiYK7+~}eS(ahfZ&EQPUQ?>=@A{hPB#(LMgCJUduv(bX`NzP#kp2YeGgmsr zgI=YFof&s?=Gwd4h91;a{L)9s&Vj*s&e6W#r0Vom5|Y2&FWP@I(~5>}kiF@F>wCScCD7t832zT)YrpXR)!0qCT2IoTa zst32Chn(8ME$K05>);dgh_hnIbtpSg++G1{ml)U>P=SIW_t$<$nk%(IZ=_wQb zN|D8pK5mpi->XuEomFja;Wi0qVwp&RPC9qoote2_x0B=2A`mDm$%*yP4JeK}=MC-O zy=gzAIP^2;LiGXEG%)P5jgCgV)6sMH%YPoAtDJr3t)eY%-%sx!@B82XN9|A3?SJB( zt?w8=&VaQ4f&tF$cQ^l$_V;xq>RBN~Ox#(5=A!!#7*nF;np1R7wSBaPrJ{woojwKIvumiYRC0ZtJrk9%6gM z&%KO%r3fO21v|&|%o_~zgy@P0tOMCSt1bU|stR8ZUwI7DAyhug$M%4$(*&6=L7E&; zWh$zCCUV&nfj+Cc%Xw zPnr4o#gDQDizY*071a>}S*oGQ<_`6Vl+D(yw2dK9__#PhmR71Xen=T?pp}f6$DGZx zirY2lJei&lyHzMseRhpc)9BP)@*JJsHRsY^!V$&S&}nCEaV{NmZYgeqzZ;7?;_q9< zkK*qfD~iAOTOH`wu3uZvlUVSu?7omLDq8R`I-0vN;vhH{iWpSGW&(K{Cq^%A3ew~PYLq_ zdFx`baub@9m)J_@U#+rRCVb3QAG2H*$WIniX}fc^vVm#&uxg^3CE@f#vhxyB+!?%t zE^|(`Zrf@RlgSe7V>_OP$3Z=&rC2_;<5`GV<))`@Z)D%L#*HS&yD)jpqiZK3nf^f2Fj9QnGz^-ruFC- zbFGjSRD*CehU#F%r>q++mSH7FNJsdpl$(UE;Vzjs2&UWDR+y1g3o^_@0<)WqD+qM^ zwT{_g8Et(=gzY;9^3)za7UED3HuLc8BUB1G&#jL7tiYhKFO9us4o6@r1D0=!ojV=% z2b>3c<_&k5r9UHgtU3z28)A+qb_88s*dV%69C;m`iB~uiNBI>b)q57-KC-G;>l^BK zAQ}#*P!eCm5^ww1Ad+3rIVwdNNF`8HDLUX;R&D;38-xn^KO5{<>FiCM6&ac3Cpl+C z*c9<;wK?f5>y}VC=3LwR%2ZFtOvib#_o!A&xHL6%vf*J;4roT8 zwQP7Q5VO$f-lu)+2*<BobM!k2W+qdfJJSL~ub z@M25tGW;E3x9akvri)3?ef=797ql3VKy#b(sBObCEjho0HaNinJ!9%KWS=|YFef$d zR&4~sL6C~keXA0p%}7_yxD^lD>Vjv)iaxG!Sv;j${l)tuZuW+yky4bE*U;r2+gk1L0VrOJpw&bG1xJ}k^4 zmo_yD{TzaK6m|t%BB<_Ttj6#GY`<&A1F++MPtaH|F)K%>DG~>O94x-{z|`7^B&*(y zB*(v6fl6*Ki%YpBA}N+X7V-IDK;cZY3l>zSG?FT+;0}U<^1+IS@TZf_C%lGMz!c+K z&qy-c!er1~9SvDQo+5{=RA>es2!Sao83y|(>|Re)k^=i_rLckIbqG`RAyre(4Vkgc4Qx%S)kP!JHFAAUe#%1EDlLz~mGj7n#>8#Jq;_K|g3lV*taz#f%PUMu%zuXR}f^sAea4sAj>N>0;U6QKx%^I$Et{afVWO*(T^fFajY|j;db|_as%QhGtQZ5rRos*fVu;8qD zN<<)V0aO7mQZCWgAg@r8iE3Nsvsgi zRW9=Q8=B0OG^!Jf1lw4u;H@a<(y%idlv=n=m$N2PdGhW(tS|4%%@e6q+=bQ9iPVK& zy#IRY-0JN4-O{B<%oZhKe)r{t?Xp}4i+!r@0?lBb%IPp{8olB?I4p|4&kq}mzeU5_ z;qTDlZL^g#35NUZAXZGO?KYMl(>!PK@b|M`W-A8?h0%iKrs}2K8%K0H_lLR>gXm@F zpCih!Zr)~OAy(1{j$DHGw?-DY8PLJ1q@XV8Un4u=bEi=~W!ov#HZ>h2TZHAGSAV3* z+s@r&TIb}B?$FM4im~i&x97z_vUe_0EXqZp+VAG#;etBTM_bL0Kc+rns%&XC+Q*%Z zqjSa4dt}XQ%C1s}Z|cFO*(^4#0}i1jHq;FLG|Z zq-$tx!$iQ@din5_`_wAK;w8>MFE4=5G zAN-+=`A+o}MH$OfNr>?hIS*XX1{)YJUU9|1|KSW!=>W9VE6wyGdDtz0^t*c@oa~(2 z9J{W)(l5kfe~ED5ZmY;VnDisaCh zPVwl%EW37#`i6Y$yux3?G-=z_`N;=&As#aN=GE=Rw~OTKw^N(axb_Q78=3xu2uNcV zJhJ1?ple#uLTBnVQS2YBxF#o5_Y4XG$C9v*v-27ovEN)XT+}@y%{!^DbH}v@Th^@N zs@~LOVO;jxI_4GUsxj9kpI*sd-<2QTOJ&aIW0n-}=Upy%r)>hwtU4xpvRJH< zFWyJZ>FHgMj~y<|gRhuoeaI@EsTsV1GS;C8>|c=R0G^ccFFi zz;bF?k&y2w=W8ei?W{nK1x%GL16t>m(eom2Ug_4?kPlvaVliB5oO=Nq&KQ?^f}5sG zg+h9z<~w&!XmgoYvd>Dg_bQ%v9P^v+y1YX#LJ+Y==4}lQ#g-(5R}Co`5Fi|Ha8d{s zbU4fYcA@N4OGWgCQ#`S+Tv7|h?QmvHjLCwPv@*Woxaj&a`nB`a^`&iUH!J#nbT?}) ze}~ZgT_tbN!G*M!_zJCAwtykFBO=k@C5SqYJ#EffkG=7Ub# zNyAa;O_Q#nUH^&EXg>L3WV?Ry&VSd+{09c<_UduovI836{Hc04-6zK!q+GFnr!#WO zGOu+!6_FV)Q~UJIJDDE`bnh$@vdcEC^p1I%KB7O#ey>nVmq}1rIp!4%vW|28v^G)A zkI*XYn#X*1q66bjG5dISF1F*InpP}o4>?DswQOF?6Fj(>==Y1F{`?+3#Gjc~7XwdQSfG`;f&Bn98bSKa*@n#rVxN&Wh8r-OiZ{%t9PLgc z*%c?-Fx74;b`01dRC0v@-rIfR{o4kTEdfU~F$=s;-hce_jGsH-%o>*Y_`Lo-j zEG)wx-OGW+&*HD={9E88MYt~54eZN#)(;zUZ2hq3kUz@)AXE?!xP7K;$?+YmQq^)1_BN)fQmn;0?+b6@ zIM;F5!0&58|87OOtM>6}3*0!g{W0bQJB60xo7JLue8;5pv)ZnJp z!V*S6$O1Z68I@Hk0VUK@ccb0+52`$@ZhK>*QVN}oSxs0P;nC+aHy!VL+pAQ)j#F_{ z8|cQ>H?_M!Eofr3Rt$v=6ZW0e&4i!)kT+ZOHq=M$kaLk>Fw$VY(;$s3U@M*1ZyGR0 zrDf5#s!LG|@BP~+mB-{7QwS{*dplTag_G$!qk9hSo!-#L8s#Q%Rc+U?)E!f0tlKr^ z<~@S$bE3Cil(T?`*hqkvEYw^sh>3i%`Ag^aJBpnxw`R9`Td@Lhme1bHis)GkxD-D7 zH5K!UbK=$>*?;4dEJ@60D^QL8_hH+u%WaVh_A=khS9DRR$!DdF0*kO)!t;E;eZ(8* z{Y*CxvM$|lTkK=}5qA6j+Xm;{$3^fG3krb*7x1eM1NZH1S0=mm%(>+D&e%j;aC-^; z&DnhW6tpwzj-P7h@MM=f=dC+>wA8I&anX}UZb%CD2Oe{Z@7#{E-njE3v0#g1#j@y^ zPWRa5sA^ekR8zv#aTF%(o7m-X!Y-;Qk5{$0rYn8tJXbT;Gup7ryIRe+2(g3iipTn( zB0KIXaTl3kik;(kt)j2aJ{o~x=~Fr5b1uWG&7i5P$DT7v-J7nw-wI^rQ!Yq>Vz#+QO z8MCl?S>r*H*OkbM+dy48I`Zf)Iq)z=#UFOb$%ko>z(BO~Fm-EQzZ)IQ3MSaj@%e*A z&hSOO(%eBBx`uYITy&ksDrU+Liv}kKN8Z!DH14q|V||tb$ZL?toyYHi11Mv+Q_HXt zQ`UIp2R!^HwG?;HcbYBkPxa2o#eK#1d*t-Ds4#B<^U#1m@EW<=0b|uA`-J{37R+}( zT^zk(=^?ZtnyhSvde`lSpeFOOr@?x@p3|_(^X{Gs;FWuY<5f=mhN#7Eaj^@->{LNf zCg8DqpEG4i`gM)pk{8L9fDdtER`VEEDaKk!thH0QLZ{<> zR+Hkdy6+stzkc5!*OP#1>3Ymhb@`ZOYbGu}w z)Mn;(=kcYNcR9-b3|5jiaeobrs8!eiuW)z^2o|##rVcd(dUF|_mrW5%pK;bNyS{XT zW;gamb$Jg_ z=hnDR%a4|j@7z_};jB`MocC+njc8I5Z;Es@_VXH%q6Jl|fTdU!@7ry>%+k1Tc_eXa zmSm%KH>@0**t&fyt=K7U0uObb>|#BqQcJOJm=bpji&=j2e>rWUB%RiyRH7v5m`N;D zn2o%~3lZMFn93R#Ih`=ZDP1LT_xVs7uj}a&On0X*K~@`T__y+Tr5`?9>QNFY){Iac zX`Q8*y1kc?NN|^VnDk>Q9S=B5kZTP7+}FIrYGaMeTrdCp0p;Wz)jgp$<6wArox`w? z?veQ)(nvO;Q$D0if*aI)#s^pZwGU}>#B+$P031&goz|%6G#q!^xY`m2_sF@&X;Nl9 zGn1JIGnpda{t$Bk@e$>7qT-L}D*7_vyxI@yyc)+OoL9R{7vs(F_1OuthMQ#mQ#0TK zSA{J!(em*jJ&2-9E8IoB2c$PC*-K^rK{_wWY_V#-y!T_O?0P_HDV%n+3368R7NkON zzz>M^5KB2|8v|-;7N9=fDO&KBW3SDPsdOxbm14C{!>=daMDmbbQ*#ix4siTX*7b-; zjGAJ+R4Z*!k6^sOihr{~Sj#Y}++}E0#%ip!7lvH6gE{uAok z!6lRzZ*?2kk-(HIC7O)&a1@hd-)RMIo>j>?T78Nkf5#y??NjOz_L`_#FL!>b3Uwmu zMm5u4wEf+GNOt}`MUdOsxUO&cewQM&Z3n-mg<)^X#5R79^45XHyAP>TW=+D}$UgRl zeBt*v^St+v?0*YF8-El_c1B|xtcaZuKz+$b7klY>RSBcnh1$Ha7bSL1@s8Q zw&@EhxvEKGXojb@XoIV^7EZ+Vgy#yk9J~cT%fKkKE*iufOmjtrEo_owqK&?QV{p=$ z`B-n3m23V?Yp!r*nzO3%u?52YrQeg$TtavIG513SNt{Y)h_(T6om|D`4@!&N?9jXm zzogOP$RWA@ODag;tn~X%E9hE`SHGlvSQ>i!@uGC49HfpGQnlT zOzhm8&$cFZnr55F-cX+d`Xe&Y*Dy2N4mq>7d^5EP zY?PEju<*;R-%?@N>uq#AqKU#S(_z4QJ`2RpmmN+1BuiUu%K z^Vzhc}U=0YC(4wFh0a_BpHkHee(MkO5n&EM$7rq+7x_aH!7 z>lX6J_hf}VlMT^DZ~yQ;71L^2_;(yv*COc0kjsl!)e+WvjK0d=-u-uqcGUDnlLqDS z7pxZHh?8H5l&9yUw9a@|Lv?!mw8+qVgGz6a6np9Dk zrx!|LJwl(QP)J=gf{RBcKHDM-GP&k*aWMvrHBX3ZizSad7S^=DDK*b(=nFNBmXRpS zbbAEyD5mf+c#NexpKaO9Z5>$8wnQ!=u_P{J;4-3$g&54-oFqhpNeQ_o#Sx-E4--d) zsOhBJ9AyU_f?yFJo50x#H9tr3O>Bxt?Amd-jqNSV`5UNM#r--v;*SYA08gA5rByoPC$f9S@5?P#) z0SC0mqBX9_Do(jv`zetXO+*$ooGr4t3eYn;S=e;M`Q%rHXSMBxWX)oK^6mdySunRQ4iQw%xHOBHO^>-wY$L2Ul|heVWCIXi#- zHrA*r(!{kf)or|poKhVsHXwF5_JIWjC7_T+b!&>uwJet*zk&JXc;1>q@dwmAS!s>M z8&kr3Lc2{$NXoHD&VHD!Wm)K}30P#neH*;1Y};cSy{mKU?EAx7<=F4wav_5O&?+Y*gqx(_nlb_`-|{(`@R zLI()PMN5za@g^TVmmh^iR_tN^%5EdCOsA>2=X&L$@) z)X&^3H#UQ^;M1XIqBZT@Wxx7;D(%?S`?n8?*cMKR{h3fFOszRXya%G*9S}t+Mi^A9 z)HDw}9q41^Ny8t+ZsRgSm#XWL%(}hYe8q?jni1$W^;W4rp(~LOhw+VJ-Scq+%ii!C zWT@^;hP~){e&fL^%iOMty;c>gD0`A4qM*>Z@0|!%jkmv(Pmk^T%{v!U+OZ392!&^? zp?w!RZQk1u$TJM1vvc^p@zlvFKh}f#Ig^gH>9@!*jSPGl!e99}e#VW{=T4kGM_o9r zFgD|R5b^WKG}7^OKX>Hos1?qNV`XWGd>$W7Joh>Wj^zaFuT^?o0!a{9hs zLRULu-=9Kb{J!;*GhBsPK7$8tQG@u3>nZx-;ESS_(^BS z@$=grLo8p{J%wi!&)MUq-!RddIDLXOdHRHj^Q?j-UB@Y>;G_1zz6fO_)y2C;f7FHw zXC|9QA%fT8SAyTw^9*AH;soAjI;(%zBkx6onj!QSo_;+42TyL#?~~<{s2CLWrOknWWQw9Ti2HUb?A>X9AEvQUU|D-r4YRkIdH)+X}JVgKl<)jntNXJ&xe)yz5aSszD!mP_-T9iPp> zNe=7Od%<^`n??_0dv?|5Q!>V7nJ_ITJOr~b=qXVvGef-mC>^L_2E1D}U{86NxJ z$zTT<*s+jgVJHF}+uf6`O zZo+8kv^d=^vu{hC=m-*K;n%mNbJ6LmaKUri>2<+=d8W|a z?{WP0A7z_H8~n!LHxIuR_^rcl6Mj$P_X2+J;P)kdXYdPxvxWGz$}yux z6<$W-cP)N%@mqr5YW%k1SBKwAyC(hhxug)*XJM^a)fVjPbY|`V@td%G^#baa<7<&+ zkbq(L6aOy|ARm~OBp%`*&Y_%_g^tl_h+x#9xydB8Et$Q_A!9d$d z8GiXhe`+0b^Q0!^3Gusk{0ts$T1KEzILu);U$c1m>0Ew7E;9p5m~N^J7&GrZliw9Z z%`=h=U&!brSBwUzK*h}>hdz?SZx#iC1Hmk#mkeVeR=!k)`^7fDx083>E1E0Z0e@9P z1Op!gddLm);9za&CYs3$<_S|I4dIxcGJPnSlq?^aCoU8zRXXl;H<2QOeO16Yo#hv) zz4^VBti46F5TPph*)5{G+)*h2N+3_(BKnB%2siFRoU&+kemoGA)+h>4y4-uKs1Rl= z+5a|Cn0oz$F*nbiJa=M78HZc>Zqz~64_FDDdTIHl-PiR_{aTLRIg zr~2Cq0^lt0ZxMObFls|ldDk#%MoCK@r+R4?3VrJEB87p*uT^ zF6Bl!D?}I8hpwy+-Ov+81uH{$7S~D^)*dXXJt3$@FT+PhrkNb_0YT;FnfX5WN4=~UkO?k1tMo~PnE9DtUNMVpq!+fM9Axik~0D` z=P*jkOlyWHj-Z|>>WOEn;J2orASqnxd5VbsCGq+ys7NjyO_%%Ld^E6Qa>z#?9j?3h zYAkD~OIky~Q4t~uvmlWy_gqUoLMg(R)T~*$-{<$qZ?2`W;SZBD;~Ldgj=NVxRj}{W+>!ezioT`;5_*I`q47luQ?K1-*U7#XUK) zLYtqT4Um5xOI>C9b(E%KF6p5@CqZ6~OYMfQgE-={#&9ZkQLr7na|)Fdwr*3F)3;y6 zoLQmEr?(u}u~X;sCSNyx!o;a}#%kz}TW+3r>utBE{{9}{8aeJdDEz|t@|NqU7e9Aj zN5A1`Y&_+}{)3x$3)$~SV86GS1gsOy*}&?VmZRSc&83O8KG%v znj?>mhZVZd0Rl*8HM5Nf%zRW$aRiXXTrXdMQ3xP}@2hy~=S)AZQ=9wv8&5mUyZOx> z{x$xK3UTuJ8X{!v(gQV6o0JBKkj>jvj0xufCyMs-cbwH@h>*O)%iK@Gc2lKU3L<2! z{9yvM&F7s=>@VtSqr3r#6M7b!Zc1rSq@wU@rV)E`991i)PNd2tb<%gII_^*3$~Pub zS6YX2*S6TbO3s^yi->DfsCGGrT00}!w8&J4-n7?&)BTv@JuK62plM=xt-SLFbOoLp zZ=f;!6qB&?gJ;J{)TRYD%r-zV&iMQIjK6P+`G}l6iJqek@`lM&C2S z`ZFF+Rnu1bg}iDC?s6VoB_Ezby^@cwL0RUSy5CKq@+8_O(`OT(bHkbXj+?gQ6Q6eR zS&Fef+l|5XbDjj7@U0*V1$b;&&d2O~h@;Epv$JVP(hgN9pP8Q~7O#*u&7q6EI6es9 z@=<1A(}VC^5b2ba?O|k-fdZf`d?LQ|%nB~cyNFEo(prRVfn&b&y<6;$@X^+PFCm|X z-=_Luv7>q=p!#6f{3|~padd?~363Y91P`hs(&&{fa_Vh#iP*M6zH}R%*TU_!=7#;h zEK_!S2;nB#;&$qivP+A_rOwO?ay6Y+mLJzNS?6 zz60Feq7HaJ&L`f`F7JT%7WvX0G=iSy1Kx{LjxiVP<16IDchY&ZM}BlC4gr0%LVkZI zUDQ(1Y3|{=;UEk91C>~q+v~22Vcepvd@$m}zz}?hd{Ap?3D|ZuAx_+a^i>T*<_$Vj#t(xLRoY<)FB93p= zco8Rl!FUmaPcf&eJ2F60B3?v7bRu3vLNrSs4!9|3g;PrvfW&~;x%$Qc5(zodvCD&v zBy1!e=5*)4lQ^~18B;o}xK^{n<$wZ|*pLvF04VVVD+vH44&KjC07@)g%P#@ru0(7Q?YYDI`gpx@l-lFCBKR@ZO3VtV#D{H>gnSNQlG{>i2K9RAjZbNG83 z&f$B~zk4ONi7-HZu#&FLzn}A?3dSMm;p>S$OmQ#VzbJpUirSj$B&l7D4>(s%=1X$v zD(b@7f3->%^M_Srh18J7;}kxa4t2?}^=4(r3)%Ld>z=_1s4q5bpoaNBHnQDX) zRWM_|xj2jGH&@E=YU&r#BTq9vV^eqOYN{1!UdrYejpWz&)A>|e*Bz_%M8{;GwR9;S zE7zjnTKV)^9Dc8rC)Q#!4TOXqpy5R>Ww;@X8^Bfu)>(12wFNJVW;3xjK0sHr)OCiq zPG$$dY;dy13YoQae|&&`L8Q003M)6Hnvs7Git zw#_y?LJkwqeFI&2F=xi&?!8%`TSa6~y`2+*amUKGjm<^vM=64ta3(9Zz9{3y|9wKXEyzq?5%lR%ig-pO7_0qOjg+S`XDu7R9&=13*f*l z7{@`~(k)cL&#hbN+uU>Y8|VwkF59Wa0IQl8@BQ|Err9ph-WkqdH0{inn{?*KDm`MQ z3_n2~GgK!krNtlID}GH5dxCIrL*DQNRWL0NA(+sS$XP32d4jrh+jO_$7IzE$yWJeJ z)9r&Q_GveE+ZK)u+edY*Y`2YCN49cYTYE7(XXYlI5`(d_Cy;#ekes!Rs*=>_^|Edo zb?W&NFy`5DC212=mfbT++i=rA%B+4PqFPi|l>}a5DEbZY-PNo;+2+`8YmU z1;bq?`bKdu23`;dv~bCLDmIegHQ0O+4ESDY_diK37|M$=5-@6O00CSoWdH%3TNn~f zWobx>_!hH;exW*Qr~pt!<3?0qbY0@^VZ-|F>NNrz~_e1ktib&ztb+F2?S6WE}nS&9LZ zOji>)!32Ol;4ujoZUZitxh9A>Q$a2jF(k2~0IA_?5xC+FLIIm*{zg;L)@MFGFdPQ^ zeYpxv2ZvM)uo4LsTnWKB{*ozFBkBiA#t0BK$Y9V3tY2|b|>+zc-V8WIGENf!BC?*uU~>;m=FkxXB6sd zAZgy94x#>Q3ixQcaE z6W!pm*J>SO4nl=ftQ4<4`@6H1G=?P4spHu>_80v0F8$eORIF()Wo`Fj&DCzPUY_-d zUv1Aa>~9qNh0?WV_L)Yc2EfhSsj=z^!v{d9n7z#LAZE!bg4GS`67_i7i8xFNJ0W73CD%{KO3h5ybAG2BdYT3No>WtB9eg$EtJ!Bxec8@&&X}USq zsC&-QB}V9awHwI-$%aJWERkXl!aSv7I|Ai4Z0-xlF-xNY3_>KMJhI}uNPl{X0<%k@7=fQW^*2aQBOeN3K5~fl3H?2x(p+wB-X7|o=Ls{U zD6S)n<%Gd-&K~M=(HBh4SsHgn#d;c-f}=5wHE!u5ZnJ5x=clJQb_%Xs*2=%`0RkXP zM$>UkcC1rPy1kBCGV`7VcI=DtjXLVrYnv)Bf}Y1YH*ppZf9>%Qb{L9bzoC*NR?74D zLS(?hX?t;-2hWvz8@X>tgO!$jR4R|}rPSowdsJ)XpZEU9G!Ab<<10=2xtH6`E{Pks zCc9UB>{Zg-;MR@YMNKflu$F*5_v87yIa9$VLC>6cev}j@tJ6Le*6Y zO+2Rr;t+)PuU*n=7c*&ymGZggs1tMT^XI4})0IFqM)BYeA++{WE?lZ!`?X6oV}B!; z3Pse)wfm{ddB?cOv!v*xif!sreV-Wn_aFsh@{4WM^2gmqxI)?TANweq%4EiKI8$4O zmTF`u1^xkn(7+{)r+RQ1c+6Kx%@?)FM61|ba%aSyo-#cvL{gaIEPL@1=1vLnA??}f z3^#IUBW^yS(z9PWzXp?P*uyeW=6PB01jw$?S7PynhrA9we2fX9m@P-_Co9&N@3{%y zmdOi~xUtMeQr*tT(%u##&gE?dl?g>F(s1_|-U45$!Bzjb_vIpBG1MOru$221viB8rKxMzxK!`aJHlSa5Oo~_~x!?l++8eUdP+{;pKkvb&T;1;R7QLu;X z9q|ANh@i8*qp}9?C{=kyG0frNpe4FR3Uv{Y1&MAEX7Qd|1aO`B{1x?h>q^5j!>TWrjm?&}BpL&|0Y+ zneG@<;mfFF&Fsv$T?gL}V*hd!jEL#MD1*Z`haLvci9QN=>>|IFyV--rGA*9>jPzzF*!l!D2J zMZ)u3c5I$zmQEWtWPrOn%aRT0;bWtxOe34J4cu{d6j7Y|EL#?1KfRGHdr4(zJYyW< z*|GzyzBceU5{>6@HlE&w4>aa#)}^tDx^#uB-dDT2gfcKoW9u4gm{yiIomN)-^tAH- zF?4#G$#=KCX(ncGZ039kdYc0Ha@Wqm@VGW^G-MM)14}Aw+z>W?uyO2eHkxN*u;3Y9 z!aTE#jio#JQ`5{24HnSyrkUK?;7_TZX2xm^cInE*B$q`~*#b7Rlr@~$U@FSQRBZug zHkoGvIh3jJ=9wrdm#3L*UA$>#K?4;g-%H{ts7pmwtg#{fH>gndawb5bJUfipJFced z!^(Qfswb*I-3A^QOEgSelgX=VrG0k!PfcQnG?-~Mi5-qPY~pYU&i&L()$3WFss5Bn zZZuN`W0+pgHYZM0p<0vBnuCUge|Lk^E!Hc(+MLH{s%uqjgH3KaQ~m#KvN!2Go@kQe z6V)%a9Dvk#Mn68QJ#)^)OSdKr5NBES&5cOaGu3}*q6#QS59JR=J>m)!^NmFzZX00n z0dY48dX%OOKPItk?>zpxlUQZ?6^I>=31F-juM);bg@hSxAx~+&VS(2_&Ysb_9u-8y zwXCdPo^g#^ceQr%Ukn*>9BnmZ7@-Axnwiau5g}EjLbod`)D<-)LgUS;IcSnjA?bN+ z_-&O{&r?O-Gb~UV<4>c;Xt&R<+bWlz{T(w>_xr0`<#Bv3Zk!)$ZtnN@Sr+U<`N{Lt zIoVAlC%!=E6&>dqUF!(%i#hg$ykFKD&1`@FUB82qaU z0X4Ra zxx6tRi5Q+pUV9MRXiou~=vKMx7-fW$yur%P#R8(JL$jxt7z_bDDt)@Db;bP8!NMI1jIlrMyS7M#|yOz`E4Kfi@62NCB&3Xp@XhnMz z?#JB<_hT6|KN0t1$3BJoaY_juhSmh!51kg%7Tl=W=P>TaLWTR`xy_Jf^C6AhrG+OozS?je4-S=dv64*KnbI~eh!gm!4a4|FR4KPqUa{NrI77SiIy@E%(L?=eaq ze}kHPLgIsv{IICvtT+ID$WCwK1{${dH{Vk#Z+??n(-z6-9rRZxytqni-sX&2+((?; zrO`XS;})~?uMgG`pR-{fA7CVm?m^$lrElTZt`Y-{JF#JpeEu!U>A+Fyng=%5c5?vx zY|JC|%7{Sv4N>d&+u4= zgbd?!fFwrGIIvr;KSG1k6kn2*VcsIYIznST#c&q|QP!BZX;6jR2d>_j^=?bCFs;j5 z@QkVq$OsIUFjv(n-+vpUL!%l3zdctCH~y9eMH|-;@~W`mPGI#Lh*LN+@mm_$LbGI; zUQdLQ!6#q4NA~z1YM;*bqz6q$WojcF6k@NaO7* zA_6x!xJ7*T1Opxbh_Ku*ryixk5o{LVN2-72XdpC3@QESyoy9&64x~Cckc@*7cKIOO z(cph&Z5A*~P42x{gxNZ>>?H}nB6 zj+YB~_x6E3(tHmx{G@F69t{pF8De=;U+#R5hLkqZIJEgE%gC3-$Ed^E1r^Dgj#0Y{ zo0O(eL2BX@pTQxB>;y zZ>n)huNV|0VE$Q)ujezNHdl=I^1^ndXjG|+nTa&)7S^&jYrHtVk%1LsSKecul5tA6 zw3;1WX}H0|;2`Y(oYZy4Gycczi_}jEqi`U1@2xs_9o!NjQJQVcMBBqM~^N{Ebox8aRFWugWfd&e{A9) z@Dv(=Ki2P4z#l3diy!U*>ookTP}1VS9~|EV_=BUG0Do{)rKoWWIiQ0_lt^RE1Xu_9 zm4QF%-B%CzLzPx37Vs1ETEBgU6EN_{Y4y?o{Bcr;)!fZ*f2)(Zp#^nrCcshw_#>;> z3)iR@uMju&;yP#C1G(9XP6qx^G`PSY`!w*!J_i2CZ>?K$oa=&N!~FZO`-(y77{6M; z{n*F29~KVC0rsPx@-+Eh5%Qq{GU-#`H|}9{kHL5V+@q)aJ)j!M*dEBJpgnZ+v@HdI z4WK=u_`=8@N8LI>{cHT{B6}R<_p^~bPVZ%8j~Y}5V2?$30N3Mk+RLyWhwuQZ$90GV zs7E_Ifax(aLzUA2>4C}t>2X8EtrZ=s2tb3d64rp|ad;0SdbCpQ0dLUDhxa%P=%K_4 zqZW(e24-LapvSpnkpVq&aya2RWRdYax)t-sIGo4#4C9vo=W+U3hVzJq-9&8o&pgX$ z9xZ5}2J=|X17EZ$n8*5k4Cc` z6$7@!6|n@pf*2j!!zdoCF97i6UMhzHvfV0cX1+?a6*JdWEg55r?ICyirx)aVe_5?u@r^%)^xc$`DX zlpHy4Z@nthwP1dB=$IZ52@sD0Fa#JLXVVG@4>p=W@c2A#f|Me#&@+HXk!M@b>4*V- zM--X}_zv8oWb}^K$PMt0mpd`5VVWB1Mfk_CJ3th$JLaH-$G+ofAtQGjLkPefr3eAH z<0UoSffLMafH4GYhqlBDwIkvY1xZDZE6|Qb4B9a~kI9Ih1G58V0JEb6r9b}n2EkBh z2k1`5=77xxHb;>sGYXmmy$NWJ`F<`nj?B?cX}y+2crr@<*=l-Ht5Gww1d|2dnUQBO zpHnSCL2+OXCAiw&DsfhD6TXCWEbFMDsjOpnP62bE=>X;!fHnb_BQET2njB(I3@>51|~;$SMWtcr!pi53lk7IW@l)@_j_N#EC6z_=rbON_AwIh zIO_LkJdOn#k3&Hj;HrC5JPv%eahYr%;5dGUzl_GQgoh3b>lm=tN+1-=RR=K7CD1t9 zDpJ8N4~zrjAcJwZ%~HLCMgffDUQc$wSi}H}V+h&rqI+y;vu&^Gct8S}adU>j}m$-~;< zewv@sP@OA^3TXo*18L)e1QGO1aH0rm6bvnbyp*6tP;tTK2*ivX&2x&NXd;40ceV)X zDnJf^HU@N1+V3LaVC^Oi>s1X%I0yKvXH&sg;BPQv(OhQiIaJ}DAALfV#0%&J2q_`3if{2zdY+ixpQDfW~V1N?5dy)iRkp0pa!9G<9xz zH8Wg2XkTUdiDvp$K59dcVYB)QDvmC29RxM8n{Hx4(*GL&^dJf*`X}Utna8qid zwHTu#BV{Ng4JOI%XFkA487%1vDC1!OWlZ+h{k*w&gXkdzm(f`PjO4*6#NjeL&PDmC z7Sopimm%x^nj=QxA0fw)Fa=KW&+c+mOYx~6m-Vych&(Y!;JGGG+{DjtKClih&N7W$ zbmUv|wsOlbIiy77qAZ1P6Z5@T z`DLN7JMr5cUe@QEWPQ0w_|*m)lerjNKvbo4#>*WIO=0kZ#HJr>5Rc07aXvwrqQ5nc_OK!< z$$upmN5$YsJ%U)-F+RtWu{JVNHB3ZHJQ-`_SMqdJ6lZwJh9H_t|CO{#M2VP}>TLYD zGGh~BTOrni+SpXLv_$L*WKJ?0BW+AF719RnsHyIH&*(5KOpJtaM*pxVF`W>j7<(Gx$#UoSE(7#k5blTNk5m9;fg{W0aC`_qY&I zs*v+lAs2MO1%97l_->p%+5cs*?x}ml0FjkQTe^{%T0%yV+_*wyM?D)v&ArOA+{)99 z7O7D(3RSwGYh)-}e!WzbROVJu%G4R-$IYEQV|tE}7s@5W{Q3A9)91{ceItV-Tr+Ow zWHN~Ile5I6+$y2CQXnr}CMs~FHMR_TQPzLw<)RC< zk~PakK}M^F>Pu05gd7SNpNK{4^S%N`=h+~{VMPwYDaY04JopDg{8)ilY^?y%Q_su1M-+a&W!=Qw8r(i@-kPhvbSUo6CY~0 z!klSL(=>K>%6J|Qv+#IV*eXcNYwrq&!`gTc{Z@4r&8L> zoNihNdGD@ujGs7$ip-ugVd~Tw6Sc)Gb`aA{<}XX>)gvK2XYv4Z;E*eSdsXGwsn?Ib zbAD=C*OJn1^SYFc89w5&NjJ=zJ!jnb3DfRpi`WBfA**8dgcq=T*?nwE+;>0lM;W)8 zvqrEgE0Arl6;E`@W^AR^wOtKcV7=JxNu=MJGZB9eu3HrCEROn}ny2`WEAFpx+ZRH6;J0TPOOpVQU&$ z|K}Oszs_pDcr%Ql$q^|wo_00XqwD+tL&CqiH6(cm8Mp#HLMfOwTx=jnIke! z)uEPNW6Q*2zT+_$Dv^nPt6B5F!!^h^JDZzU(S1KNPgwNuN0*K>2-!<4Xt>wgs$4>6-8st1{p#rW1NW<+=FezEc)mI@}P3~X=yde^d|x`sA; zlL*W@+eJbyaSd96$ zEXS#w)h<}Xwpv4jm-SbL0?hCf@DlT|T?Q{b3V6Ijk@*d+fVVO0cc`ZDk}k8YzXdz6 zwT(Xp*D$uAssCMUunSzh*P$MEa#zP(JU`MggDnu_!>j~dtO>Jh-{N?;Kg{l7){4?Ho4Z16;9Ty)kTH z_zA@foT%GOpIRA=F?>N6uRsfKA|D@Ql;ENS7qlD$fC^Rfhak^ordI}CdS`^yeDtqzk0bH(QK$ztBLqGQDJ!bCwhYglXlq;vC}C#njN6`_vaJFH4Yde zVx>xT8?2Bw?tzqQ>x#=dja*6T`WDqXQepo2c!31=a?Zp2o;>+x9@eIWn94z^_)7E5 zDpWL6_2X1nDjEE2yj5406YfdVgDT~tK@2H1F<2pwFL(7s&VEh0Wds5Gt4@7~#vmGt zLRU}t5xyF)TGkVtL%Nc%~1i} z!I2aVX)okKjTMx;(lMMc8`*YxId?;KXzl=MRi3hJbw3=D(UUF~6SgI!PYH1;pjDmE z#Mu_^)t6Y_;?Tv%$&DFIucgjj0%Je0kfhfgMwM7;o{=vbD4x(CrxKc9w|xLC#;ey` zw-k3yO2U{Ix@huY`d%t!v4Z0CRpgcu!JNKCIw%qzUN(u7@3J+l(OS^mVD)0ld#uo_ zNLs%s>D_)Y)h8i%XtvJAt&S$6GM;XDNI&wCQf)n5Qp~qhiB7Xwey3XEk!EvkfJU>q zX4>kmi1xrRSZx&|<_+i?x+xPUya7>Xmw(_5S51W~~=T<*{{^ zIkIP1X2WBU<<(MA{XP-`Sr|khQshE-YLkDO#&uon)~zZ*3$!u02(E^Zr{L{!`8oNU|bGkR28>MEGqOpR)O zd)%uRSc!$*GMg7Q(`f0?FMF8c@fcsJKVwZUe2{GweUCzo>aFymLiU6;py;=0N@3;1 zfo@Wm1>4+UZ7a(3t1Lu9Q0BiDy@FUqDwXy1gN25zra9n*VwPj~p?y0hTdIf1K5A9ef5x_1{kq*KQ?uEl*7M!+;-js^I^6wY{=q>jsYi;jfx3uU z%>y1T3Bcz%Gbr96f%Rg<`|LW=a}MhobLtr|puaAr&tduOw6Nx|ZfuX$aAVi=1gM9W zN+GolP>b5w-jEFLB5oU;)$zJ%h%Z)O7sB5?*Nw;Dj4?&{J7`Q{nv^lQYBLs&sM73c zxDlgT_lY?XFUUnT3@h{xlV&2WU@H<8 zV;3XrJ2*DmCZu7(MJ>dt7JeMt1=)o+^h6+day|>%!KFV@Dhge#vEGiim#2EO5vcUKa-Y5vQz`%Z)2y)e7C-qipxZ(y;OJj zIO*N}?}+saSr4xXdFXqs>IqMD`0ti9*615E{@bD}Z_H&cUtk35mr0qQqt=G4){d>d zOao^oMA_=)6WjCS_gnKOcJm*h#fRz?E3xCV=D^#oSF;#Xlitu|Jg+ias$m+&rUY6dvkj72!B+n_-HA%Ll#(*E01L~({_jck`jv%kLoJr zdC_|fyD_FgX1{K|Hf1M2v)sC8YL;@W!5E4GAq{v~ui@5LHSU-?g6p4=y;Ce|oKdc%qc$M8%J=>c6Gs^HZ8o|=yc z&aJ<0_XILQPp~PXud+U#ncihTrDI&=T)a!#Hzr8OC}bt%QVap#wBPDDt8W`5R%uiR zK^h#Nxq#~{t=ngXF?;-H*0@xajj={#fM^Xfn+IDdQ)XvJ_WqX7E^t#gD!R;O!H$PF z%HCWsOguvQ`WErGqpW-GfhX~TxyX)+F$olFn(4-35f)RuQ?&np4YStGNpV&;h{VLw z57;P5Yh$l?oaoFStLc_iI(G!yYuz(PHlegO zbU(&_2&ol@HmS*5TVDT}6N?Zup3GjyW#ZXHBB!BlZLPNGv_ZGGdk7 z;7r7}W2_Vb^GC;6$B-Q`uVOA1cHP6mEnyN_t(mSb5d|N!+$#?pgw%t~RYC6M?hqe^ z#Nt9`VZ9EW8Xar2qG=~0s>RsziYn@myDsWq)|G5hkY$W$Ergq4l5*HRpO z!UgDZ#S^6c1iAYGD)4D)UjnHd5xEl{8k{DHs48$H2x7&}pRzI5Q3%LUnJ7|t@VVJy-*ZClK z^WS7WW+%|XimP@Hy&TwMnZL^}x2KGBgVU5j+v&DXL)>q`LC+0o=9yKkyC|XvxkSqd2tOu^Xrw7|$ExTuUn#~M_g>o;ACRA){e0@(ITWckSJ0(?< z(=cOO+?sV+I8;<4Q^BOUl9W$BNPo>byDZ0Ml3AlNthM1`-TqchL|Xess1I#6&_d>~ zvH*)}rA?LD_xF+>oab3CRaGM~Glai1U2nF_(UQwtCEFENO;ty%gr2P`8YDNJu#v%s zk>54%sZ8K*=7!>$ytmqsB4NvQvkAGP43?cOYE4?S#Ok{^88MXMRss9ofQ1AZk|AszQI>GVd=>J4q$UdP&fR zrxKdzf(k6ZKRD=nS}y3%D^h65WyFs}TUd;eskzOSn~_ffaTDJZKt$FfZgUM~A`bfJ z{X^QyH9*Km0SiTI+4N{0ZLmf!y4LZi*3Ly;;Q&5fl*dk5o(HC&pR*qLwSJC>vDvda zSC?m~UXZ%rYY3SOI^x4#&7;=c)!RU;Xt6`fMKY7R9D_AlEM&H7@zrSgtHmQ*^BM2( zIcmw(5k9vsDT%cF`I2tzTPuC(cxNiXJkfaXQiCD&iDi*g7c3_5V4l5Gh>61L_24S@ zWy`wVZ?D@iX})I#m*>+;d&u(6Y>Ci6XE`agM0 z=09#)$g8Wu9#zcxVmWDf!iuy&y&6UgFE%Nx(iNT39n~*1#CKs84P)CBgWZGBIh3;VhFY$`+~KJ|Gi8-0(Xp*7r$VAF)jZ51?!Pg zPZ27aB`41a2Z@Mq^U7ZFY7&*3BDK~xD{pipO0v7IW=QnwQ#BX0Y#&HJeonyb2HmUX__z0A?EenNci;(KCv@WY15>RsU z(!M(M>ap7K&h}W0dH|)Q)q}g+V`+ay(BHE=9bx9pCfU+>!%L<-l^V2`tTtMaZ(4mG z@*N)w8Amjr2F(eRL;<4*TT#PEM;!PA>)EE7}spG% z6KS}Nm@>SGq?0Ves#}x7kL!+wJ=E(?W4T_KRa|UkAYB^zTQT1fih&HRLVd{fzfA-fPP_uhQ z{rSvkvsK0ax}HOQnF_*M@fwC;e?^R~oq%HID#oK$4>V7^v4@WvHeq=MzMaZX4fGw( zbmOhw?t=7W1(TBcNcYxyeG zrnCQ&0`@Q~{XmTC|55A@vR#CMZW%86Mg!fodBc||^}SeqRzh7Fv}_Q~KVWlXsd(oH zR^IJ<=>@RlKp&uNdtOH`)py?k;c~v8UQKO4Rn;}lqgvHp@G^{?Nsvb;O)=j^GO7mMARtSX@p_wx{d$tvf)~P|EPPEqn&C2D zWj|I`g(D42DdQWct_v}fSw{u1GiI)o422qR9AsE;Y#7Xs z9~94>VdVj*w^9(|mouuW@e>=Fpt6*+KXp+2?k5%`vh_c)z9pyZmeIB2^cWw23o78B z(Q^pjt(g&rA&HwZ>sBny%$0u@@jtULKY36*_%pj7#YCH5*i{_qQ-5IxabMk&PXMLW zk6b4aFxI7A`2K+k-Y_>4-Q%!!8+2gP3)&ksn6 zD7`pw@FC7~OQa%V&ZAPzBuspAAs2o@^&QE1TKa|5SNx9iZpLAv6KQ)5z0soDwvm;u zi@$Il%yUYS$w|dG-LnE7dt$@lM?-Kh>#1((t7*!^N;W(=;5B0DtOD^0LmKPieLJ;K zr_`0QErdUnA!y)bff&PMV48@5d)HTs{Vtx*R*S#8cu(}zTCg<_Z$sR?9d6j_y{OP; z1L~zL(TFvF{^gfnVuoYvVs*(#5R%eYTfuFmgJomX6tqr0bFv|DQA=E0Mlz-C0{Ir1 zvMFCV4Y(V0@paML!%M=_V5N}Yq}(HM&_a!-Ovf|Xy5Y5LRb@FQA7$8}Ek~xs>Y)%@ zi5nNOc470rCdzdGf7o}#ysh=yFU`HMk-{5%e^6}k^1)D1Yt)XsF|EqNmK=jdS8Rhe zaO|!p!e}TeL@rfV$uAZQ$0)fOS}>NjZoG)$NYXQ7crSQL@l*_7eT{7jG#;`Ae8QuF zRL?Px7I_&rmaJ&POQob?;kXSNKyYUpJ7q}Yv#Y~}tnu+ty!tiqm5*m99+N)d9wYYl zS!LuXQe*jEGVwQJdAmgE8O(bO4`ssse~RUgCEFebbFNZ!RBDLhSycJYaeTJE^3NDf zbV%i*)<{3krP?$7{GZcWiO=Z}c#inPSbQqSz8~L2dQr}?s;4)pP37E&lCkg|WhxtQ z=T|zZSK@Fyzs_OU9mR0pfMWRC!1)+{KcE;s6X0JZOL>z=llDTkA-+%G?E=oILjk@& zXjL@@L&{%p8V~Xg)EqV>@aZ!fv7mCOlM;D*62-DazW+RYSqvJDyYHf^?5 z2EiwG3#9spH&S@0*q&UxgEJ|Imb2Wz?l;tmN;&!>RRTk9wBdWf+{Z8EM6|_iYl|QQDSl7x|Wmd1nVIU28s z9zSU9{DXORx8y4Q*Shs$8owBGnl=7~stfe4p)J2dw;84Nlw?%&O6NVCf#p#O7fx3S zSC`IbCEFGfQAmtxZiZ61iVXf-iVB11Oqm%r7`_Nqy(SVe`B21kS7-8^6195^$Kn6G zkNLxphTO^4m(oNerNhh$IRTp`WwcB3`%HcXCKT~QCchzfC6%Jha@3P+!j_?t^YCq1 zydc>gAk0o22Z-dzG-UCN1iQmh6)?2#WbwrjUBeI{X<9ZP;t1O(btr~(2&XU3(ILO> zb3V>i!mfIWgw0-VQ6qEjvpk$)SR z%QGYX&C%ESx!52&d2rPMYHGoOmZlu79c4(ZwMt$c7;cda4evQhi$ikgvvSB9j7U0U zfhsF}q(AQh@rM@;T&gYzwiapq#hoGMg?fDyM{@Cj` zu$AKD4m=}lE2V+H=ryEzez%4-=|o1~f(m#Q%|AhDDpHH_%|wM$a!*OBFAA7SUAZp5 zP+-r)V6?WTjgTjl(jx*vDV)zBg+~ptj?3ZO#2p=Z_pnSd!*tHe)aNGpb&G0gemYD8 zzLwBp%lzdR*DNPxX-kUyEWS)F$K>-GRW}3FsRs+?3>t=Z>yJ>5-`~ubE9(56mM=PC zQ#mXsm*xf9M~{~a)i;S%`F%*v7EmFKH|7p1;VfurE`f5n_2pC_)!?}8Z5H!oO<$|H zF(~yRdZswuE`YA7%@6YxO)s@e!dGGBCD$a4%6xPUT(4!!9o8Qv3dEt=Pk&5&TL5EO zcu-^%@(yfEQ$-=4>~4&Cdxe*6ZWKq?@$lnR9N&@rU9dQ(YLNj7IUlPe`~QP~7Qg0FEY~FP<;P*x!jJ1c z8Jec`w+cU*$cn88KPhK@t(QLOXcc~15L?A`O-Js0YwV|OW9uVtzr$N|y~UJ69G*-$#sp%yY)YxT@^dZr9&W^Hq#pYd7q?* z@J7X+#Jw%<&s*z0&nt3LkJ-5=agU{3`|glF-PZc*^UL`)Zt+MT{;`$yWiaV#k0O5` zis#_E+Pdt^fkkVO3Mi1a1@{o{vnNcyWs)&z`c1~<={HT9ZyZHBv9ZM?PWRBY98r{{o!z~xB7imo?MO8_9&f+ zs|;7Quj#J-{Ao|}hy-0LK*A_obRUr*E*`|Y@Y;l?8H4y_m-XpClRPA|1Z&!*2+is#m zx)?c}=kWRIV#aVVy(V3(AI`f4no*`R%Cx~13#zHv(*pcZ6kG5!_Lj1(y+3aW zZ-Q+0;CdC;`?&sr>ol%}ROlnFVqAT2jly+3u3K>3jjIM%J+AGzUc~h!uG}xpY5 zt}(c7!ZjV&J-Alm+Ky`W4Ll~^}sa@*Oj;`aovvV-e)}QIj0%bz@L z=8V~M=P)hqbCxWA9>xl~#KN9UR}yx=`f2kM2ogk!Nob6IWi!I*6&O zcwrXOW!(VPbq+@&)8~l#bG!XTfwPM-NSr#ipEONSyl=k#JXYVS$EB)u^zBeb`hnO z(Vueq)06)6!XI8*qIvMQRQ~NIQ>Yd%?EwP3^db=CrDTGXQ9B9)meIXN~RE}BlB zF@O}^9&d~@54g80|Nyr^xW zH<7utxVW1p&6zlR^31t2X8T;s)mD@}!f|HW`Ytw~Ye{1CEv!A)lEueYvUWVBEm-3z z;_xlZ&9ye7|eJNTd!h;xj8^zG9WeyI_mS_5ps@$2xJ0Kr>CxB9ho7r zuVzIo*fiv7wv6HHu{Q%Hnb>g!0Bk3(VSX{{T9)bcyIh((Pt3d)h^u(<*tM*CTmYT* z8Ymn`eaZIvV(^^s&~>Z>OB5ZiWBE)MBd$aFB=NiJ&_uG>bRFyGPoZjs#Es%w)oUX% z$FLl4s%obH7&ds^O`N5)j5euOJ~XR66srUDsw32@09sWDr7D6>b%IKDhDH^WLUkd1 z>dH&IX(hb0yH-ld)QxnhJE>9+(xi*T*JD_(Hf3l~^OU#q`@xXJphE1uuV}?2)-fr zE+_+#01%AcawQN%Sg6a|5eUY;RGiQ=Zrf)%I8};)QTnt3esq+FInDxpY*ME%Y~V-T z(&j2UdY4exy@yKS%Maoq`s9KWU1*!@ zH6msX%L&MnGjsqRNwuQe99HI)r{NmZ@&0er@&1SD9JDA}#FBY!jp)CK^}*r4NYcq= zl+;0jPLnN?pYroK*l#d>op@_5o5sIcE(XnGLAu{EkBy`Ifq6g|;r`EgtYa#5*u)Zu zj`zFhc)x3k{;24B8+(qe7sa>3v-oa@Vaw-haeLr)_BC$v=CdvAF=5;R%+;ui?wcCTVC~`7+i%z z47(l_;VL%NyG@c3f389ojz1{+E?`&KX_k9Jm$b*Fw$Qo({mN2ZF8kZM0v!*ro zvHlFm7#vT}Kf0Xg$P?}IkdVY|n`hx|AEncj|6M^kn*LOa{Es_B(sbt{_BrFbmWv71 zY&qS(t7bi8>!@*z#3s>gF}sp4TP~^>v;L{}NTq1z`=noHC$Rp6cz-dDJ3cJ}OW;hO z5MVO%;A|Q*Hc#{ z02f`60QV}ps}kUTh_oF5_YJG*4uJddhv)$S_dV2oETD1R0Gw`ln34<3ALShY_qFRN z0RZ_0F{*+_w_z=Rvq1T-p>6ER&@u(dA{{{9&2=vT8t0?rpKZ_0X{t>p1e@f6G$ zqGuSH*Y-2M$kQXBYp=0_dXlh zH5rON&N1uDNkpL-eDU`ge!aG7>qhoCi&Ocj)Ydhd*QI*lfYsB-tvb zGZt!A#9;(^#-dg{xt;ZCb3VG_U)$NG7^;dLtY^`S)Rz`Y<{veikU}n+^$WlTrPheY zcR(k=@SzE6yC}^TAFnt^ zt4v#=0#c#wdip{NHRc(mP!o1bg=*T(jDS3wg*e1#1kmbdyOmb?o7g3Wt@JSnazZgi z61FBKG(C-W5_PhKnN94}`9(B;4-58wQ+7U2g-iIH+!zEBmTCB6(^~f z&W4wlRO+vYq-R+cJ0OamWj#9C+(n_fDf}~!RguVAWC?P$V%f8-wEMpMq%f~rG>^*Eop$O8nHn(9s8n(CS=OPwJWN+;R#T+poP>w2NEkTuQJu#Y>&Njdan)Yn zwq&_S#P9a9E-}aAcpQGCLi}=&Wt?ABAMM40tl==WO>qWEZPGSl_Yu>&+g!Ggm<(M| zg8N%ZaJwvzR23LY&sd@KjhQ_O@eR}_xdZKn8T;rwp2V=>i}G7r-YOa%AVf|2RJcBED4r=w z3A$R07vGE==Y*q(Uc(cFB!ga8g=|WKA42$6N*FMMPEmu5k~8sOgu*y;97~WmUr3&o z&kx027Koz+H^L44u0#lrIHiSd;HM+-lReaY9EbtlPA@o&tZ;JVs0#QfDfa??We6h> zFl5iK(QVV90$1WEByhV1hn#&R+%RG%B8Oi-Al_IDZ|R{JA|Zb_0>}z{w$%?PVHUc4 z8!rg}lUV4&k5`}(`C}5acdmY50#XETG&FFFl}4O;lB*#X5`s7tgt-x0``#ge1h`wb z3A$DD2L}@T!hDt)VPz5Mk(Yjz13nrOjg5y*M4T@uJ5rAgVEVz(JNDn&ZlFYw{*%;{ zxj$z)FnM zo{a=)WpJi~e6=+Xoka5HUROE2i+bp9SonJCMky)E`bR|tZSRvwsL@hl+ zw~skL5@D`v6mP!3ZqHUe&mI8<<%tZSc)ghoibOb!qK=#wv8?;0${KrlN1B#*zsTC3 z-#dQ$BD>UHOuOu<71D+r@tZA>Q;oRtj|hjF#iBp5&b{hr^voPs2Ig_Za>P!H^5cgJ zq9|Yx_sZf(tr7qDBP%9GGXKQ#6789VKpB9oz9L5a3FkXki%0&%23!=ev9rP(j2j(u z!ct!4M>U#G-A&%lF3xOO@#A=?Eh(D4Fh5P%&q_z1k-FE~aF#uQK1B=%X5y&3O`(qR zq3v6v%SixRt@wKXg+iEiugES_N8~ZlIRTUf{R%081f$2OnU0QNdR)#Z$hHQjkK=O7n!x+?E5ZLpE8! z`J!JkWf6P@8?@e6SxMGv;=+K0@T(@}uAyqGpgCA?7NcKfg}u&5KJt-qUR}i}SrsJP zY}YR)wvk#R8ee5yi0@BdWqB=85M~ic{uR|Q0Bkgu(P~M~W^MEXqV!;N*c2HU!*!ma zK})q_SN&dPFe(>c`_knz0BmH8B z==?q)Iiv=_OM*=-?C=vE-?Fz9y0cb{J&I{@mA%8b?Omx>n(CKOo#~rfQqEs+4K!rj8T6#{ts8Hr1=-VfA}( zIs3dtXZ*Hnk08#VDL|Y7?bpa79CG87jiS@n>=M=}W_`_4 zaJ&C&)+v!(O*xy6_OwFn&8Nf*U$f0@g_!&e%k3sl6@?@!45~L2FzuE_g9ovc+DAgr z6ORGJadUXiz2C5QndC{Zxg`(PT_TSlQK%~Oze9eSqna3~U<_6wMoe#QO{2*FmQ97~ z)qKmw=BYu$ocb|oh{7D~k%P{ud>P-7z#2XX)zKtrk&M7%%gv) zjMiB_p-o$d_fWtu;a4p>9N`gsnJdX!bbD79o;#xKsg8wFZ)|E++eFPNmeT$c)m)_P zg^Mce8^qNDML4>E)F7<0e1U2n8tic*bO$b`COuluE4bKT?%>5*?Pc0MU~~{Y z3NN-_jj7u}G=?=A{kjqs%?%PeM!xu2fXCDv?1FOvcC6AMHNhuDBLW?ZZYdt&8K7f9 z{CKdj{?^z-(l?>1gpTcMP|&f@BG9oK`Kx4qm(Vdv&1N<9t7HRJJxu$=w%>-1ouC)} zE7g_%}1Ce}>pXT!u~(%CREnS_(hHWB;vFmVN6f{Eud^++(WWA-CpXxPp% z6*U}bq`EGeFwal{f{C4!4=pgU`LE96^g*bmN~gq^1&e)Ygew` zMKH09RLTB)n4pgFyAEh?XG2kB#*^f}WBlKvvP@V8#2HZd3 zVEsBNekl4?{h=)ioM6Y!19m7t#Opvbnj0ld>_8*I#Cpn5mvBZT2SSMvL4d?Y$+;R{ zo&3m~jf4>kAqNn#eqC)|(5nOVXd}e-)AP9qv6IgbLaYjP0T5e+8}MOQvu6k%_8NNz z=&&1EBfw!r`1>-SnIws{K*P{7pkcQJ?It0VH|Y_*JPR3isF9Fi?PX__CLC%6FwE#m zg2d9DI#Ey0QMj=4sw;3|ZQIK6L7i6WO0cl*xs(|}g?&#t9EA!yxtma7p**_~&9YL> z&jE#1HHkJZUYcG_vEwpvWzdFln@yrW{C^v`Y*fgzlJklo5lpbT%y(j&jRL%C7&#l&?V< zs5fn#xy}C%wj42KtA6{i+)c#7c?}iL=tv`B!iM0NObHU!swn6`TQqSiDgh_i+E&{=rd{e=Lv~9aO zoCN@3qhYh8Z5`jlAweAjRXdJT-r1?xG8uezEA^Luxt3Y=e8?hUJw;vUUS$p*63&RIfMh4*Acvp+M7pjfO-9~m7fO6%l6X}@q)_*#4E2e<>PC_`4L{twhG8`2A4p1kqR7b)1m?rD+4Bh z@LGUg0^ntKpjt}T5GF~bSGuOuQ$exd%YpA|bGa((q5}3rqaLM-N?;Q5Xl{z8d5-=n zng<#syvv^1RiDm*ceU=*i)p+9#ykFnDvn9)d|d;)>rT1ZfK7O%QIIjvT^HHIi4Wxw zl?S+s)CkzF*-1*}BT5D#0op~11Z3AfdA2~FkF$YY#~LNDi-NFgGI_hqRWxVNuX(jX zb|HU7CQpSU0F>)DxJe|}eN;Lc$tA@u2Z3CK0FtXvvWpHlKrSQ$$dxHo%PxtI0mrq( zQ6~%^QUK!`YU{}bP+X2oC5j7r0u&d?6d0P7m94zkppC+I*=qS~>dRZHFIs4&z7cE}WDRWB0QBhNV2l5C zj1R~z2-OC5-3l{2U#|e{iq=&%fWUP*x*F}C0qY`N1*&Vd?Vh2l#4W}Fpe|@CVY*y6 zBqkwUq?tS0^TX^uiRrpeVY+^%6$TyZ!~%ICDWTu3X)Tzpg=DvMl!R9pbjrsDCgH;- zOodji5ey4ztx#BN2!&PV zWkLe5y2_uq%7k1Z04ztEA^KbgDs&70LmZGZYrcIhYH;O*W z`-cJy>y#gh@&o{K-Y2wrpJ=}eoLtTn1IwaVn1?LtAV@w^2E+~S&z14nbnjZuFQxlk z<^0Z&Lwb9pyb{nZypsS>u5C|VAZGO9p@38P4^-HC@zb{aCXe;rry*YD5%2fnmB|E* zp?~iIQpMz5T-}>r72DUVfLhm!-Mx9A(S3c#ZK}eJNqc^1VP$t z-+LRH=Ct4wSM))!S|J|p!#_>liuSTl@_G~}fo=7O6@B@DqVYgc5fp4T?$n#sP_PY1 zCq`!bBor)eKi<>u{+>^C?Z>-h{DgOsqCZw4y%KS!^10%+etbx<02d`@4-c)%55W>hVdK^iKztu#+%!Su9xyHarXjnMBuMU zsn(~kR}7#LVXp?X zwZ1uhMP?0Nsq<@bCz)-;o#TE}s&(C&tKtsf^>Vz9Zz~2~hT6_RE=#v=_^CHPoNhh* z6OLkMh%uM*vh+c~b#+B)TxL~cvyEc9JEQ54m(3Z_lwHHGObvK_%%y3rd9x?GAN4i8 zvXKwqV(u26SC&%2eE7e0O_)1*#`I(@)en%4K4#*K>2v1Jo;MM&n6ZE^FpaUam^S>@ zlnU;iGimD0ZN;Cr@E)#o4d9lkEJJ6UvGf=}t6+9^@l(8GdPYo=YX+Zl`^-!yUCZ+4 zF-_E5!SMg-aWj@3)0R(eQ^8v}a8I8wZPFaAoj)7p2-lKKC*N|Yag>wPbHy7^@ls}3 z@5g7f0glCJX*gHA-5+EY3uOC!j0HW5T(GP_)4r|zB9@$}AX>$9@0dBM7=myWG!5F$ HYhC{jYZ?k% diff --git a/test-components/counters.wasm b/test-components/counters.wasm index fe705379459ef16c01e61af1babf0230dcffddfc..367e44d1b75fdb96ead88249e27448d255de03d6 100755 GIT binary patch delta 32898 zcmch=349er);HW$-FLq?>6?8c>3a!~gg_FOB!n%EvLlPApr8;T2w_ix%edSdKt%xs z3Jp3gfQTqAIH2P4XvPN}zy+Mg1yM&_#&KpG2iI|CRNnuo?!E~SAD!>_zMt6X>RL{n zI_K1>b52#?zTqM5*2i5TrLJjVNMVX+2pi^EAByC#B~7eWQB+L{T~goNtFG~qWee*U zH8(Ns(cWiyjsN*br6x>K6c%S`Gg(ZTsm5Y47MscGuejYiuDb^r^dB-^GNH`W=&sCk z%g30)*K<$ngFcomQha5}N$90%M$^1s)i=#Rr>*Nz;Pc8%=TVrxvepegmL*pCQe`6M zThh3A){Oeg=QRV}9c(*ut1eaHibqknmn(`-G|^DFM%VElJGv7qdX? zh%oEUm9TgUPbsZO!>p&OWE8i)6K35!L=`2oZ|l=3EVuQuFiW#?@{44#yMEE7Ng2l6x8<}q?Q%n{p z4>k-MmU>3tfrEQbI{Tb+=U=#R+?7{cT0U*W$WiqdH8wTRm|3^zI(9u<#pcetmbI{0 zoGoW7*h;p*zhRxaopB{_Ia6c2me(4rh$~S}H*ZuuE2L0Li)bi2r`AyMtm$i8;&F5v z;XxKKG=rPWQ1u()$c*ygArABnwUVQy!7I5IFcf;!a3fGCNDjyrH&P1`%kMW@5I|~+ z7F5kp=^CA@Z>E9>@~l1$o-Cp1>tsGaYXQO#Cn1x1aJNJV5Eq2ZS%Rf*lY8QzL`q z=z)ff5;Myi3ehM|!`ihKjr4W&qy*9=W*D*o5MF&Ra>a_&u5<5r1eGcw_O+(cOZklY zG1UuUqJvETWp=O${gb~pZDi?}qiAA3mb%q&bJ972kIJ#}Rf^wxvo zqs*TC)6GK9>ciHGGqSp6OH9EM!^V|?8D2cyC|a`4toRzLB-T~Zz$~91<(8Nb2YV^E zcG`iKUBfqS5w+O^(7~^=`}N(o8F=U$?E$xKp{HA{r!c5ptb*4D)AvwTAVBngQjTR+ zi}2>qSO({G>wGMi=5*tqZ4r0ol%cCva*8LP+|~E8D_fH932=XmU1JaBm@+@ges(Ot zG$4LEBuiYAlMyQ?K|8E8=-?>m>L#vCjBpZXN|r}KYg3D;q)-&|1pZ@VLq4L@EtW7S zCU1^vrlxNq08uFuvNexf)CUhd%`2&#z*HwyCVuHf#qb=R& z2Mmp9SWEhgnQck~H1usWTFN~$LbQ(YQ4uIhx1j<5hA74X^+RAtEz2iVMj@s>^z$gg zV|Y!iA?gLl093owc(MK1dQN+mXd{%KW^pCAaqA{da0A<^Wrnpndm+$TC5VN(7mtI!%TEs69vj{clE9|Ocl z^gDMkk`W_3ZlZSajbFl&9twy|36G$=fM0{2Th~ky= ziii*+xdi15Z!xEtjTA(m$R>G#Iis(VgO_abI&1>XT+L%^xJKsS_A3;b2B+W(-pdvnpWCo_47=Je7Qxy-0zedngI~jwub6 zrZsmR5N3XPnlzQj3bHgp;3LLdqWbLo7^zP(G!zIdYmT}wMqFcaqYSjfg_IiA)wuDH}#3B1Boj)jGZF>~@_=q(EEiMG-hf@%(83TuW+ zgCfHl>Sbg|t`IT}*rc8zD-DJU#zwXK&|V|u6LsnPs0V3xfb(+U_u}RlqG(Gkb(^{% zD1;QoLC_kj7dIPeaChH!FvDDPAO7kG2&@vA4Re|36N~~lAW0Cd&R&X8PfzC6d4BtToy!K#9Q=0y`0WlWS_=c zm*lNn$W+4x-in!na{UBCB`&@xt{r5QJB$OVPiLHZI^)FW`9_b8aS((S5@ncD#nUh$ z+qTLa9Z7G4xtGde()BMG>UWH0(<`ni$c(Y2G*o6!kHCI74ej>D@n39T@LKw3EfAoa z?kGH1Of6uOTqTGmz;Y%Qb&{GkpgL7f7OQdlUt0Mw3y4y5v*`^yF|*vr;ZP}1TIkPZ zuho)Y;7Eg16tRW~7GvihX1s4S#^^KE2J@<=QKU!(;Wj_2#ApFG{G)TpkO6uT1+cLW zH}p~zbMS}|%o320RI9ZD1K4E^(ZEOz zJkv#j7=w=ZuYZ00XSK;Z@x#9_gT-LRnwHAuC`GN43Kc4BG~+GHS6;ppV^G0dOtb); zL-gV|;JZMd8tVLrAA?Y_3=np5T>=%IF;NubusYuh!YsT8)Y3-Jk zhZa2-Fou0%8CNc}g!~losn)uA1Z8kSAVv`0B0gOjS9~VCL@Ws0%z|x&J}PN0kTStM zpr;^i&^tiEGPo2YhDSg^6ATjL7xa4^rWQpY zS8}po*(~N$$r#YAp`e@gv1ryc1RR5mo@stS7tjQE8QOek6%u4s zF2RH^jR7=mUxH(_;*!OhDAd~v$(13P;GnZU8y*7TxH={%(y6g_yo0d@9tA#xZRYs@ zMhE}j5NDn3`(*}OmSwQL`M?_`KW(pN{eQ666tVy8l$f*b|6+sf8C4^LO>JMT+pt>m zLdYAb9QsEheySlyp{z~}xtL-JQo@phujW{C;H0$V+?FM0!v><|U7|4ldqT;;u)m|lpl?O3`~O;^M0rSt8P8i$#Gr>tMOY z9MhGi3vuq}Ojpz)YBWh42i@9s5gcTTBD8<4&0d zSSMj=Buv|^&P?0Mj)?zK(>9PyBm^b&CrGB1_UA{f=aozhDyYu4ELso*eyBqbGJ7q8 zh)WB4#H=cTN`=?bg4t=vkMx9zVHB%-rOT&WRb{0DB|qQHZWL&7abJu(@j0j(g}5zN z=lZ&L7G|VAt@%WVQK(z&%`Fli=H^~NIFPlQSl&IR*IwSO@I0JYgqV3PmI5e6hS5XV z-Ij92-5UQ*L@8NB3#XeT-Y2Hyb!R?tO(KfTbm_U1DTV1yB2OLL>jZ^CVSCCDg^y;I*YMMl;YIJj*G)?X;smha z5ZVbO7D6u+L_#_YH(3G^gc7jG!rfQYTJcer)N!`sLNH+M!E{78K-#?;d7|8weJlx> zf{y==X=wTHis`t#aNpbFVnD$_z7|pDf*!W`(C!64H8vE0=>A zQfWAj6}(djoBoLK82vrR_n=tcD9$hn+4o|uQ7pC?1Npk^#UG4;2>kxqF!}!Fc<5eC zhLs9+sX+@HxRZL)AF{fnC~|)evjte}5xpV{`N5Uqj!1-V&qZd?&4?D$ZEUnCqirkt z#9&p^2P?V3?1AN0e@xsEeLL-Of(L=X5^cB)KOD(0M%uM^=LLJaj$n_A6J3kga#2*+ zg|&zgg*PC5xG>Ld0ApD~@<~V=y7fkBS+{EZo!c#f`ZT^>a7i-Z)iBA&$8AS`JB3ojRu;wwSUJBxh` zgt)I{G>G~|NmurkDC*x=f5;LTYK?%Y8W8VSj>OeP9P6JhW>iJG?_EhFvF%Wh4K^_4 zm{>~97Aw|Fk~6q6d&DoRYIQ}6S)AF6nbAQx|5ggb$5J3-wruBvG#IgYG)_HBSEmEt z15WWDWpNVK?O6PUOLal1%HS!5x*_)5yn-B6I9+3NVK*?#w>Q}QhzkpmG&o7G&W13- zE+@}7>TZi7s62|yM?;-&s?vcrvQT}v@;gO7I3As5 zdrt2VLvlBiDvJ4BY)r_FxW2)L7=Fre;vT?eGmuEao_hO#j3O51%%$e$*ocruW|!Z* z8xVL<6?Y8HiE%vFjgl#;v3a1}a220`8CI>2@@MN!D6@tDaC<_Wgc$!R$OZ?T?qpJEG7n3Nt-+`o1ur&AfY2F5yr0y|yR}{#Pg*6j z;TT)GI-_hHl+&!T{)qxu^rXbMml?6;)U6Uofi5(UlS;)x_blZFHnR5ZS@L33GMZ4X zl8%S&HgDaI>O@JYv`Kg4iFEg%22<`Akhz`EV{KJh>0rJne2P=spkik|7; z(fVV;@dl}*AWtyr#(+muRPkdiB33c7s~lrUA$>&4gEz{^ht z2h(C$GZ^zw6w7=Ufj3%SpteVcNPV-V&>keEW?UP{{4#pXuqd1Fe#!iZOusY&WD(3oLX({5(nXSb zkN}!19TaJkU0I6ACBy^xAjI21V9@V;OnK@{{=quug04Vpo3=)2%|bpHicx6hn%il- zy%YsOOv6n`6C^A>F-^v;JrtNh2B=HX6s1N%l-LAK<%}}Dmzv2-&4Y0pNR5(26U_{s znjMna`l;DuT_HSpYBsHYR(y#yUSje~&1--iLPn-irhK^xeGODFY0*+UwPiAJA_efsLQ)=6 z^IFA+_ck?{ho9;RTL4uadmB$KEB)c><_7b_fc0?q4m{kQWj*}iLp&r|>1&pncOCbS zkgc(bAA7}4zqo!`gXy;FtowdsgSqZ|0!0fvicu zu1}MkO!R@62^PKoP;hcj6`UAJjtpG?wB)3bhiXYq7b77#rwa}!04`e#c^v1uAX2L7 zxRrs=ICCSK4S8bCn4t7MkGkWgIOG9 z)}}UYV=-ZaFogmUX28}$P>h7uX9Q`I2cgX%4yxg6h%mJlt)XR3svd(Jz_vnwivmIf z8?ZoE)CUkhDF@n@lEMO@=1P(hz0IBpfN$q)vvcT3kh&BwpfG{2$t+Do0R2+Uxg`2+ zQ9vbAJLZqLVEO?wzacl11DGXCO>eV-imVY>Kwme=I_B4FsBim(6;Wk=)JISxO`Cwe z%Lqz@iN;F1&Vk(&nWrR)~T)lrjb2g1C`AMu-9oI-5@IF43;VyIfTF} zq7?(>uuTDwOUz)vvp~#HX-`a!+c0Fj$gYP@xp{TMiGni)s$x`f>knN}49p3jhmBSAj4fP30OTQsi`$4$jFG;l5jdS;Hpmi0&a8j3RQ80U4e(De zM2Mz2bZLZGQ?L}Wz|0vm-Q1?T*-#oWTP&v1gvK73$s$sRDpZWN9BmsTgbCm+u~>ow zAI;Q|7;aZnsTyFWG-J6qt}Jbg(z3JQ4SOrA~{i}45UUO2O9&L6Zk>_ zO=5R0MaNt)QzhmdQ6ux+#uU@IA1bXPU16c7{%@$oEZnBb&IvaQ4Z`hoG&&BGodCNr%-}KDFvmhj>6ADH-rHHJTte0HYF>Ko`OZ z<5y_ckpedsY-ai~Fa0p5iGJuV0RI5?GBUhsEmRcHKtAd~8+v5Vlm+!>V3C6dfnMN- z0SDQE1E2f`B8Wo>Xe5kOuWKj-QR7fR6!tXz=643ng^sMMj!NhJ2)fy)x3| z4Z38c$%|)%iSS4zNO{Pp=@>|&06+5Gq-niohd>fp6Ud=J5}JT07)11^M@b<ahUriUZT!hiL6RTWe9E91>cYgv90Ln9 zNAW4vDl%QU^DbLH_YFg4u6$`^yNVc&LuEdxIXaE3>2Dgg$cCD7;qcrqim# z;~=_E(SO~7lo9{|KWC!2e+>pYyZ;3syZ$-_w0~*r`>M*b(ehB`qrbGle*pWBRpWnd zypyWOvK8Xa>MVZb5%EOzuiEP)oFwVvc6N5@l^-!-Ku^!dj}Xc46)gk)$=(-N)@1uE z!Xu<6?yRYx&8@>V-MiWwpBtFUVk#o&?ffOBVrJpYmB=1gFquSyTnL=aV^>A_#1J>Z z6%+e;aVnCbb~Y)hd?C^2RVref*uC)rpuLZ$za>@=%;$UW5jzLw^nHqS zpb{vz84AZj2zzS^FZG4a{tnIoK%?-wj;D{zPXY*^OfRpyDL^?D5MCs~oQt zZx8BzF3#*gLdfUA!UPr4KDwWfa_O%-_34cwXLr?>c0yAu>YF7R2dBW9!we=s3N0~G zJyhe$=U`Pc|OEkhv zQMsl@-FQ_%k9s;Tt57X;8dfSA+I<9nv?8 z6In5m$+*=TBS}WcT3t|EqdYXR>|z}yq(EgGX&vimMb@zdtxEu;GGb&NCwDN9lWg;t z0|M!5T40R^Bgt%8u920w6osW5PJfaB8HlDZ z3VFf;kj_F34wO6)9JDG1t%|r|@sz8O5lna$6g8AB4ZxpIJ4lFnOQ8>WfMy#^M+C2M z>I4`g1(BgOfzF`dz)Kh}5lF&^?~`~+JITbWfstgpAlc5h2Q>x(0t{=cWg(HJQlpF^ zt43N#)EmYC8e&6GT1m-4axPjMhfSV4;zA!3k{$QP2p@$D$d5*IonqzG^xiEf3s z?XbK7!^$Zo4x0s7>Tz<(RBM#!xZ%XwRB*tkg5A%D0Z<&tQ7C}NN4-c2!l8)CbTt~o zD?)&PLv*ZFRmN~JClU7{U)v`wkW(}QO?_wsSwu?3VY4L?a?sp7<{U;M?G3uXGR7v| zMjC^D$e=NTHdc1f++}53x%auSzwp@Lt~h!Rq9kbw<79S2AfVRhJrwd!vk<~H<6eC$ ztaWID4-3>!B4z+VPd~$ zsF@iH(#U8VKruHxiTc(AzJt`UVm|X!B4-oj5OCUHq7(*4TAOsc)a%H?Amxq_I02&z z2ug~PMMf!WDMT66TcSk#t2SV7pP@v07Qm0XH$NrxD>-#cw%InyYuhUGHd7i1n8)Q1 zAF?>-9J;|g!XjiJuO{yXQ0P>gjFZVHYQ7E4Z=!~HbB@S@QXzF&-+~u`BC~P=miN67Us##q@pFsp{DSR4|J&3zA3o)%x>kk*lcSQfP;l*SYZXI5N_j6wv zo`=7G8J=q${Gw?JQ&1l<>>@gNMyl0`Y{RbGMmwQS+yMtjP}!MOSbWH*!KvfDs3T?F z@)7U?kT<3^Ue{C*@`V$qZxM$^_wV^S zq3^t4YaqsFK64%A+$%>(T1houmO0x**_f(~FDPGbdC*jI(dM3tmz1v>6FGAe@xnQ# zjlNVPNI^OH)}*GedA0-Pv>a=MIr+sl=Jb}>Mk<7B^TC*rnKBkcIu$^$;hjfG6DIr6 zvF9i3@w>;CvCZPp*skmg@zvP*80n00|Jz6l#3$o=d2AF#&RJF2)<}qr*tj6IfWgp7 zyv?HFtcL(EYrF$b20i7R@j!L^K)Lw%Dd_#k_z9=tDwhJnb;yJ%30&`(P@d@de(a8ccOfGsb${Za*kX&Q~O1a%4>l^`1oN{U90i1<&qbZ8d?M`!j(z$*49lOPK z=Z*-%$6Za;4dopJc;yfHYtFl0(L`$0^dQp?-6 zirc3QI<+uFItO7bh6Uog1LDG|nWf}) z(hFJi0}5;C0ZC$)Oj127g{-d+h|N>e__`;><5PQP9-;0iJU5O=KT&_1o*`o2P3=~` z|1rR!aI3umLxF5JnOzHTTl2UqoNKs;u`1q-oDJfv^ZSP^y1C6y@oMU`;^yI#T) z$y<6wi1b#%JGb9UKzAq3?>q9edd_PLP6Pd@gd|TISx6jiM*^ydkN`2SxS-$^EbhJF zmtm1Ut#ALI#UkLKVbWP7A}uI-^|ayX7OCOYS;9#c*6{=4t!X9tP1`}MDz*stDaFdF z?IJw=ets8@YEIAZW4%0YorEA04^3gv1mZAyP(&C7v_y$N9Qf^0@K|z z!-vZa70eG=PB}RUiONkD56n%od;~UG$t&}W)KabhOoT!!ufpvZt>BD7j~s# zL_PQgiI0fdbb6wQucOQmr|Ok>5VI~S<*)A+>o2Mb393aR>NdaIE#A0j8apB?W>mLx z(@}QL8^f5ymd3Eigqg~cY_Dnn9u zNzi4@{F(i$65Mlobvl!gGGI#T=|AY@v6-j$k}opqGB5o3o=C~`Qnn?=11#l(A(;*B zXUXuVbQ;y%DMB)+RFholEje;fx=HN z{Tr&QB#x4UYc?8(x1#zfXvmx;sDsID?zjh!&K?vwI&ND2G3R2=`cE}&X!cLFfMe#% z@NX@3@Uhi*qTzqs&VjzlGU7=dfC8c=a^8bx=l_H{vpU8EaXAafd5m`m?vWX)(S|?P zJ93+Fs^4B&u}b27IUMU>J1aADouv>dZjEuugUPU-9}`c{8c(Z7VD>q_IE8kxB0MYR z&Tbe+(+0l>W4Pc%0c!9hs6hu8Ol-VcBM;=r_xdT^Ofw40(_E&=FS(d~BCfh54+hU|mvqgu zU^*uXt-}HOzo-NKJ8|Tayh;mqcsiB}vNvN1CWdzdRg_y_A%$dt2mHWSU(+H==2pd| z3gM&(NhFWI0xHn!;-)ezR>i-kMkC-HGgg8Sa$D{rREX*YKg0f-WQThNro%= zO0rz6O`8M*=grap;wMu@(>dJZCL6}0Tp{r-C zq#3K^d+lV04zLmNE;Uuj=6IdTu_0^jmkH~|CfXHgv!3aV3RuVH%T_)6>0PJQ;e(>C zIqfXx@rcz3C;$(q=`pKRW@>OP;3CC2Og8*blcdAt)_p#m?V`bnWAk#@tK#4Da=TMG zUgIDD7#VEAZFUk1_by5rDm54c@i-_hY#1DrT}A1f+x~-MdqY05UuYPKzoGfnb|JQ6 zsBqGJYSTD>Vo0{J)`kZUibMEWorB`b`Gd>st}x`ylnl~u!5|hv=_ua*rf`X3_~$R3 zOGowe_K?7zgdfyge3sH|0Wq)#L?$% zi!X`Ty6dAIbex3H`uY{|$kM^d2~d;=K>uEv!|!YnnT=iPHmI>0K$ck# zw>Rcd-rmOk#S&EwW4ERd;$c5pFHGZflP>#s z0q@XT;w7IzaqAzIODUrt2!OZuidfTB0VY1%lquB$)1LF3?!)YM18j=TZ2E>$NCRI?>2M^mKg?u(}>gI#uFPBaN%7ZTJk|d#BWB4w^ zxtvW0#U+0Z4Kto7WgFYH`OwG2!y9y(JN?T@&hT6Ft+< zeSog&rFc;sP8cwP3W40AlY%Rnl4U2fQBMs3X3G_%Sf0P)>)6Re>`Z(4a0(q}G(SeN zKt~aA=&jh2pel|ZT);C0&SWv3Iu|rYmQcA6DnliaqPKBH|0_pHWg~Z7Ec}4;O;_dt zznxc}j(M-E2=nn*{WYPYKAPK zX*7RMrk^V5hZk=w`jO58F0WnFgyzFz6attZJA(9?@j|5M#h*V#EmyaYTAtQY>0kkg z1^e%8Dd0D?h-X{I=15lI=q-a%#2y6Aa4e)!zjj^T6^%zOPY8)*Ir?v0{xtgRy&~U{ z9?h183s$sf1W?pnmnObiQ6lHNC62I`$LJq z>9vwlrju#zpp4Lz^@u#^K|Xa5cpM>>U0}%ft{jHJe7f?q!K7YWYvKIJ@(i)?+PR&N zj9>SwWUDKnM>7H-S6|oP78LAxIGhu&T}OiQ`E`w9OT-ggg^(}3ouHIg%?MPIj+&&hq`6%F_TNxkEjy$6$FZl{PH=7$yhG!5a+1mr#W&sSuE$awC? zQ5b-Cb%KfkTW|DTU5kR|)h!_3x2qF^;V6mdntgglOyy9%T~ijceyaq`*CCG;YsUh} z)oV%Ywye!{q{|VzgKLXXaQC`w5xR-k6j`6>#}UA-H?^Qj;mv1ukUTK!G|9sj90p`d zAq3u%JV;SOqW(9@;~naeu-PKu7m0hbU_3*vMDy=GvEs#KSb zM#c2HXdTh=?sY`VPR4lF`i`P#@#W3+jwr%)Nr+q8yanG3sEG@A&5_HfFSOE zXM@ThOz(>*37)#~Fkjyy-q?8I49P0m7w|R&3KZb1m^$rM6WbtebO;CO4U`Uq75!F9 z5ab=?a0UXPh<-ceDS>RXPL!B2j9G7O5trOr61$Bm$iOff2BQqrSVO8`1}$h1#1^oL z!bPazxMS9tFN8gAruJwC#brkm%oh>zzGmB0W0@nwn!!MPBoVZ-yE|ImubLEJ{ zz1mhm6qB=-TRV6dtaV5kp;!H0s*i01C4yQA)lw7DcFWKbqL3Mrr=axaS6Tf4IdcW-F@&d+x4UcL2B9@|F1vAG!N4G);AClH7-+dY+3 z#)1Hn$r+kM{+$L21cDYB?jsn1bLGJj$zMWDGI5>7M4&BGm3#+fU?_m5AQUjRKYn@; z2YB}*w*l{)m>)h(DY*@#?~q_Gl3*of_ftj`7>alAjlggH@!njvd3VnC$t*IO!#j?* zDS_KZ&#GHeH)~$=6~^LA>l^1RSbQ0{fgjZU%Z_L?Ptlb;JY?f?;p*MHyrNIve*G(} zst43vJZpCS9Fcc_sir7RiWqZ$l&`~Smizm}YQs7zE6N@;XC3ZK>K4tLHNSqgQP*sw z%NmL-&p>+KqS^JA8;h4U8;j={7cXA6Xm(SL(LA@_SWv&nnAc<&7o&)tt%}G|lr*M; zEQ-<(_Y~X*53Xx!s&5qU+}|tZ0^|`E4Y+6G-oixA1JU75_BOkC5AHr$Y~3ByFU!;w zj(lnw#Dy^`S-6N2Iilr(zC4fbe*6K>QgT%bi4`cx$Cay!gFA=Ko{nt7X%X&G+#Bl_ zT~cq{r(iF*ilym5D>nE0Se zJo8{YwqV}HjdhJzl+9Y)SYOuEIIFCwxv^});-;o6dN($q^4FTKbiw^%TwQTZzg$rY zUDha_vT4ZgiECQ#-n}opxc-uPi;O{oCDKKdC^jye3vLjq^A=rV%$zwK?UPV{vP+Li z5=}t{jp`EIiSrj<(d-P0n7C+hvr%Wvnp@Xsu^9LcH0Cu^(Y!@X^Jdo@MiDh>LRS!j znaV1_2>_13y*utt;_k)$x464;clt5r#hOkQ9;1FiAPB?lOq+;@S0OOB&}bYOcF@K|NZn?2b%(QZSA{^_&7pLpR#&FI>#dr{x&no(oMO`Lr0 zc~dW#e$mWX^>gMoU4C`!#%&Kgva9Xz!;dUl{H(YrdZkO%dZ}|%R@OVdyo*|qoTnA~ z@?AY$XKG0$@dw<6TA^0t?H3q-MoX11!|%-+IDCLQ%j+x8a7AKju8Y-HYhztyn&0E| z)EYgsps!M`apib$aAV@=s=lGVp59)6OZT(K_VkuyEbk!AKeR2LMuRp&1qUi8|-yKS=ar-MvwaoaFgJw?-j`I0O49^|q zog5nNiTUH-j_`L;M~<#ile~WS0FS?=GTSpy%{z}J_X(}|^_*pa_`Vy*%?hn7*E4Q@ zVEM=`Pc9$eDbc38yZcA@i(IM8cTKAws}1mkYe_6xzw@qqv&6UcPc40uSr>Pb=51MX zgErq4QhgqM!_1Ms=0Wjq{Y~B_=_7uX7EBAqruees*SCyRuN{`0zH(xL+Z}(Sr)x-r zE$OA^XuPGiAY9{OEr&~%e-i&k@i@(|@fG1S#|@4@Kgi9rb6vUpcuP{LHamEpKmKra zmr$wZ^YA2h{Pq<`w6GddFVkkYgBnW?YSkEBkvBTN<(yy_AXDj0LRDYP6Mw0jf2CVt zs>_An)c3f(9$(m>7sw9gg!H6fvZkvkDXG2;mZ@d2Y&FM|%kp>uUhnIv_QGOXu2%3q z>^^=!e?Z&m{TKhY>j(a$dcyb6 zru7@{fAp!RUwHAr!Pp-@{^JQnlVV*}GjQ`zTs3&; zu;J_0PrhW?{sV_!JM#9QemtQVGos7i*J8`h^yX?f|HR}J&$%8|%k%qGuj*0p;RT#x#o>83OG57f;mue6YwIWce<+uZC z{6UnJRh*^9w|NJt$?70awYR5h`H66rw=CRCjU-2s<7>3#t=WO}RU2Jpu7MD@EMNTD zXmc?BW=_x*KjDhMAN=x8waV8rJuSZ18-K~=&l;%u-PPU^-k`fVkgr~#o$rgU$jb9) z_+sO<_>JzJ+k%-|#TKpQXm?N0<%)0DTfXryqr{EUwOagHHCIgz{iHs(_43UFCilDV8;-b6rJRNCTOHP6lqb0Y#3C0wy2Gf^ai3(EzfYyRJxM;~$R7F{V-H-LI znaYK!o0XJIqabL^Eckor=AI?xM(N`1$4dE*nZ5G=J+rs+qfvR+iJ6r@un#JkKT=f~ z`k-oOQr&>EtStk|^Xf)@mA_?NZNIvS#~Zdxny@%>cI?h)ww$dTs+(N@+Lp=6(a1T< zu@BCD_`|v>pM4xT|L~_<&Nr0L&p*y$7br^OyP;Q_FWs?~91icqC?hANE^IX7#&0Cek(4{ND3Vm#j#@s-QXLC)}@q102yIC>=`PD8w zAOC9cx{;UhfR91W*)kqwm*VH`eE2rWJ0Jtl^$wE zLNrusyqs@R;YNA17JR5stx>(si=b*oW*Emx522xU?cwWA_5S z!Y8UD0u@^9N>-U%jFI})3IO%6!D^w4d52&ZyPprrp3P8+njj0ild0ZxNnFMaH3>W=Jeg$DcSFV`! z(7+83r}3A=BIDu8;pA~SJ_lLsX>ifIf9E^3sNmk{X(S41nn-?KRnIRe>kRSN-}rcSrugP$fjWv_^p}Zy50Hw>rAnIcW+l(7ThixfSCA%CXVmU;)Ak;e@{uu zXS{I@LAyxBJa=n&IAF|9CgQL)0TV;_=68cwVmf^6|>_skyp@*st$R=aD9a9J6xf3kPTM}uEDrw;rcbMJ-A-N^%kyUxc-9c zU%0{9aU-tVaqYtO0?2wq_Oh(j@fj>doY&TcKfXaMYdc%r?9JGHuXe=MmX?xp%D1+Zya1-@yvD_g=*wG57yqFPO4DVW zN3Ws7>3TOrc?Ke|7+B{;wqDy6hnDaGi$VoUo&8S+(-0`s)5X}A^F`YWSu9h${X$84 zFM}Brti+ZTy`Ik|;CwsJ~-yg~`7w3-|bmCjb1;n{4Hs_OfjM)Sv9-{?40BI?%I|CTkCD$5`H^VXCG* z7S$Qc*n`wWwT3TqY53P4ydF(9QZJ`B>HbnxCruW;L=;=wd6N%b>N@hYUKBbMLV+dP z!J)&)_|}vXcu4DvyC-qB1YEuJ<$Cb0&7#BqbKaGl#%>^gvqmvhTMoG;hmgD_uXepK zm&-6dzS=<1X$16fxCH{E;%7`;YAu9OzAmcb0DY8x!&x61W%9?Tv1^GRK`|70b_j&Q z+c`+vML3R!hB(-xA6n=LCwCai9fpoNT$b7c=YJ$kWG)zr`JDXW`Di4?v(rXk=_!rG zs>AuAJwK>&o1Vh2d&TarA47=xC6z5uV>A}~!Iz8LDB!9j~a`1RjT`EfSt zfy@yVltlt;!9K2uMICIC93oCcRLW6nQHQt#JwU_4&OFma=%;T9Gdlip9#*m zh<=tP!nhv!NjYQrV&kioY^ZqY)o%Fv#j9)n@1x{!ryV88#d`MtgsspKr?d6`PKHkk zUmt{DzcR0;k8OZ)U@b`{y)=S3_}cH`=8129|Kk5I^my_0vqA$P>?HH%rgD9#Fy4qm zJH43({V4}T@BN^RMEmhKrlII)XGJ~UtmxT?PRuDf<`eBTL0kj75vH@mntpyKvEJ!} z#ELhkv2^kNo81cxQW4&$r;NqR@iPPT(}5B67?FF?dT&wqRw1hvqu=Vox{9mb%EI4U z-kR^wMzeH?4k5>}30mM@I+9r6>|DZp>Jgfh9T&KtZ4!8UIO{GZyWq~2H5 zy)zYv2p!aA7Vdr|{1)!7y>o$yAJHKFXXi@&7x)$qTFkN;6w=iYA37~(s`_9PaPguw z-jLKiAep8Q77N}zjxIJ4mlQ|E;#XF!E}GvX^59)g`4edNL=}79>%oG%-+k{amKq{8 z7{q}IPVW>$gX=|N(E9^es_=a>UhI3n(A$IFiBj|uas2&mIVA>k3JJ=B`DS@zjgk!X z@dKbl^Ri>hAT8HfYq#t#u|_|2>{_Qtj+WkTv8|VLKe)mvlH%84?tc8iN)+8p08cHt z=EFqMsQ|M+TJlq^?)qr?PZaI0{CFVCN|ImS1mWdxo`4q6tyuQM;)XxQ#IpA%h$)|B zv9#SwJ_)l)h$Hk;ym)-`#%i`(Qi=7e!aPRsmS_t2ul`IK0QM#%h7dl*Qe_#5fXj>yfLE;zqLlkg*W3n z4&a_@ZZ2=ov&4IU9?L33@n0_NQf1<^dejFk3wV8`d;$GZ|1SK}JfIm z%N12~`;}Mr?ccAwZ{L0uvnvK%+<&%LAB@BJ-BT=c~d9{ANMSt0Ss7kxNB zfpl`sps4$@8w-goU-c1Bep$worX(ty_%T^TzbfF#7bdb6e1(lh)UD&;#dc;7G2-i9 zJY}x^cot8+Dp6AU&s;I+n*yHJn8>>On{p_n!{5|o*e-xID#r!L6vnr;_;_yJx1%H3 zo%skk2^S%E2!KWgwNt8UZr}a`>Sotf)%WRBF}uEh^?>1dr+5)vIyw>gBM5-_`?uZF z3&M_bk@&c;F-(?@`A39DsA8^I^^cx-smt+Xx}G63kN%@5SlI6Bbi>fPii+MB<}{m(S9`k$%1#NyG@|D1$n zH1w~vtQ3E*7Fqw+Sudon68HW)%zBF@KeUMI@52x&O1*?sxlCR3Lm1+?On zHh$d0`;L`K5|I->MtQ$k_9L+`Ni>~E<^8AIS-r(;c&wb0sB!l<;ai}cSk*0Ou{f_j zPZoUsS?HF3u-<&YS@vU2>vYDl#@3LlI0O5)&Gj>uG&c?mHFbO(lqSWQKH*!}JP*#C ztT;H0D#;J~cE}yl`W$1GzM<}g^$TY$xuUl9N5*dBn}V&kaTcwRUvaiR*No3MvzVf$ zr79Hhq!=tmI6=cFj@@qg5#!WUPhDE;pE(y|!)`m3a;wJrM_=@6 zi|Q8EE2$}$&1>#8YcZzvB1FwDbtfKWRH!BK27g*o7 z4)$!F;9*^KQV#8(q7HSFxqg`o5+_;DK1W)UTgQ9wMIXI4RqNJzmxuXyxVzOR@pFuy#lwam)~pQ|Xmq7MQ#yrQrC+Yd)0ctwAiu9SbPus2Nvb}Q`^ zUcypSec24FDSk;1(PPc!_IQ2x*flSx{hTQ_Vh zQzkxU#+dt*8IE|9Lj#2+CM!a%&IAW>6jg>O^0oGPtGL`=W`V8txY$s{vRfDVScG|6 z*ZJ75n6EY9XC=(vTIpv~d7!J<;zzlx&nQGr z!O%GimNm^)GTq4#Xc}_4b*tdr5J^tPP3g5p>E* zki2yXc2Z`~<1DS6?FuW$T&YkZtdA09eU+}PpHj&BE8SS7(w$W)Jy^9;#0KC5E{0da zD=L(pBweK>T)l|(y-BpnXyTUB#H}E?>eE^hW+UBw2{mu)Wnngs^=sW1W+QU?E4lcF z=8~pbrZv?sn3JvKxi2B=sn&PNeIy<9*x}3MrIhClVDy!Mr?{%Rc*5#p-qf@tKLMq{ zT`!?npD*`<>;$C42h4S3Nf^}<#sH%=l)?t!7bqgFqf=OaeIQo+OvxzrA*tBTv-l_~kHYtmUxKH(DpU zA)>oeSucE?{ex6ioP?jMxB3jB&!pC@G!`jH4&YdaXBG|^A(V>of?V@-z$2y9q=Z|i zrm-$bDV{VwSFh!gh^ehB(pXV2%@bgDzp1THq_M&|=^aU(s${^(RI;WmtZ$yXc=m;M z54}lDCHAzz;tU|m0iZXXI;YBQ^|A2)dl0qZ!Jq_ z=>cr46u35Uu+i5#A)V!6+SR49d`!FbsVu@%EJDi9(6iJI6iaJ;D4pf9^w!U)c1CL+ R#?LZavEZe*=4P-({|B|?e&PTC delta 17787 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 US=TL?QAw-UeW-K`-w7@IZz#NeB>(^b diff --git a/test-components/rpc/caller/src/bindings.rs b/test-components/rpc/caller/src/bindings.rs index ebd802342..7970ddb75 100644 --- a/test-components/rpc/caller/src/bindings.rs +++ b/test-components/rpc/caller/src/bindings.rs @@ -131,19 +131,147 @@ const _: () = { wit_bindgen::rt::as_i64(result0) } }; +const _: () = { + + #[doc(hidden)] + #[export_name = "test4"] + #[allow(non_snake_case)] + unsafe extern "C" fn __export_test4() -> i32 { + #[allow(unused_imports)] + use wit_bindgen::rt::{alloc, vec::Vec, string::String}; + + // Before executing any other code, use this function to run all static + // constructors, if they have not yet been run. This is a hack required + // to work around wasi-libc ctors calling import functions to initialize + // the environment. + // + // This functionality will be removed once rust 1.69.0 is stable, at which + // point wasi-libc will no longer have this behavior. + // + // See + // https://github.com/bytecodealliance/preview2-prototyping/issues/99 + // for more details. + #[cfg(target_arch="wasm32")] + wit_bindgen::rt::run_ctors_once(); + + let result0 = <_GuestImpl as Guest>::test4(); + let ptr1 = _RET_AREA.0.as_mut_ptr() as i32; + let (t2_0, t2_1, ) = result0; + let vec4 = t2_0; + let len4 = vec4.len() as i32; + let layout4 = alloc::Layout::from_size_align_unchecked(vec4.len() * 8, 4); + let result4 = if layout4.size() != 0 + { + let ptr = alloc::alloc(layout4); + if ptr.is_null() + { + alloc::handle_alloc_error(layout4); + } + ptr + }else {{ + ::core::ptr::null_mut() + }}; + for (i, e) in vec4.into_iter().enumerate() { + let base = result4 as i32 + (i as i32) * 8; + { + let vec3 = (e.into_bytes()).into_boxed_slice(); + let ptr3 = vec3.as_ptr() as i32; + let len3 = vec3.len() as i32; + ::core::mem::forget(vec3); + *((base + 4) as *mut i32) = len3; + *((base + 0) as *mut i32) = ptr3; + } + } + *((ptr1 + 4) as *mut i32) = len4; + *((ptr1 + 0) as *mut i32) = result4 as i32; + let vec8 = t2_1; + let len8 = vec8.len() as i32; + let layout8 = alloc::Layout::from_size_align_unchecked(vec8.len() * 16, 4); + let result8 = if layout8.size() != 0 + { + let ptr = alloc::alloc(layout8); + if ptr.is_null() + { + alloc::handle_alloc_error(layout8); + } + ptr + }else {{ + ::core::ptr::null_mut() + }}; + for (i, e) in vec8.into_iter().enumerate() { + let base = result8 as i32 + (i as i32) * 16; + { + let (t5_0, t5_1, ) = e; + let vec6 = (t5_0.into_bytes()).into_boxed_slice(); + let ptr6 = vec6.as_ptr() as i32; + let len6 = vec6.len() as i32; + ::core::mem::forget(vec6); + *((base + 4) as *mut i32) = len6; + *((base + 0) as *mut i32) = ptr6; + let vec7 = (t5_1.into_bytes()).into_boxed_slice(); + let ptr7 = vec7.as_ptr() as i32; + let len7 = vec7.len() as i32; + ::core::mem::forget(vec7); + *((base + 12) as *mut i32) = len7; + *((base + 8) as *mut i32) = ptr7; + } + } + *((ptr1 + 12) as *mut i32) = len8; + *((ptr1 + 8) as *mut i32) = result8 as i32; + ptr1 + } + + const _: () = { + #[doc(hidden)] + #[export_name = "cabi_post_test4"] + #[allow(non_snake_case)] + unsafe extern "C" fn __post_return_test4(arg0: i32,) { + let l2 = *((arg0 + 0) as *const i32); + let l3 = *((arg0 + 4) as *const i32); + let base4 = l2; + let len4 = l3; + for i in 0..len4 { + let base = base4 + i *8; + { + let l0 = *((base + 0) as *const i32); + let l1 = *((base + 4) as *const i32); + wit_bindgen::rt::dealloc(l0, (l1) as usize, 1); + } + } + wit_bindgen::rt::dealloc(base4, (len4 as usize) * 8, 4); + let l9 = *((arg0 + 8) as *const i32); + let l10 = *((arg0 + 12) as *const i32); + let base11 = l9; + let len11 = l10; + for i in 0..len11 { + let base = base11 + i *16; + { + let l5 = *((base + 0) as *const i32); + let l6 = *((base + 4) as *const i32); + wit_bindgen::rt::dealloc(l5, (l6) as usize, 1); + let l7 = *((base + 8) as *const i32); + let l8 = *((base + 12) as *const i32); + wit_bindgen::rt::dealloc(l7, (l8) as usize, 1); + } + } + wit_bindgen::rt::dealloc(base11, (len11 as usize) * 16, 4); + } + }; +}; use super::Component as _GuestImpl; pub trait Guest { fn test1() -> wit_bindgen::rt::vec::Vec::<(wit_bindgen::rt::string::String,u64,)>; fn test2() -> u64; fn test3() -> u64; + fn test4() -> (wit_bindgen::rt::vec::Vec::,wit_bindgen::rt::vec::Vec::<(wit_bindgen::rt::string::String,wit_bindgen::rt::string::String,)>,); } #[allow(unused_imports)] use wit_bindgen::rt::{alloc, vec::Vec, string::String}; #[repr(align(4))] -struct _RetArea([u8; 8]); -static mut _RET_AREA: _RetArea = _RetArea([0; 8]); +struct _RetArea([u8; 16]); +static mut _RET_AREA: _RetArea = _RetArea([0; 16]); pub mod golem { pub mod rpc { @@ -1653,6 +1781,98 @@ pub mod golem { } } } + impl Counter { + #[allow(unused_unsafe, clippy::all)] + pub fn get_args(&self,) -> wit_bindgen::rt::vec::Vec::{ + + #[allow(unused_imports)] + use wit_bindgen::rt::{alloc, vec::Vec, string::String}; + unsafe { + + #[repr(align(4))] + struct RetArea([u8; 8]); + let mut ret_area = ::core::mem::MaybeUninit::::uninit(); + let ptr0 = ret_area.as_mut_ptr() as i32; + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "rpc:counters-stub/stub-counters")] + extern "C" { + #[link_name = "[method]counter.get-args"] + fn wit_import(_: i32, _: i32, ); + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32, _: i32, ){ unreachable!() } + wit_import((self).handle() as i32, ptr0); + let l1 = *((ptr0 + 0) as *const i32); + let l2 = *((ptr0 + 4) as *const i32); + let base6 = l1; + let len6 = l2; + let mut result6 = Vec::with_capacity(len6 as usize); + for i in 0..len6 { + let base = base6 + i * 8; + let e6 = { + let l3 = *((base + 0) as *const i32); + let l4 = *((base + 4) as *const i32); + let len5 = l4 as usize; + let bytes5 = Vec::from_raw_parts(l3 as *mut _, len5, len5); + + wit_bindgen::rt::string_lift(bytes5) + }; + result6.push(e6); + } + wit_bindgen::rt::dealloc(base6, (len6 as usize) * 8, 4); + result6 + } + } + } + impl Counter { + #[allow(unused_unsafe, clippy::all)] + pub fn get_env(&self,) -> wit_bindgen::rt::vec::Vec::<(wit_bindgen::rt::string::String,wit_bindgen::rt::string::String,)>{ + + #[allow(unused_imports)] + use wit_bindgen::rt::{alloc, vec::Vec, string::String}; + unsafe { + + #[repr(align(4))] + struct RetArea([u8; 8]); + let mut ret_area = ::core::mem::MaybeUninit::::uninit(); + let ptr0 = ret_area.as_mut_ptr() as i32; + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "rpc:counters-stub/stub-counters")] + extern "C" { + #[link_name = "[method]counter.get-env"] + fn wit_import(_: i32, _: i32, ); + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32, _: i32, ){ unreachable!() } + wit_import((self).handle() as i32, ptr0); + let l1 = *((ptr0 + 0) as *const i32); + let l2 = *((ptr0 + 4) as *const i32); + let base9 = l1; + let len9 = l2; + let mut result9 = Vec::with_capacity(len9 as usize); + for i in 0..len9 { + let base = base9 + i * 16; + let e9 = { + let l3 = *((base + 0) as *const i32); + let l4 = *((base + 4) as *const i32); + let len5 = l4 as usize; + let bytes5 = Vec::from_raw_parts(l3 as *mut _, len5, len5); + let l6 = *((base + 8) as *const i32); + let l7 = *((base + 12) as *const i32); + let len8 = l7 as usize; + let bytes8 = Vec::from_raw_parts(l6 as *mut _, len8, len8); + + (wit_bindgen::rt::string_lift(bytes5), wit_bindgen::rt::string_lift(bytes8)) + }; + result9.push(e9); + } + wit_bindgen::rt::dealloc(base9, (len9 as usize) * 16, 4); + result9 + } + } + } } @@ -1662,7 +1882,7 @@ pub mod golem { #[cfg(target_arch = "wasm32")] #[link_section = "component-type:caller"] #[doc(hidden)] - pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 1425] = [3, 0, 6, 99, 97, 108, 108, 101, 114, 0, 97, 115, 109, 13, 0, 1, 0, 7, 149, 10, 1, 65, 2, 1, 65, 12, 1, 66, 29, 1, 122, 4, 0, 10, 110, 111, 100, 101, 45, 105, 110, 100, 101, 120, 3, 0, 0, 1, 114, 1, 5, 118, 97, 108, 117, 101, 115, 4, 0, 3, 117, 114, 105, 3, 0, 2, 1, 112, 1, 1, 107, 1, 1, 111, 2, 121, 5, 1, 112, 127, 1, 106, 1, 5, 1, 5, 1, 111, 2, 3, 119, 1, 113, 22, 12, 114, 101, 99, 111, 114, 100, 45, 118, 97, 108, 117, 101, 1, 4, 0, 13, 118, 97, 114, 105, 97, 110, 116, 45, 118, 97, 108, 117, 101, 1, 6, 0, 10, 101, 110, 117, 109, 45, 118, 97, 108, 117, 101, 1, 121, 0, 11, 102, 108, 97, 103, 115, 45, 118, 97, 108, 117, 101, 1, 7, 0, 11, 116, 117, 112, 108, 101, 45, 118, 97, 108, 117, 101, 1, 4, 0, 10, 108, 105, 115, 116, 45, 118, 97, 108, 117, 101, 1, 4, 0, 12, 111, 112, 116, 105, 111, 110, 45, 118, 97, 108, 117, 101, 1, 5, 0, 12, 114, 101, 115, 117, 108, 116, 45, 118, 97, 108, 117, 101, 1, 8, 0, 7, 112, 114, 105, 109, 45, 117, 56, 1, 125, 0, 8, 112, 114, 105, 109, 45, 117, 49, 54, 1, 123, 0, 8, 112, 114, 105, 109, 45, 117, 51, 50, 1, 121, 0, 8, 112, 114, 105, 109, 45, 117, 54, 52, 1, 119, 0, 7, 112, 114, 105, 109, 45, 115, 56, 1, 126, 0, 8, 112, 114, 105, 109, 45, 115, 49, 54, 1, 124, 0, 8, 112, 114, 105, 109, 45, 115, 51, 50, 1, 122, 0, 8, 112, 114, 105, 109, 45, 115, 54, 52, 1, 120, 0, 12, 112, 114, 105, 109, 45, 102, 108, 111, 97, 116, 51, 50, 1, 118, 0, 12, 112, 114, 105, 109, 45, 102, 108, 111, 97, 116, 54, 52, 1, 117, 0, 9, 112, 114, 105, 109, 45, 99, 104, 97, 114, 1, 116, 0, 9, 112, 114, 105, 109, 45, 98, 111, 111, 108, 1, 127, 0, 11, 112, 114, 105, 109, 45, 115, 116, 114, 105, 110, 103, 1, 115, 0, 6, 104, 97, 110, 100, 108, 101, 1, 9, 0, 4, 0, 8, 119, 105, 116, 45, 110, 111, 100, 101, 3, 0, 10, 1, 112, 11, 1, 114, 1, 5, 110, 111, 100, 101, 115, 12, 4, 0, 9, 119, 105, 116, 45, 118, 97, 108, 117, 101, 3, 0, 13, 1, 113, 4, 14, 112, 114, 111, 116, 111, 99, 111, 108, 45, 101, 114, 114, 111, 114, 1, 115, 0, 6, 100, 101, 110, 105, 101, 100, 1, 115, 0, 9, 110, 111, 116, 45, 102, 111, 117, 110, 100, 1, 115, 0, 21, 114, 101, 109, 111, 116, 101, 45, 105, 110, 116, 101, 114, 110, 97, 108, 45, 101, 114, 114, 111, 114, 1, 115, 0, 4, 0, 9, 114, 112, 99, 45, 101, 114, 114, 111, 114, 3, 0, 15, 4, 0, 8, 119, 97, 115, 109, 45, 114, 112, 99, 3, 1, 1, 105, 17, 1, 64, 1, 8, 108, 111, 99, 97, 116, 105, 111, 110, 3, 0, 18, 4, 0, 21, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 119, 97, 115, 109, 45, 114, 112, 99, 1, 19, 1, 104, 17, 1, 112, 14, 1, 106, 1, 14, 1, 16, 1, 64, 3, 4, 115, 101, 108, 102, 20, 13, 102, 117, 110, 99, 116, 105, 111, 110, 45, 110, 97, 109, 101, 115, 15, 102, 117, 110, 99, 116, 105, 111, 110, 45, 112, 97, 114, 97, 109, 115, 21, 0, 22, 4, 0, 33, 91, 109, 101, 116, 104, 111, 100, 93, 119, 97, 115, 109, 45, 114, 112, 99, 46, 105, 110, 118, 111, 107, 101, 45, 97, 110, 100, 45, 97, 119, 97, 105, 116, 1, 23, 1, 106, 0, 1, 16, 1, 64, 3, 4, 115, 101, 108, 102, 20, 13, 102, 117, 110, 99, 116, 105, 111, 110, 45, 110, 97, 109, 101, 115, 15, 102, 117, 110, 99, 116, 105, 111, 110, 45, 112, 97, 114, 97, 109, 115, 21, 0, 24, 4, 0, 23, 91, 109, 101, 116, 104, 111, 100, 93, 119, 97, 115, 109, 45, 114, 112, 99, 46, 105, 110, 118, 111, 107, 101, 1, 25, 3, 1, 21, 103, 111, 108, 101, 109, 58, 114, 112, 99, 47, 116, 121, 112, 101, 115, 64, 48, 46, 49, 46, 48, 5, 0, 2, 3, 0, 0, 3, 117, 114, 105, 1, 66, 26, 2, 3, 2, 1, 1, 4, 0, 3, 117, 114, 105, 3, 0, 0, 4, 0, 3, 97, 112, 105, 3, 1, 4, 0, 7, 99, 111, 117, 110, 116, 101, 114, 3, 1, 1, 105, 2, 1, 64, 1, 8, 108, 111, 99, 97, 116, 105, 111, 110, 1, 0, 4, 4, 0, 16, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 97, 112, 105, 1, 5, 1, 104, 2, 1, 64, 2, 4, 115, 101, 108, 102, 6, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 34, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 98, 108, 111, 99, 107, 105, 110, 103, 45, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 7, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 7, 1, 64, 1, 4, 115, 101, 108, 102, 6, 0, 119, 4, 0, 28, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 103, 101, 116, 45, 103, 108, 111, 98, 97, 108, 45, 118, 97, 108, 117, 101, 1, 8, 1, 111, 2, 115, 119, 1, 112, 9, 1, 64, 1, 4, 115, 101, 108, 102, 6, 0, 10, 4, 0, 27, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 103, 101, 116, 45, 97, 108, 108, 45, 100, 114, 111, 112, 112, 101, 100, 1, 11, 1, 105, 3, 1, 64, 2, 8, 108, 111, 99, 97, 116, 105, 111, 110, 1, 4, 110, 97, 109, 101, 115, 0, 12, 4, 0, 20, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 99, 111, 117, 110, 116, 101, 114, 1, 13, 1, 104, 3, 1, 64, 2, 4, 115, 101, 108, 102, 14, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 31, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 98, 108, 111, 99, 107, 105, 110, 103, 45, 105, 110, 99, 45, 98, 121, 1, 15, 4, 0, 22, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 105, 110, 99, 45, 98, 121, 1, 15, 1, 64, 1, 4, 115, 101, 108, 102, 14, 0, 119, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 118, 97, 108, 117, 101, 1, 16, 3, 1, 31, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 45, 115, 116, 117, 98, 47, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 5, 2, 1, 111, 2, 115, 119, 1, 112, 3, 1, 64, 0, 0, 4, 4, 0, 5, 116, 101, 115, 116, 49, 1, 5, 1, 64, 0, 0, 119, 4, 0, 5, 116, 101, 115, 116, 50, 1, 6, 4, 0, 5, 116, 101, 115, 116, 51, 1, 6, 4, 1, 17, 114, 112, 99, 58, 99, 97, 108, 108, 101, 114, 47, 99, 97, 108, 108, 101, 114, 4, 0, 11, 12, 1, 0, 6, 99, 97, 108, 108, 101, 114, 3, 0, 0, 0, 16, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48]; + pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 1546] = [3, 0, 6, 99, 97, 108, 108, 101, 114, 0, 97, 115, 109, 13, 0, 1, 0, 7, 142, 11, 1, 65, 2, 1, 65, 18, 1, 66, 29, 1, 122, 4, 0, 10, 110, 111, 100, 101, 45, 105, 110, 100, 101, 120, 3, 0, 0, 1, 114, 1, 5, 118, 97, 108, 117, 101, 115, 4, 0, 3, 117, 114, 105, 3, 0, 2, 1, 112, 1, 1, 107, 1, 1, 111, 2, 121, 5, 1, 112, 127, 1, 106, 1, 5, 1, 5, 1, 111, 2, 3, 119, 1, 113, 22, 12, 114, 101, 99, 111, 114, 100, 45, 118, 97, 108, 117, 101, 1, 4, 0, 13, 118, 97, 114, 105, 97, 110, 116, 45, 118, 97, 108, 117, 101, 1, 6, 0, 10, 101, 110, 117, 109, 45, 118, 97, 108, 117, 101, 1, 121, 0, 11, 102, 108, 97, 103, 115, 45, 118, 97, 108, 117, 101, 1, 7, 0, 11, 116, 117, 112, 108, 101, 45, 118, 97, 108, 117, 101, 1, 4, 0, 10, 108, 105, 115, 116, 45, 118, 97, 108, 117, 101, 1, 4, 0, 12, 111, 112, 116, 105, 111, 110, 45, 118, 97, 108, 117, 101, 1, 5, 0, 12, 114, 101, 115, 117, 108, 116, 45, 118, 97, 108, 117, 101, 1, 8, 0, 7, 112, 114, 105, 109, 45, 117, 56, 1, 125, 0, 8, 112, 114, 105, 109, 45, 117, 49, 54, 1, 123, 0, 8, 112, 114, 105, 109, 45, 117, 51, 50, 1, 121, 0, 8, 112, 114, 105, 109, 45, 117, 54, 52, 1, 119, 0, 7, 112, 114, 105, 109, 45, 115, 56, 1, 126, 0, 8, 112, 114, 105, 109, 45, 115, 49, 54, 1, 124, 0, 8, 112, 114, 105, 109, 45, 115, 51, 50, 1, 122, 0, 8, 112, 114, 105, 109, 45, 115, 54, 52, 1, 120, 0, 12, 112, 114, 105, 109, 45, 102, 108, 111, 97, 116, 51, 50, 1, 118, 0, 12, 112, 114, 105, 109, 45, 102, 108, 111, 97, 116, 54, 52, 1, 117, 0, 9, 112, 114, 105, 109, 45, 99, 104, 97, 114, 1, 116, 0, 9, 112, 114, 105, 109, 45, 98, 111, 111, 108, 1, 127, 0, 11, 112, 114, 105, 109, 45, 115, 116, 114, 105, 110, 103, 1, 115, 0, 6, 104, 97, 110, 100, 108, 101, 1, 9, 0, 4, 0, 8, 119, 105, 116, 45, 110, 111, 100, 101, 3, 0, 10, 1, 112, 11, 1, 114, 1, 5, 110, 111, 100, 101, 115, 12, 4, 0, 9, 119, 105, 116, 45, 118, 97, 108, 117, 101, 3, 0, 13, 1, 113, 4, 14, 112, 114, 111, 116, 111, 99, 111, 108, 45, 101, 114, 114, 111, 114, 1, 115, 0, 6, 100, 101, 110, 105, 101, 100, 1, 115, 0, 9, 110, 111, 116, 45, 102, 111, 117, 110, 100, 1, 115, 0, 21, 114, 101, 109, 111, 116, 101, 45, 105, 110, 116, 101, 114, 110, 97, 108, 45, 101, 114, 114, 111, 114, 1, 115, 0, 4, 0, 9, 114, 112, 99, 45, 101, 114, 114, 111, 114, 3, 0, 15, 4, 0, 8, 119, 97, 115, 109, 45, 114, 112, 99, 3, 1, 1, 105, 17, 1, 64, 1, 8, 108, 111, 99, 97, 116, 105, 111, 110, 3, 0, 18, 4, 0, 21, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 119, 97, 115, 109, 45, 114, 112, 99, 1, 19, 1, 104, 17, 1, 112, 14, 1, 106, 1, 14, 1, 16, 1, 64, 3, 4, 115, 101, 108, 102, 20, 13, 102, 117, 110, 99, 116, 105, 111, 110, 45, 110, 97, 109, 101, 115, 15, 102, 117, 110, 99, 116, 105, 111, 110, 45, 112, 97, 114, 97, 109, 115, 21, 0, 22, 4, 0, 33, 91, 109, 101, 116, 104, 111, 100, 93, 119, 97, 115, 109, 45, 114, 112, 99, 46, 105, 110, 118, 111, 107, 101, 45, 97, 110, 100, 45, 97, 119, 97, 105, 116, 1, 23, 1, 106, 0, 1, 16, 1, 64, 3, 4, 115, 101, 108, 102, 20, 13, 102, 117, 110, 99, 116, 105, 111, 110, 45, 110, 97, 109, 101, 115, 15, 102, 117, 110, 99, 116, 105, 111, 110, 45, 112, 97, 114, 97, 109, 115, 21, 0, 24, 4, 0, 23, 91, 109, 101, 116, 104, 111, 100, 93, 119, 97, 115, 109, 45, 114, 112, 99, 46, 105, 110, 118, 111, 107, 101, 1, 25, 3, 1, 21, 103, 111, 108, 101, 109, 58, 114, 112, 99, 47, 116, 121, 112, 101, 115, 64, 48, 46, 49, 46, 48, 5, 0, 2, 3, 0, 0, 3, 117, 114, 105, 1, 66, 33, 2, 3, 2, 1, 1, 4, 0, 3, 117, 114, 105, 3, 0, 0, 4, 0, 3, 97, 112, 105, 3, 1, 4, 0, 7, 99, 111, 117, 110, 116, 101, 114, 3, 1, 1, 105, 2, 1, 64, 1, 8, 108, 111, 99, 97, 116, 105, 111, 110, 1, 0, 4, 4, 0, 16, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 97, 112, 105, 1, 5, 1, 104, 2, 1, 64, 2, 4, 115, 101, 108, 102, 6, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 34, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 98, 108, 111, 99, 107, 105, 110, 103, 45, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 7, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 7, 1, 64, 1, 4, 115, 101, 108, 102, 6, 0, 119, 4, 0, 28, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 103, 101, 116, 45, 103, 108, 111, 98, 97, 108, 45, 118, 97, 108, 117, 101, 1, 8, 1, 111, 2, 115, 119, 1, 112, 9, 1, 64, 1, 4, 115, 101, 108, 102, 6, 0, 10, 4, 0, 27, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 103, 101, 116, 45, 97, 108, 108, 45, 100, 114, 111, 112, 112, 101, 100, 1, 11, 1, 105, 3, 1, 64, 2, 8, 108, 111, 99, 97, 116, 105, 111, 110, 1, 4, 110, 97, 109, 101, 115, 0, 12, 4, 0, 20, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 99, 111, 117, 110, 116, 101, 114, 1, 13, 1, 104, 3, 1, 64, 2, 4, 115, 101, 108, 102, 14, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 31, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 98, 108, 111, 99, 107, 105, 110, 103, 45, 105, 110, 99, 45, 98, 121, 1, 15, 4, 0, 22, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 105, 110, 99, 45, 98, 121, 1, 15, 1, 64, 1, 4, 115, 101, 108, 102, 14, 0, 119, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 118, 97, 108, 117, 101, 1, 16, 1, 112, 115, 1, 64, 1, 4, 115, 101, 108, 102, 14, 0, 17, 4, 0, 24, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 97, 114, 103, 115, 1, 18, 1, 111, 2, 115, 115, 1, 112, 19, 1, 64, 1, 4, 115, 101, 108, 102, 14, 0, 20, 4, 0, 23, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 101, 110, 118, 1, 21, 3, 1, 31, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 45, 115, 116, 117, 98, 47, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 5, 2, 1, 111, 2, 115, 119, 1, 112, 3, 1, 64, 0, 0, 4, 4, 0, 5, 116, 101, 115, 116, 49, 1, 5, 1, 64, 0, 0, 119, 4, 0, 5, 116, 101, 115, 116, 50, 1, 6, 4, 0, 5, 116, 101, 115, 116, 51, 1, 6, 1, 112, 115, 1, 111, 2, 115, 115, 1, 112, 8, 1, 111, 2, 7, 9, 1, 64, 0, 0, 10, 4, 0, 5, 116, 101, 115, 116, 52, 1, 11, 4, 1, 17, 114, 112, 99, 58, 99, 97, 108, 108, 101, 114, 47, 99, 97, 108, 108, 101, 114, 4, 0, 11, 12, 1, 0, 6, 99, 97, 108, 108, 101, 114, 3, 0, 0, 0, 16, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48]; #[inline(never)] #[doc(hidden)] diff --git a/test-components/rpc/caller/src/lib.rs b/test-components/rpc/caller/src/lib.rs index b61ddf865..2854f0925 100644 --- a/test-components/rpc/caller/src/lib.rs +++ b/test-components/rpc/caller/src/lib.rs @@ -22,7 +22,8 @@ fn with_state(f: impl FnOnce(&mut State) -> T) -> T { impl Guest for Component { fn test1() -> Vec<(String, u64)> { println!("Creating, using and dropping counters"); - let component_id = env::var("COUNTERS_COMPONENT_ID").expect("COUNTERS_COMPONENT_ID not set"); + let component_id = + env::var("COUNTERS_COMPONENT_ID").expect("COUNTERS_COMPONENT_ID not set"); let counters_uri = Uri { value: format!("worker://{component_id}/counters_test1"), }; @@ -65,6 +66,16 @@ impl Guest for Component { api.inc_global_by(1); api.get_global_value() } + + fn test4() -> (Vec, Vec<(String, String)>) { + let component_id = + env::var("COUNTERS_COMPONENT_ID").expect("COUNTERS_COMPONENT_ID not set"); + let counters_uri = Uri { + value: format!("worker://{component_id}/counters_test4"), + }; + let counter = Counter::new(&counters_uri, "counter-test4"); + (counter.get_args(), counter.get_env()) + } } fn create_use_and_drop_counters(counters_uri: &Uri) { diff --git a/test-components/rpc/caller/wit/caller.wit b/test-components/rpc/caller/wit/caller.wit index a064c58e6..6a9c36e79 100644 --- a/test-components/rpc/caller/wit/caller.wit +++ b/test-components/rpc/caller/wit/caller.wit @@ -6,4 +6,5 @@ world caller { export test1: func() -> list>; export test2: func() -> u64; export test3: func() -> u64; -} \ No newline at end of file + export test4: func() -> tuple, list>>; +} diff --git a/test-components/rpc/caller/wit/deps/counters-stub/stub.wit b/test-components/rpc/caller/wit/deps/counters-stub/stub.wit index 8ba775cd4..3719922a6 100644 --- a/test-components/rpc/caller/wit/deps/counters-stub/stub.wit +++ b/test-components/rpc/caller/wit/deps/counters-stub/stub.wit @@ -16,6 +16,8 @@ interface stub-counters { blocking-inc-by: func(value: u64); inc-by: func(value: u64); get-value: func() -> u64; + get-args: func() -> list; + get-env: func() -> list>; } } diff --git a/test-components/rpc/caller/wit/deps/rpc_counters/counters.wit b/test-components/rpc/caller/wit/deps/rpc_counters/counters.wit index 0e910d821..a9ed7cd1c 100644 --- a/test-components/rpc/caller/wit/deps/rpc_counters/counters.wit +++ b/test-components/rpc/caller/wit/deps/rpc_counters/counters.wit @@ -5,6 +5,9 @@ interface api { constructor(name: string); inc-by: func(value: u64); get-value: func() -> u64; + + get-args: func() -> list; + get-env: func() -> list>; } inc-global-by: func(value: u64); @@ -15,4 +18,4 @@ interface api { world counters { export api; -} \ No newline at end of file +} diff --git a/test-components/rpc/counters-stub/src/bindings.rs b/test-components/rpc/counters-stub/src/bindings.rs index 4a95618cb..95eb87e1b 100644 --- a/test-components/rpc/counters-stub/src/bindings.rs +++ b/test-components/rpc/counters-stub/src/bindings.rs @@ -1615,6 +1615,168 @@ pub mod golem { wit_bindgen::rt::as_i64(result0) } }; + const _: () = { + + #[doc(hidden)] + #[export_name = "rpc:counters-stub/stub-counters#[method]counter.get-args"] + #[allow(non_snake_case)] + unsafe extern "C" fn __export_method_counter_get_args(arg0: i32,) -> i32 { + #[allow(unused_imports)] + use wit_bindgen::rt::{alloc, vec::Vec, string::String}; + + // Before executing any other code, use this function to run all static + // constructors, if they have not yet been run. This is a hack required + // to work around wasi-libc ctors calling import functions to initialize + // the environment. + // + // This functionality will be removed once rust 1.69.0 is stable, at which + // point wasi-libc will no longer have this behavior. + // + // See + // https://github.com/bytecodealliance/preview2-prototyping/issues/99 + // for more details. + #[cfg(target_arch="wasm32")] + wit_bindgen::rt::run_ctors_once(); + + let result0 = <_CounterImpl as GuestCounter>::get_args(wit_bindgen::rt::Resource::::lift_borrow(arg0 as u32 as usize)); + let ptr1 = _RET_AREA.0.as_mut_ptr() as i32; + let vec3 = result0; + let len3 = vec3.len() as i32; + let layout3 = alloc::Layout::from_size_align_unchecked(vec3.len() * 8, 4); + let result3 = if layout3.size() != 0 + { + let ptr = alloc::alloc(layout3); + if ptr.is_null() + { + alloc::handle_alloc_error(layout3); + } + ptr + }else {{ + ::core::ptr::null_mut() + }}; + for (i, e) in vec3.into_iter().enumerate() { + let base = result3 as i32 + (i as i32) * 8; + { + let vec2 = (e.into_bytes()).into_boxed_slice(); + let ptr2 = vec2.as_ptr() as i32; + let len2 = vec2.len() as i32; + ::core::mem::forget(vec2); + *((base + 4) as *mut i32) = len2; + *((base + 0) as *mut i32) = ptr2; + } + } + *((ptr1 + 4) as *mut i32) = len3; + *((ptr1 + 0) as *mut i32) = result3 as i32; + ptr1 + } + + const _: () = { + #[doc(hidden)] + #[export_name = "cabi_post_rpc:counters-stub/stub-counters#[method]counter.get-args"] + #[allow(non_snake_case)] + unsafe extern "C" fn __post_return_method_counter_get_args(arg0: i32,) { + let l2 = *((arg0 + 0) as *const i32); + let l3 = *((arg0 + 4) as *const i32); + let base4 = l2; + let len4 = l3; + for i in 0..len4 { + let base = base4 + i *8; + { + let l0 = *((base + 0) as *const i32); + let l1 = *((base + 4) as *const i32); + wit_bindgen::rt::dealloc(l0, (l1) as usize, 1); + } + } + wit_bindgen::rt::dealloc(base4, (len4 as usize) * 8, 4); + } + }; + }; + const _: () = { + + #[doc(hidden)] + #[export_name = "rpc:counters-stub/stub-counters#[method]counter.get-env"] + #[allow(non_snake_case)] + unsafe extern "C" fn __export_method_counter_get_env(arg0: i32,) -> i32 { + #[allow(unused_imports)] + use wit_bindgen::rt::{alloc, vec::Vec, string::String}; + + // Before executing any other code, use this function to run all static + // constructors, if they have not yet been run. This is a hack required + // to work around wasi-libc ctors calling import functions to initialize + // the environment. + // + // This functionality will be removed once rust 1.69.0 is stable, at which + // point wasi-libc will no longer have this behavior. + // + // See + // https://github.com/bytecodealliance/preview2-prototyping/issues/99 + // for more details. + #[cfg(target_arch="wasm32")] + wit_bindgen::rt::run_ctors_once(); + + let result0 = <_CounterImpl as GuestCounter>::get_env(wit_bindgen::rt::Resource::::lift_borrow(arg0 as u32 as usize)); + let ptr1 = _RET_AREA.0.as_mut_ptr() as i32; + let vec5 = result0; + let len5 = vec5.len() as i32; + let layout5 = alloc::Layout::from_size_align_unchecked(vec5.len() * 16, 4); + let result5 = if layout5.size() != 0 + { + let ptr = alloc::alloc(layout5); + if ptr.is_null() + { + alloc::handle_alloc_error(layout5); + } + ptr + }else {{ + ::core::ptr::null_mut() + }}; + for (i, e) in vec5.into_iter().enumerate() { + let base = result5 as i32 + (i as i32) * 16; + { + let (t2_0, t2_1, ) = e; + let vec3 = (t2_0.into_bytes()).into_boxed_slice(); + let ptr3 = vec3.as_ptr() as i32; + let len3 = vec3.len() as i32; + ::core::mem::forget(vec3); + *((base + 4) as *mut i32) = len3; + *((base + 0) as *mut i32) = ptr3; + let vec4 = (t2_1.into_bytes()).into_boxed_slice(); + let ptr4 = vec4.as_ptr() as i32; + let len4 = vec4.len() as i32; + ::core::mem::forget(vec4); + *((base + 12) as *mut i32) = len4; + *((base + 8) as *mut i32) = ptr4; + } + } + *((ptr1 + 4) as *mut i32) = len5; + *((ptr1 + 0) as *mut i32) = result5 as i32; + ptr1 + } + + const _: () = { + #[doc(hidden)] + #[export_name = "cabi_post_rpc:counters-stub/stub-counters#[method]counter.get-env"] + #[allow(non_snake_case)] + unsafe extern "C" fn __post_return_method_counter_get_env(arg0: i32,) { + let l4 = *((arg0 + 0) as *const i32); + let l5 = *((arg0 + 4) as *const i32); + let base6 = l4; + let len6 = l5; + for i in 0..len6 { + let base = base6 + i *16; + { + let l0 = *((base + 0) as *const i32); + let l1 = *((base + 4) as *const i32); + wit_bindgen::rt::dealloc(l0, (l1) as usize, 1); + let l2 = *((base + 8) as *const i32); + let l3 = *((base + 12) as *const i32); + wit_bindgen::rt::dealloc(l2, (l3) as usize, 1); + } + } + wit_bindgen::rt::dealloc(base6, (len6 as usize) * 16, 4); + } + }; + }; use super::super::super::super::super::Api as _ApiImpl; pub trait GuestApi { fn new(location: Uri,) -> Self; @@ -1629,6 +1791,8 @@ pub mod golem { fn blocking_inc_by(&self,value: u64,); fn inc_by(&self,value: u64,); fn get_value(&self,) -> u64; + fn get_args(&self,) -> wit_bindgen::rt::vec::Vec::; + fn get_env(&self,) -> wit_bindgen::rt::vec::Vec::<(wit_bindgen::rt::string::String,wit_bindgen::rt::string::String,)>; } #[allow(unused_imports)] @@ -1647,7 +1811,7 @@ pub mod golem { #[cfg(target_arch = "wasm32")] #[link_section = "component-type:wasm-rpc-stub-counters"] #[doc(hidden)] - pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 2471] = [3, 0, 22, 119, 97, 115, 109, 45, 114, 112, 99, 45, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 0, 97, 115, 109, 13, 0, 1, 0, 7, 247, 7, 1, 65, 5, 1, 66, 18, 1, 122, 4, 0, 10, 110, 111, 100, 101, 45, 105, 110, 100, 101, 120, 3, 0, 0, 1, 114, 1, 5, 118, 97, 108, 117, 101, 115, 4, 0, 3, 117, 114, 105, 3, 0, 2, 1, 112, 1, 1, 107, 1, 1, 111, 2, 121, 5, 1, 112, 127, 1, 106, 1, 5, 1, 5, 1, 111, 2, 3, 119, 1, 113, 22, 12, 114, 101, 99, 111, 114, 100, 45, 118, 97, 108, 117, 101, 1, 4, 0, 13, 118, 97, 114, 105, 97, 110, 116, 45, 118, 97, 108, 117, 101, 1, 6, 0, 10, 101, 110, 117, 109, 45, 118, 97, 108, 117, 101, 1, 121, 0, 11, 102, 108, 97, 103, 115, 45, 118, 97, 108, 117, 101, 1, 7, 0, 11, 116, 117, 112, 108, 101, 45, 118, 97, 108, 117, 101, 1, 4, 0, 10, 108, 105, 115, 116, 45, 118, 97, 108, 117, 101, 1, 4, 0, 12, 111, 112, 116, 105, 111, 110, 45, 118, 97, 108, 117, 101, 1, 5, 0, 12, 114, 101, 115, 117, 108, 116, 45, 118, 97, 108, 117, 101, 1, 8, 0, 7, 112, 114, 105, 109, 45, 117, 56, 1, 125, 0, 8, 112, 114, 105, 109, 45, 117, 49, 54, 1, 123, 0, 8, 112, 114, 105, 109, 45, 117, 51, 50, 1, 121, 0, 8, 112, 114, 105, 109, 45, 117, 54, 52, 1, 119, 0, 7, 112, 114, 105, 109, 45, 115, 56, 1, 126, 0, 8, 112, 114, 105, 109, 45, 115, 49, 54, 1, 124, 0, 8, 112, 114, 105, 109, 45, 115, 51, 50, 1, 122, 0, 8, 112, 114, 105, 109, 45, 115, 54, 52, 1, 120, 0, 12, 112, 114, 105, 109, 45, 102, 108, 111, 97, 116, 51, 50, 1, 118, 0, 12, 112, 114, 105, 109, 45, 102, 108, 111, 97, 116, 54, 52, 1, 117, 0, 9, 112, 114, 105, 109, 45, 99, 104, 97, 114, 1, 116, 0, 9, 112, 114, 105, 109, 45, 98, 111, 111, 108, 1, 127, 0, 11, 112, 114, 105, 109, 45, 115, 116, 114, 105, 110, 103, 1, 115, 0, 6, 104, 97, 110, 100, 108, 101, 1, 9, 0, 4, 0, 8, 119, 105, 116, 45, 110, 111, 100, 101, 3, 0, 10, 1, 112, 11, 1, 114, 1, 5, 110, 111, 100, 101, 115, 12, 4, 0, 9, 119, 105, 116, 45, 118, 97, 108, 117, 101, 3, 0, 13, 1, 113, 4, 14, 112, 114, 111, 116, 111, 99, 111, 108, 45, 101, 114, 114, 111, 114, 1, 115, 0, 6, 100, 101, 110, 105, 101, 100, 1, 115, 0, 9, 110, 111, 116, 45, 102, 111, 117, 110, 100, 1, 115, 0, 21, 114, 101, 109, 111, 116, 101, 45, 105, 110, 116, 101, 114, 110, 97, 108, 45, 101, 114, 114, 111, 114, 1, 115, 0, 4, 0, 9, 114, 112, 99, 45, 101, 114, 114, 111, 114, 3, 0, 15, 4, 0, 8, 119, 97, 115, 109, 45, 114, 112, 99, 3, 1, 3, 1, 21, 103, 111, 108, 101, 109, 58, 114, 112, 99, 47, 116, 121, 112, 101, 115, 64, 48, 46, 49, 46, 48, 5, 0, 2, 3, 0, 0, 3, 117, 114, 105, 1, 66, 26, 2, 3, 2, 1, 1, 4, 0, 3, 117, 114, 105, 3, 0, 0, 4, 0, 3, 97, 112, 105, 3, 1, 4, 0, 7, 99, 111, 117, 110, 116, 101, 114, 3, 1, 1, 105, 2, 1, 64, 1, 8, 108, 111, 99, 97, 116, 105, 111, 110, 1, 0, 4, 4, 0, 16, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 97, 112, 105, 1, 5, 1, 104, 2, 1, 64, 2, 4, 115, 101, 108, 102, 6, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 34, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 98, 108, 111, 99, 107, 105, 110, 103, 45, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 7, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 7, 1, 64, 1, 4, 115, 101, 108, 102, 6, 0, 119, 4, 0, 28, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 103, 101, 116, 45, 103, 108, 111, 98, 97, 108, 45, 118, 97, 108, 117, 101, 1, 8, 1, 111, 2, 115, 119, 1, 112, 9, 1, 64, 1, 4, 115, 101, 108, 102, 6, 0, 10, 4, 0, 27, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 103, 101, 116, 45, 97, 108, 108, 45, 100, 114, 111, 112, 112, 101, 100, 1, 11, 1, 105, 3, 1, 64, 2, 8, 108, 111, 99, 97, 116, 105, 111, 110, 1, 4, 110, 97, 109, 101, 115, 0, 12, 4, 0, 20, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 99, 111, 117, 110, 116, 101, 114, 1, 13, 1, 104, 3, 1, 64, 2, 4, 115, 101, 108, 102, 14, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 31, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 98, 108, 111, 99, 107, 105, 110, 103, 45, 105, 110, 99, 45, 98, 121, 1, 15, 4, 0, 22, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 105, 110, 99, 45, 98, 121, 1, 15, 1, 64, 1, 4, 115, 101, 108, 102, 14, 0, 119, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 118, 97, 108, 117, 101, 1, 16, 4, 1, 31, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 45, 115, 116, 117, 98, 47, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 5, 2, 11, 19, 1, 0, 13, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 3, 0, 0, 7, 252, 9, 1, 65, 2, 1, 65, 5, 1, 66, 29, 1, 122, 4, 0, 10, 110, 111, 100, 101, 45, 105, 110, 100, 101, 120, 3, 0, 0, 1, 114, 1, 5, 118, 97, 108, 117, 101, 115, 4, 0, 3, 117, 114, 105, 3, 0, 2, 1, 112, 1, 1, 107, 1, 1, 111, 2, 121, 5, 1, 112, 127, 1, 106, 1, 5, 1, 5, 1, 111, 2, 3, 119, 1, 113, 22, 12, 114, 101, 99, 111, 114, 100, 45, 118, 97, 108, 117, 101, 1, 4, 0, 13, 118, 97, 114, 105, 97, 110, 116, 45, 118, 97, 108, 117, 101, 1, 6, 0, 10, 101, 110, 117, 109, 45, 118, 97, 108, 117, 101, 1, 121, 0, 11, 102, 108, 97, 103, 115, 45, 118, 97, 108, 117, 101, 1, 7, 0, 11, 116, 117, 112, 108, 101, 45, 118, 97, 108, 117, 101, 1, 4, 0, 10, 108, 105, 115, 116, 45, 118, 97, 108, 117, 101, 1, 4, 0, 12, 111, 112, 116, 105, 111, 110, 45, 118, 97, 108, 117, 101, 1, 5, 0, 12, 114, 101, 115, 117, 108, 116, 45, 118, 97, 108, 117, 101, 1, 8, 0, 7, 112, 114, 105, 109, 45, 117, 56, 1, 125, 0, 8, 112, 114, 105, 109, 45, 117, 49, 54, 1, 123, 0, 8, 112, 114, 105, 109, 45, 117, 51, 50, 1, 121, 0, 8, 112, 114, 105, 109, 45, 117, 54, 52, 1, 119, 0, 7, 112, 114, 105, 109, 45, 115, 56, 1, 126, 0, 8, 112, 114, 105, 109, 45, 115, 49, 54, 1, 124, 0, 8, 112, 114, 105, 109, 45, 115, 51, 50, 1, 122, 0, 8, 112, 114, 105, 109, 45, 115, 54, 52, 1, 120, 0, 12, 112, 114, 105, 109, 45, 102, 108, 111, 97, 116, 51, 50, 1, 118, 0, 12, 112, 114, 105, 109, 45, 102, 108, 111, 97, 116, 54, 52, 1, 117, 0, 9, 112, 114, 105, 109, 45, 99, 104, 97, 114, 1, 116, 0, 9, 112, 114, 105, 109, 45, 98, 111, 111, 108, 1, 127, 0, 11, 112, 114, 105, 109, 45, 115, 116, 114, 105, 110, 103, 1, 115, 0, 6, 104, 97, 110, 100, 108, 101, 1, 9, 0, 4, 0, 8, 119, 105, 116, 45, 110, 111, 100, 101, 3, 0, 10, 1, 112, 11, 1, 114, 1, 5, 110, 111, 100, 101, 115, 12, 4, 0, 9, 119, 105, 116, 45, 118, 97, 108, 117, 101, 3, 0, 13, 1, 113, 4, 14, 112, 114, 111, 116, 111, 99, 111, 108, 45, 101, 114, 114, 111, 114, 1, 115, 0, 6, 100, 101, 110, 105, 101, 100, 1, 115, 0, 9, 110, 111, 116, 45, 102, 111, 117, 110, 100, 1, 115, 0, 21, 114, 101, 109, 111, 116, 101, 45, 105, 110, 116, 101, 114, 110, 97, 108, 45, 101, 114, 114, 111, 114, 1, 115, 0, 4, 0, 9, 114, 112, 99, 45, 101, 114, 114, 111, 114, 3, 0, 15, 4, 0, 8, 119, 97, 115, 109, 45, 114, 112, 99, 3, 1, 1, 105, 17, 1, 64, 1, 8, 108, 111, 99, 97, 116, 105, 111, 110, 3, 0, 18, 4, 0, 21, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 119, 97, 115, 109, 45, 114, 112, 99, 1, 19, 1, 104, 17, 1, 112, 14, 1, 106, 1, 14, 1, 16, 1, 64, 3, 4, 115, 101, 108, 102, 20, 13, 102, 117, 110, 99, 116, 105, 111, 110, 45, 110, 97, 109, 101, 115, 15, 102, 117, 110, 99, 116, 105, 111, 110, 45, 112, 97, 114, 97, 109, 115, 21, 0, 22, 4, 0, 33, 91, 109, 101, 116, 104, 111, 100, 93, 119, 97, 115, 109, 45, 114, 112, 99, 46, 105, 110, 118, 111, 107, 101, 45, 97, 110, 100, 45, 97, 119, 97, 105, 116, 1, 23, 1, 106, 0, 1, 16, 1, 64, 3, 4, 115, 101, 108, 102, 20, 13, 102, 117, 110, 99, 116, 105, 111, 110, 45, 110, 97, 109, 101, 115, 15, 102, 117, 110, 99, 116, 105, 111, 110, 45, 112, 97, 114, 97, 109, 115, 21, 0, 24, 4, 0, 23, 91, 109, 101, 116, 104, 111, 100, 93, 119, 97, 115, 109, 45, 114, 112, 99, 46, 105, 110, 118, 111, 107, 101, 1, 25, 3, 1, 21, 103, 111, 108, 101, 109, 58, 114, 112, 99, 47, 116, 121, 112, 101, 115, 64, 48, 46, 49, 46, 48, 5, 0, 2, 3, 0, 0, 3, 117, 114, 105, 1, 66, 26, 2, 3, 2, 1, 1, 4, 0, 3, 117, 114, 105, 3, 0, 0, 4, 0, 3, 97, 112, 105, 3, 1, 4, 0, 7, 99, 111, 117, 110, 116, 101, 114, 3, 1, 1, 105, 2, 1, 64, 1, 8, 108, 111, 99, 97, 116, 105, 111, 110, 1, 0, 4, 4, 0, 16, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 97, 112, 105, 1, 5, 1, 104, 2, 1, 64, 2, 4, 115, 101, 108, 102, 6, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 34, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 98, 108, 111, 99, 107, 105, 110, 103, 45, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 7, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 7, 1, 64, 1, 4, 115, 101, 108, 102, 6, 0, 119, 4, 0, 28, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 103, 101, 116, 45, 103, 108, 111, 98, 97, 108, 45, 118, 97, 108, 117, 101, 1, 8, 1, 111, 2, 115, 119, 1, 112, 9, 1, 64, 1, 4, 115, 101, 108, 102, 6, 0, 10, 4, 0, 27, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 103, 101, 116, 45, 97, 108, 108, 45, 100, 114, 111, 112, 112, 101, 100, 1, 11, 1, 105, 3, 1, 64, 2, 8, 108, 111, 99, 97, 116, 105, 111, 110, 1, 4, 110, 97, 109, 101, 115, 0, 12, 4, 0, 20, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 99, 111, 117, 110, 116, 101, 114, 1, 13, 1, 104, 3, 1, 64, 2, 4, 115, 101, 108, 102, 14, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 31, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 98, 108, 111, 99, 107, 105, 110, 103, 45, 105, 110, 99, 45, 98, 121, 1, 15, 4, 0, 22, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 105, 110, 99, 45, 98, 121, 1, 15, 1, 64, 1, 4, 115, 101, 108, 102, 14, 0, 119, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 118, 97, 108, 117, 101, 1, 16, 4, 1, 31, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 45, 115, 116, 117, 98, 47, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 5, 2, 4, 1, 40, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 45, 115, 116, 117, 98, 47, 119, 97, 115, 109, 45, 114, 112, 99, 45, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 4, 0, 11, 28, 1, 0, 22, 119, 97, 115, 109, 45, 114, 112, 99, 45, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 3, 2, 0, 0, 16, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48]; + pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 2651] = [3, 0, 22, 119, 97, 115, 109, 45, 114, 112, 99, 45, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 0, 97, 115, 109, 13, 0, 1, 0, 7, 209, 8, 1, 65, 5, 1, 66, 18, 1, 122, 4, 0, 10, 110, 111, 100, 101, 45, 105, 110, 100, 101, 120, 3, 0, 0, 1, 114, 1, 5, 118, 97, 108, 117, 101, 115, 4, 0, 3, 117, 114, 105, 3, 0, 2, 1, 112, 1, 1, 107, 1, 1, 111, 2, 121, 5, 1, 112, 127, 1, 106, 1, 5, 1, 5, 1, 111, 2, 3, 119, 1, 113, 22, 12, 114, 101, 99, 111, 114, 100, 45, 118, 97, 108, 117, 101, 1, 4, 0, 13, 118, 97, 114, 105, 97, 110, 116, 45, 118, 97, 108, 117, 101, 1, 6, 0, 10, 101, 110, 117, 109, 45, 118, 97, 108, 117, 101, 1, 121, 0, 11, 102, 108, 97, 103, 115, 45, 118, 97, 108, 117, 101, 1, 7, 0, 11, 116, 117, 112, 108, 101, 45, 118, 97, 108, 117, 101, 1, 4, 0, 10, 108, 105, 115, 116, 45, 118, 97, 108, 117, 101, 1, 4, 0, 12, 111, 112, 116, 105, 111, 110, 45, 118, 97, 108, 117, 101, 1, 5, 0, 12, 114, 101, 115, 117, 108, 116, 45, 118, 97, 108, 117, 101, 1, 8, 0, 7, 112, 114, 105, 109, 45, 117, 56, 1, 125, 0, 8, 112, 114, 105, 109, 45, 117, 49, 54, 1, 123, 0, 8, 112, 114, 105, 109, 45, 117, 51, 50, 1, 121, 0, 8, 112, 114, 105, 109, 45, 117, 54, 52, 1, 119, 0, 7, 112, 114, 105, 109, 45, 115, 56, 1, 126, 0, 8, 112, 114, 105, 109, 45, 115, 49, 54, 1, 124, 0, 8, 112, 114, 105, 109, 45, 115, 51, 50, 1, 122, 0, 8, 112, 114, 105, 109, 45, 115, 54, 52, 1, 120, 0, 12, 112, 114, 105, 109, 45, 102, 108, 111, 97, 116, 51, 50, 1, 118, 0, 12, 112, 114, 105, 109, 45, 102, 108, 111, 97, 116, 54, 52, 1, 117, 0, 9, 112, 114, 105, 109, 45, 99, 104, 97, 114, 1, 116, 0, 9, 112, 114, 105, 109, 45, 98, 111, 111, 108, 1, 127, 0, 11, 112, 114, 105, 109, 45, 115, 116, 114, 105, 110, 103, 1, 115, 0, 6, 104, 97, 110, 100, 108, 101, 1, 9, 0, 4, 0, 8, 119, 105, 116, 45, 110, 111, 100, 101, 3, 0, 10, 1, 112, 11, 1, 114, 1, 5, 110, 111, 100, 101, 115, 12, 4, 0, 9, 119, 105, 116, 45, 118, 97, 108, 117, 101, 3, 0, 13, 1, 113, 4, 14, 112, 114, 111, 116, 111, 99, 111, 108, 45, 101, 114, 114, 111, 114, 1, 115, 0, 6, 100, 101, 110, 105, 101, 100, 1, 115, 0, 9, 110, 111, 116, 45, 102, 111, 117, 110, 100, 1, 115, 0, 21, 114, 101, 109, 111, 116, 101, 45, 105, 110, 116, 101, 114, 110, 97, 108, 45, 101, 114, 114, 111, 114, 1, 115, 0, 4, 0, 9, 114, 112, 99, 45, 101, 114, 114, 111, 114, 3, 0, 15, 4, 0, 8, 119, 97, 115, 109, 45, 114, 112, 99, 3, 1, 3, 1, 21, 103, 111, 108, 101, 109, 58, 114, 112, 99, 47, 116, 121, 112, 101, 115, 64, 48, 46, 49, 46, 48, 5, 0, 2, 3, 0, 0, 3, 117, 114, 105, 1, 66, 33, 2, 3, 2, 1, 1, 4, 0, 3, 117, 114, 105, 3, 0, 0, 4, 0, 3, 97, 112, 105, 3, 1, 4, 0, 7, 99, 111, 117, 110, 116, 101, 114, 3, 1, 1, 105, 2, 1, 64, 1, 8, 108, 111, 99, 97, 116, 105, 111, 110, 1, 0, 4, 4, 0, 16, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 97, 112, 105, 1, 5, 1, 104, 2, 1, 64, 2, 4, 115, 101, 108, 102, 6, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 34, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 98, 108, 111, 99, 107, 105, 110, 103, 45, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 7, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 7, 1, 64, 1, 4, 115, 101, 108, 102, 6, 0, 119, 4, 0, 28, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 103, 101, 116, 45, 103, 108, 111, 98, 97, 108, 45, 118, 97, 108, 117, 101, 1, 8, 1, 111, 2, 115, 119, 1, 112, 9, 1, 64, 1, 4, 115, 101, 108, 102, 6, 0, 10, 4, 0, 27, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 103, 101, 116, 45, 97, 108, 108, 45, 100, 114, 111, 112, 112, 101, 100, 1, 11, 1, 105, 3, 1, 64, 2, 8, 108, 111, 99, 97, 116, 105, 111, 110, 1, 4, 110, 97, 109, 101, 115, 0, 12, 4, 0, 20, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 99, 111, 117, 110, 116, 101, 114, 1, 13, 1, 104, 3, 1, 64, 2, 4, 115, 101, 108, 102, 14, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 31, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 98, 108, 111, 99, 107, 105, 110, 103, 45, 105, 110, 99, 45, 98, 121, 1, 15, 4, 0, 22, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 105, 110, 99, 45, 98, 121, 1, 15, 1, 64, 1, 4, 115, 101, 108, 102, 14, 0, 119, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 118, 97, 108, 117, 101, 1, 16, 1, 112, 115, 1, 64, 1, 4, 115, 101, 108, 102, 14, 0, 17, 4, 0, 24, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 97, 114, 103, 115, 1, 18, 1, 111, 2, 115, 115, 1, 112, 19, 1, 64, 1, 4, 115, 101, 108, 102, 14, 0, 20, 4, 0, 23, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 101, 110, 118, 1, 21, 4, 1, 31, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 45, 115, 116, 117, 98, 47, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 5, 2, 11, 19, 1, 0, 13, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 3, 0, 0, 7, 214, 10, 1, 65, 2, 1, 65, 5, 1, 66, 29, 1, 122, 4, 0, 10, 110, 111, 100, 101, 45, 105, 110, 100, 101, 120, 3, 0, 0, 1, 114, 1, 5, 118, 97, 108, 117, 101, 115, 4, 0, 3, 117, 114, 105, 3, 0, 2, 1, 112, 1, 1, 107, 1, 1, 111, 2, 121, 5, 1, 112, 127, 1, 106, 1, 5, 1, 5, 1, 111, 2, 3, 119, 1, 113, 22, 12, 114, 101, 99, 111, 114, 100, 45, 118, 97, 108, 117, 101, 1, 4, 0, 13, 118, 97, 114, 105, 97, 110, 116, 45, 118, 97, 108, 117, 101, 1, 6, 0, 10, 101, 110, 117, 109, 45, 118, 97, 108, 117, 101, 1, 121, 0, 11, 102, 108, 97, 103, 115, 45, 118, 97, 108, 117, 101, 1, 7, 0, 11, 116, 117, 112, 108, 101, 45, 118, 97, 108, 117, 101, 1, 4, 0, 10, 108, 105, 115, 116, 45, 118, 97, 108, 117, 101, 1, 4, 0, 12, 111, 112, 116, 105, 111, 110, 45, 118, 97, 108, 117, 101, 1, 5, 0, 12, 114, 101, 115, 117, 108, 116, 45, 118, 97, 108, 117, 101, 1, 8, 0, 7, 112, 114, 105, 109, 45, 117, 56, 1, 125, 0, 8, 112, 114, 105, 109, 45, 117, 49, 54, 1, 123, 0, 8, 112, 114, 105, 109, 45, 117, 51, 50, 1, 121, 0, 8, 112, 114, 105, 109, 45, 117, 54, 52, 1, 119, 0, 7, 112, 114, 105, 109, 45, 115, 56, 1, 126, 0, 8, 112, 114, 105, 109, 45, 115, 49, 54, 1, 124, 0, 8, 112, 114, 105, 109, 45, 115, 51, 50, 1, 122, 0, 8, 112, 114, 105, 109, 45, 115, 54, 52, 1, 120, 0, 12, 112, 114, 105, 109, 45, 102, 108, 111, 97, 116, 51, 50, 1, 118, 0, 12, 112, 114, 105, 109, 45, 102, 108, 111, 97, 116, 54, 52, 1, 117, 0, 9, 112, 114, 105, 109, 45, 99, 104, 97, 114, 1, 116, 0, 9, 112, 114, 105, 109, 45, 98, 111, 111, 108, 1, 127, 0, 11, 112, 114, 105, 109, 45, 115, 116, 114, 105, 110, 103, 1, 115, 0, 6, 104, 97, 110, 100, 108, 101, 1, 9, 0, 4, 0, 8, 119, 105, 116, 45, 110, 111, 100, 101, 3, 0, 10, 1, 112, 11, 1, 114, 1, 5, 110, 111, 100, 101, 115, 12, 4, 0, 9, 119, 105, 116, 45, 118, 97, 108, 117, 101, 3, 0, 13, 1, 113, 4, 14, 112, 114, 111, 116, 111, 99, 111, 108, 45, 101, 114, 114, 111, 114, 1, 115, 0, 6, 100, 101, 110, 105, 101, 100, 1, 115, 0, 9, 110, 111, 116, 45, 102, 111, 117, 110, 100, 1, 115, 0, 21, 114, 101, 109, 111, 116, 101, 45, 105, 110, 116, 101, 114, 110, 97, 108, 45, 101, 114, 114, 111, 114, 1, 115, 0, 4, 0, 9, 114, 112, 99, 45, 101, 114, 114, 111, 114, 3, 0, 15, 4, 0, 8, 119, 97, 115, 109, 45, 114, 112, 99, 3, 1, 1, 105, 17, 1, 64, 1, 8, 108, 111, 99, 97, 116, 105, 111, 110, 3, 0, 18, 4, 0, 21, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 119, 97, 115, 109, 45, 114, 112, 99, 1, 19, 1, 104, 17, 1, 112, 14, 1, 106, 1, 14, 1, 16, 1, 64, 3, 4, 115, 101, 108, 102, 20, 13, 102, 117, 110, 99, 116, 105, 111, 110, 45, 110, 97, 109, 101, 115, 15, 102, 117, 110, 99, 116, 105, 111, 110, 45, 112, 97, 114, 97, 109, 115, 21, 0, 22, 4, 0, 33, 91, 109, 101, 116, 104, 111, 100, 93, 119, 97, 115, 109, 45, 114, 112, 99, 46, 105, 110, 118, 111, 107, 101, 45, 97, 110, 100, 45, 97, 119, 97, 105, 116, 1, 23, 1, 106, 0, 1, 16, 1, 64, 3, 4, 115, 101, 108, 102, 20, 13, 102, 117, 110, 99, 116, 105, 111, 110, 45, 110, 97, 109, 101, 115, 15, 102, 117, 110, 99, 116, 105, 111, 110, 45, 112, 97, 114, 97, 109, 115, 21, 0, 24, 4, 0, 23, 91, 109, 101, 116, 104, 111, 100, 93, 119, 97, 115, 109, 45, 114, 112, 99, 46, 105, 110, 118, 111, 107, 101, 1, 25, 3, 1, 21, 103, 111, 108, 101, 109, 58, 114, 112, 99, 47, 116, 121, 112, 101, 115, 64, 48, 46, 49, 46, 48, 5, 0, 2, 3, 0, 0, 3, 117, 114, 105, 1, 66, 33, 2, 3, 2, 1, 1, 4, 0, 3, 117, 114, 105, 3, 0, 0, 4, 0, 3, 97, 112, 105, 3, 1, 4, 0, 7, 99, 111, 117, 110, 116, 101, 114, 3, 1, 1, 105, 2, 1, 64, 1, 8, 108, 111, 99, 97, 116, 105, 111, 110, 1, 0, 4, 4, 0, 16, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 97, 112, 105, 1, 5, 1, 104, 2, 1, 64, 2, 4, 115, 101, 108, 102, 6, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 34, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 98, 108, 111, 99, 107, 105, 110, 103, 45, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 7, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 7, 1, 64, 1, 4, 115, 101, 108, 102, 6, 0, 119, 4, 0, 28, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 103, 101, 116, 45, 103, 108, 111, 98, 97, 108, 45, 118, 97, 108, 117, 101, 1, 8, 1, 111, 2, 115, 119, 1, 112, 9, 1, 64, 1, 4, 115, 101, 108, 102, 6, 0, 10, 4, 0, 27, 91, 109, 101, 116, 104, 111, 100, 93, 97, 112, 105, 46, 103, 101, 116, 45, 97, 108, 108, 45, 100, 114, 111, 112, 112, 101, 100, 1, 11, 1, 105, 3, 1, 64, 2, 8, 108, 111, 99, 97, 116, 105, 111, 110, 1, 4, 110, 97, 109, 101, 115, 0, 12, 4, 0, 20, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 99, 111, 117, 110, 116, 101, 114, 1, 13, 1, 104, 3, 1, 64, 2, 4, 115, 101, 108, 102, 14, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 31, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 98, 108, 111, 99, 107, 105, 110, 103, 45, 105, 110, 99, 45, 98, 121, 1, 15, 4, 0, 22, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 105, 110, 99, 45, 98, 121, 1, 15, 1, 64, 1, 4, 115, 101, 108, 102, 14, 0, 119, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 118, 97, 108, 117, 101, 1, 16, 1, 112, 115, 1, 64, 1, 4, 115, 101, 108, 102, 14, 0, 17, 4, 0, 24, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 97, 114, 103, 115, 1, 18, 1, 111, 2, 115, 115, 1, 112, 19, 1, 64, 1, 4, 115, 101, 108, 102, 14, 0, 20, 4, 0, 23, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 101, 110, 118, 1, 21, 4, 1, 31, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 45, 115, 116, 117, 98, 47, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 5, 2, 4, 1, 40, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 45, 115, 116, 117, 98, 47, 119, 97, 115, 109, 45, 114, 112, 99, 45, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 4, 0, 11, 28, 1, 0, 22, 119, 97, 115, 109, 45, 114, 112, 99, 45, 115, 116, 117, 98, 45, 99, 111, 117, 110, 116, 101, 114, 115, 3, 2, 0, 0, 16, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48]; #[inline(never)] #[doc(hidden)] diff --git a/test-components/rpc/counters-stub/src/lib.rs b/test-components/rpc/counters-stub/src/lib.rs index c5e8ecdc9..774cf0f34 100644 --- a/test-components/rpc/counters-stub/src/lib.rs +++ b/test-components/rpc/counters-stub/src/lib.rs @@ -179,6 +179,60 @@ for Counter { ); (result.tuple_element(0).expect("tuple not found").u64().expect("u64 not found")) } + fn get_args(&self) -> Vec { + let result = self + .rpc + .invoke_and_await( + "rpc:counters/api.{counter.get-args}", + &[WitValue::builder().handle(self.uri.clone(), self.id)], + ) + .expect( + &format!( + "Failed to invoke-and-await remote {}", + "rpc:counters/api.{counter.get-args}" + ), + ); + (result + .tuple_element(0) + .expect("tuple not found") + .list_elements(|item| item.string().expect("string not found").to_string()) + .expect("list not found")) + } + fn get_env(&self) -> Vec<(String, String)> { + let result = self + .rpc + .invoke_and_await( + "rpc:counters/api.{counter.get-env}", + &[WitValue::builder().handle(self.uri.clone(), self.id)], + ) + .expect( + &format!( + "Failed to invoke-and-await remote {}", + "rpc:counters/api.{counter.get-env}" + ), + ); + (result + .tuple_element(0) + .expect("tuple not found") + .list_elements(|item| { + let tuple = item; + ( + tuple + .tuple_element(0usize) + .expect("tuple element not found") + .string() + .expect("string not found") + .to_string(), + tuple + .tuple_element(1usize) + .expect("tuple element not found") + .string() + .expect("string not found") + .to_string(), + ) + }) + .expect("list not found")) + } } impl Drop for Counter { fn drop(&mut self) { diff --git a/test-components/rpc/counters-stub/wit/_stub.wit b/test-components/rpc/counters-stub/wit/_stub.wit index 8ba775cd4..3719922a6 100644 --- a/test-components/rpc/counters-stub/wit/_stub.wit +++ b/test-components/rpc/counters-stub/wit/_stub.wit @@ -16,6 +16,8 @@ interface stub-counters { blocking-inc-by: func(value: u64); inc-by: func(value: u64); get-value: func() -> u64; + get-args: func() -> list; + get-env: func() -> list>; } } diff --git a/test-components/rpc/counters-stub/wit/deps/rpc_counters/counters.wit b/test-components/rpc/counters-stub/wit/deps/rpc_counters/counters.wit index 0e910d821..a9ed7cd1c 100644 --- a/test-components/rpc/counters-stub/wit/deps/rpc_counters/counters.wit +++ b/test-components/rpc/counters-stub/wit/deps/rpc_counters/counters.wit @@ -5,6 +5,9 @@ interface api { constructor(name: string); inc-by: func(value: u64); get-value: func() -> u64; + + get-args: func() -> list; + get-env: func() -> list>; } inc-global-by: func(value: u64); @@ -15,4 +18,4 @@ interface api { world counters { export api; -} \ No newline at end of file +} diff --git a/test-components/rpc/counters/src/bindings.rs b/test-components/rpc/counters/src/bindings.rs index a28b7bda4..4d3189fea 100644 --- a/test-components/rpc/counters/src/bindings.rs +++ b/test-components/rpc/counters/src/bindings.rs @@ -154,6 +154,168 @@ pub mod exports { wit_bindgen::rt::as_i64(result0) } }; + const _: () = { + + #[doc(hidden)] + #[export_name = "rpc:counters/api#[method]counter.get-args"] + #[allow(non_snake_case)] + unsafe extern "C" fn __export_method_counter_get_args(arg0: i32,) -> i32 { + #[allow(unused_imports)] + use wit_bindgen::rt::{alloc, vec::Vec, string::String}; + + // Before executing any other code, use this function to run all static + // constructors, if they have not yet been run. This is a hack required + // to work around wasi-libc ctors calling import functions to initialize + // the environment. + // + // This functionality will be removed once rust 1.69.0 is stable, at which + // point wasi-libc will no longer have this behavior. + // + // See + // https://github.com/bytecodealliance/preview2-prototyping/issues/99 + // for more details. + #[cfg(target_arch="wasm32")] + wit_bindgen::rt::run_ctors_once(); + + let result0 = <_CounterImpl as GuestCounter>::get_args(wit_bindgen::rt::Resource::::lift_borrow(arg0 as u32 as usize)); + let ptr1 = _RET_AREA.0.as_mut_ptr() as i32; + let vec3 = result0; + let len3 = vec3.len() as i32; + let layout3 = alloc::Layout::from_size_align_unchecked(vec3.len() * 8, 4); + let result3 = if layout3.size() != 0 + { + let ptr = alloc::alloc(layout3); + if ptr.is_null() + { + alloc::handle_alloc_error(layout3); + } + ptr + }else {{ + ::core::ptr::null_mut() + }}; + for (i, e) in vec3.into_iter().enumerate() { + let base = result3 as i32 + (i as i32) * 8; + { + let vec2 = (e.into_bytes()).into_boxed_slice(); + let ptr2 = vec2.as_ptr() as i32; + let len2 = vec2.len() as i32; + ::core::mem::forget(vec2); + *((base + 4) as *mut i32) = len2; + *((base + 0) as *mut i32) = ptr2; + } + } + *((ptr1 + 4) as *mut i32) = len3; + *((ptr1 + 0) as *mut i32) = result3 as i32; + ptr1 + } + + const _: () = { + #[doc(hidden)] + #[export_name = "cabi_post_rpc:counters/api#[method]counter.get-args"] + #[allow(non_snake_case)] + unsafe extern "C" fn __post_return_method_counter_get_args(arg0: i32,) { + let l2 = *((arg0 + 0) as *const i32); + let l3 = *((arg0 + 4) as *const i32); + let base4 = l2; + let len4 = l3; + for i in 0..len4 { + let base = base4 + i *8; + { + let l0 = *((base + 0) as *const i32); + let l1 = *((base + 4) as *const i32); + wit_bindgen::rt::dealloc(l0, (l1) as usize, 1); + } + } + wit_bindgen::rt::dealloc(base4, (len4 as usize) * 8, 4); + } + }; + }; + const _: () = { + + #[doc(hidden)] + #[export_name = "rpc:counters/api#[method]counter.get-env"] + #[allow(non_snake_case)] + unsafe extern "C" fn __export_method_counter_get_env(arg0: i32,) -> i32 { + #[allow(unused_imports)] + use wit_bindgen::rt::{alloc, vec::Vec, string::String}; + + // Before executing any other code, use this function to run all static + // constructors, if they have not yet been run. This is a hack required + // to work around wasi-libc ctors calling import functions to initialize + // the environment. + // + // This functionality will be removed once rust 1.69.0 is stable, at which + // point wasi-libc will no longer have this behavior. + // + // See + // https://github.com/bytecodealliance/preview2-prototyping/issues/99 + // for more details. + #[cfg(target_arch="wasm32")] + wit_bindgen::rt::run_ctors_once(); + + let result0 = <_CounterImpl as GuestCounter>::get_env(wit_bindgen::rt::Resource::::lift_borrow(arg0 as u32 as usize)); + let ptr1 = _RET_AREA.0.as_mut_ptr() as i32; + let vec5 = result0; + let len5 = vec5.len() as i32; + let layout5 = alloc::Layout::from_size_align_unchecked(vec5.len() * 16, 4); + let result5 = if layout5.size() != 0 + { + let ptr = alloc::alloc(layout5); + if ptr.is_null() + { + alloc::handle_alloc_error(layout5); + } + ptr + }else {{ + ::core::ptr::null_mut() + }}; + for (i, e) in vec5.into_iter().enumerate() { + let base = result5 as i32 + (i as i32) * 16; + { + let (t2_0, t2_1, ) = e; + let vec3 = (t2_0.into_bytes()).into_boxed_slice(); + let ptr3 = vec3.as_ptr() as i32; + let len3 = vec3.len() as i32; + ::core::mem::forget(vec3); + *((base + 4) as *mut i32) = len3; + *((base + 0) as *mut i32) = ptr3; + let vec4 = (t2_1.into_bytes()).into_boxed_slice(); + let ptr4 = vec4.as_ptr() as i32; + let len4 = vec4.len() as i32; + ::core::mem::forget(vec4); + *((base + 12) as *mut i32) = len4; + *((base + 8) as *mut i32) = ptr4; + } + } + *((ptr1 + 4) as *mut i32) = len5; + *((ptr1 + 0) as *mut i32) = result5 as i32; + ptr1 + } + + const _: () = { + #[doc(hidden)] + #[export_name = "cabi_post_rpc:counters/api#[method]counter.get-env"] + #[allow(non_snake_case)] + unsafe extern "C" fn __post_return_method_counter_get_env(arg0: i32,) { + let l4 = *((arg0 + 0) as *const i32); + let l5 = *((arg0 + 4) as *const i32); + let base6 = l4; + let len6 = l5; + for i in 0..len6 { + let base = base6 + i *16; + { + let l0 = *((base + 0) as *const i32); + let l1 = *((base + 4) as *const i32); + wit_bindgen::rt::dealloc(l0, (l1) as usize, 1); + let l2 = *((base + 8) as *const i32); + let l3 = *((base + 12) as *const i32); + wit_bindgen::rt::dealloc(l2, (l3) as usize, 1); + } + } + wit_bindgen::rt::dealloc(base6, (len6 as usize) * 16, 4); + } + }; + }; const _: () = { #[doc(hidden)] @@ -296,6 +458,8 @@ pub mod exports { fn new(name: wit_bindgen::rt::string::String,) -> Self; fn inc_by(&self,value: u64,); fn get_value(&self,) -> u64; + fn get_args(&self,) -> wit_bindgen::rt::vec::Vec::; + fn get_env(&self,) -> wit_bindgen::rt::vec::Vec::<(wit_bindgen::rt::string::String,wit_bindgen::rt::string::String,)>; } #[allow(unused_imports)] @@ -314,7 +478,7 @@ pub mod exports { #[cfg(target_arch = "wasm32")] #[link_section = "component-type:counters"] #[doc(hidden)] -pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 683] = [3, 0, 8, 99, 111, 117, 110, 116, 101, 114, 115, 0, 97, 115, 109, 13, 0, 1, 0, 7, 128, 2, 1, 65, 2, 1, 66, 17, 4, 0, 7, 99, 111, 117, 110, 116, 101, 114, 3, 1, 1, 105, 0, 1, 64, 1, 4, 110, 97, 109, 101, 115, 0, 1, 4, 0, 20, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 99, 111, 117, 110, 116, 101, 114, 1, 2, 1, 104, 0, 1, 64, 2, 4, 115, 101, 108, 102, 3, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 22, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 105, 110, 99, 45, 98, 121, 1, 4, 1, 64, 1, 4, 115, 101, 108, 102, 3, 0, 119, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 118, 97, 108, 117, 101, 1, 5, 1, 64, 1, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 13, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 6, 1, 64, 0, 0, 119, 4, 0, 16, 103, 101, 116, 45, 103, 108, 111, 98, 97, 108, 45, 118, 97, 108, 117, 101, 1, 7, 1, 111, 2, 115, 119, 1, 112, 8, 1, 64, 0, 0, 9, 4, 0, 15, 103, 101, 116, 45, 97, 108, 108, 45, 100, 114, 111, 112, 112, 101, 100, 1, 10, 4, 1, 16, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 47, 97, 112, 105, 5, 0, 11, 9, 1, 0, 3, 97, 112, 105, 3, 0, 0, 7, 157, 2, 1, 65, 2, 1, 65, 2, 1, 66, 17, 4, 0, 7, 99, 111, 117, 110, 116, 101, 114, 3, 1, 1, 105, 0, 1, 64, 1, 4, 110, 97, 109, 101, 115, 0, 1, 4, 0, 20, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 99, 111, 117, 110, 116, 101, 114, 1, 2, 1, 104, 0, 1, 64, 2, 4, 115, 101, 108, 102, 3, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 22, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 105, 110, 99, 45, 98, 121, 1, 4, 1, 64, 1, 4, 115, 101, 108, 102, 3, 0, 119, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 118, 97, 108, 117, 101, 1, 5, 1, 64, 1, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 13, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 6, 1, 64, 0, 0, 119, 4, 0, 16, 103, 101, 116, 45, 103, 108, 111, 98, 97, 108, 45, 118, 97, 108, 117, 101, 1, 7, 1, 111, 2, 115, 119, 1, 112, 8, 1, 64, 0, 0, 9, 4, 0, 15, 103, 101, 116, 45, 97, 108, 108, 45, 100, 114, 111, 112, 112, 101, 100, 1, 10, 4, 1, 16, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 47, 97, 112, 105, 5, 0, 4, 1, 21, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 47, 99, 111, 117, 110, 116, 101, 114, 115, 4, 0, 11, 14, 1, 0, 8, 99, 111, 117, 110, 116, 101, 114, 115, 3, 2, 0, 0, 16, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48]; +pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 863] = [3, 0, 8, 99, 111, 117, 110, 116, 101, 114, 115, 0, 97, 115, 109, 13, 0, 1, 0, 7, 218, 2, 1, 65, 2, 1, 66, 24, 4, 0, 7, 99, 111, 117, 110, 116, 101, 114, 3, 1, 1, 105, 0, 1, 64, 1, 4, 110, 97, 109, 101, 115, 0, 1, 4, 0, 20, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 99, 111, 117, 110, 116, 101, 114, 1, 2, 1, 104, 0, 1, 64, 2, 4, 115, 101, 108, 102, 3, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 22, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 105, 110, 99, 45, 98, 121, 1, 4, 1, 64, 1, 4, 115, 101, 108, 102, 3, 0, 119, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 118, 97, 108, 117, 101, 1, 5, 1, 112, 115, 1, 64, 1, 4, 115, 101, 108, 102, 3, 0, 6, 4, 0, 24, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 97, 114, 103, 115, 1, 7, 1, 111, 2, 115, 115, 1, 112, 8, 1, 64, 1, 4, 115, 101, 108, 102, 3, 0, 9, 4, 0, 23, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 101, 110, 118, 1, 10, 1, 64, 1, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 13, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 11, 1, 64, 0, 0, 119, 4, 0, 16, 103, 101, 116, 45, 103, 108, 111, 98, 97, 108, 45, 118, 97, 108, 117, 101, 1, 12, 1, 111, 2, 115, 119, 1, 112, 13, 1, 64, 0, 0, 14, 4, 0, 15, 103, 101, 116, 45, 97, 108, 108, 45, 100, 114, 111, 112, 112, 101, 100, 1, 15, 4, 1, 16, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 47, 97, 112, 105, 5, 0, 11, 9, 1, 0, 3, 97, 112, 105, 3, 0, 0, 7, 247, 2, 1, 65, 2, 1, 65, 2, 1, 66, 24, 4, 0, 7, 99, 111, 117, 110, 116, 101, 114, 3, 1, 1, 105, 0, 1, 64, 1, 4, 110, 97, 109, 101, 115, 0, 1, 4, 0, 20, 91, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 93, 99, 111, 117, 110, 116, 101, 114, 1, 2, 1, 104, 0, 1, 64, 2, 4, 115, 101, 108, 102, 3, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 22, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 105, 110, 99, 45, 98, 121, 1, 4, 1, 64, 1, 4, 115, 101, 108, 102, 3, 0, 119, 4, 0, 25, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 118, 97, 108, 117, 101, 1, 5, 1, 112, 115, 1, 64, 1, 4, 115, 101, 108, 102, 3, 0, 6, 4, 0, 24, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 97, 114, 103, 115, 1, 7, 1, 111, 2, 115, 115, 1, 112, 8, 1, 64, 1, 4, 115, 101, 108, 102, 3, 0, 9, 4, 0, 23, 91, 109, 101, 116, 104, 111, 100, 93, 99, 111, 117, 110, 116, 101, 114, 46, 103, 101, 116, 45, 101, 110, 118, 1, 10, 1, 64, 1, 5, 118, 97, 108, 117, 101, 119, 1, 0, 4, 0, 13, 105, 110, 99, 45, 103, 108, 111, 98, 97, 108, 45, 98, 121, 1, 11, 1, 64, 0, 0, 119, 4, 0, 16, 103, 101, 116, 45, 103, 108, 111, 98, 97, 108, 45, 118, 97, 108, 117, 101, 1, 12, 1, 111, 2, 115, 119, 1, 112, 13, 1, 64, 0, 0, 14, 4, 0, 15, 103, 101, 116, 45, 97, 108, 108, 45, 100, 114, 111, 112, 112, 101, 100, 1, 15, 4, 1, 16, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 47, 97, 112, 105, 5, 0, 4, 1, 21, 114, 112, 99, 58, 99, 111, 117, 110, 116, 101, 114, 115, 47, 99, 111, 117, 110, 116, 101, 114, 115, 4, 0, 11, 14, 1, 0, 8, 99, 111, 117, 110, 116, 101, 114, 115, 3, 2, 0, 0, 16, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48]; #[inline(never)] #[doc(hidden)] diff --git a/test-components/rpc/counters/src/lib.rs b/test-components/rpc/counters/src/lib.rs index 4441be460..fb48a8b13 100644 --- a/test-components/rpc/counters/src/lib.rs +++ b/test-components/rpc/counters/src/lib.rs @@ -1,19 +1,20 @@ mod bindings; -use std::cell::RefCell; -use bindings::*; use crate::bindings::exports::rpc::counters::api::{Guest, GuestCounter}; +use bindings::*; +use std::cell::RefCell; +use std::env::{args, vars}; pub struct Component; struct State { dropped_counters: Vec<(String, u64)>, - global: u64 + global: u64, } static mut STATE: State = State { dropped_counters: vec![], - global: 0 + global: 0, }; fn with_state(f: impl FnOnce(&mut State) -> T) -> T { @@ -24,9 +25,7 @@ fn with_state(f: impl FnOnce(&mut State) -> T) -> T { impl Guest for Component { fn get_all_dropped() -> Vec<(String, u64)> { - with_state(|state| { - state.dropped_counters.clone() - }) + with_state(|state| state.dropped_counters.clone()) } fn inc_global_by(value: u64) { @@ -36,9 +35,7 @@ impl Guest for Component { } fn get_global_value() -> u64 { - with_state(|state| { - state.global - }) + with_state(|state| state.global) } } @@ -65,13 +62,23 @@ impl GuestCounter for Counter { println!("Getting value of counter {}", self.name); *self.value.borrow() } + + fn get_args(&self) -> Vec { + args().collect::>() + } + + fn get_env(&self) -> Vec<(String, String)> { + vars().collect::>() + } } impl Drop for Counter { fn drop(&mut self) { println!("Dropping counter {}", self.name); with_state(|state| { - state.dropped_counters.push((self.name.clone(), *self.value.borrow())); + state + .dropped_counters + .push((self.name.clone(), *self.value.borrow())); }); } } diff --git a/test-components/rpc/counters/wit/counters.wit b/test-components/rpc/counters/wit/counters.wit index 0e910d821..a9ed7cd1c 100644 --- a/test-components/rpc/counters/wit/counters.wit +++ b/test-components/rpc/counters/wit/counters.wit @@ -5,6 +5,9 @@ interface api { constructor(name: string); inc-by: func(value: u64); get-value: func() -> u64; + + get-args: func() -> list; + get-env: func() -> list>; } inc-global-by: func(value: u64); @@ -15,4 +18,4 @@ interface api { world counters { export api; -} \ No newline at end of file +}