@githolon/dsl 0.108.4 → 0.108.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dart/CHANGELOG.md +5 -0
  2. package/dart/lib/src/application_framework_calls.dart +21 -0
  3. package/dart/lib/src/dev_cloud.dart +67 -0
  4. package/dart/lib/src/nms_test_environment.dart +1 -1
  5. package/dart/lib/src/runner/node-entry.mjs +354 -104
  6. package/dart/lib/src/runner/offline-install.mjs +64 -8
  7. package/dart/lib/src/session_bound.dart +58 -30
  8. package/dart/lib/src/test_harness.dart +60 -98
  9. package/dart/lib/src/webview_bridge.dart +212 -32
  10. package/dart/pubspec.lock +1 -1
  11. package/dart/pubspec.yaml +2 -2
  12. package/dart/test/node_runner_transport_test.dart +5 -5
  13. package/dart/test/webview_bridge_test.dart +6 -0
  14. package/dart_types/CHANGELOG.md +4 -0
  15. package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pb.dart +428 -2
  16. package/dart_types/pubspec.yaml +1 -1
  17. package/package.json +1 -1
  18. package/runtime/generated-application-host.js +293 -79
  19. package/src/application_topology.ts +120 -28
  20. package/src/births.ts +27 -0
  21. package/src/codegen_call_usda.ts +9 -4
  22. package/src/codegen_dart_application.ts +146 -37
  23. package/src/codegen_dart_client.ts +225 -160
  24. package/src/codegen_dart_framework_calls.ts +89 -4
  25. package/src/codegen_ts.ts +135 -60
  26. package/src/compile_package_main.ts +3598 -1484
  27. package/src/directive.ts +320 -118
  28. package/src/fields.ts +2 -3
  29. package/src/framework/application_home.ts +3 -0
  30. package/src/framework/auth_provider_law.ts +20 -28
  31. package/src/framework/genesis.ts +32 -1
  32. package/src/framework/home.ts +45 -8
  33. package/src/framework/signing_identity.ts +78 -0
  34. package/src/framework/workspaces.ts +9 -1
  35. package/src/framework_call_dart_enums.ts +33 -0
  36. package/src/framework_call_definitions.ts +11 -2
  37. package/src/index.ts +12 -0
  38. package/src/intent.ts +525 -194
  39. package/src/law_graph.ts +32 -4
  40. package/src/law_graph_usda.ts +3 -0
  41. package/src/package_config.ts +16 -1
  42. package/src/read.ts +33 -11
  43. package/src/wire.ts +1 -0
  44. package/src/wire_encode.ts +3 -3
@@ -5625,7 +5625,8 @@ function nmsInternalEncodeTypedProviderCall(operation, requestPrefix = "browser"
5625
5625
  }));
5626
5626
  const query = operation.case === "query" ? operation.value.query : void 0;
5627
5627
  const custody = operation.case === "custody" ? operation.value.operation : void 0;
5628
- const detail = query?.case === "named" ? `query:named:${String(query.value.operation)}` : query?.case ? `query:${query.case}` : custody?.case ? `custody:${custody.case}` : operation.case || "empty";
5628
+ const offeredIntent = operation.case === "offer" ? operation.value.intent.case : void 0;
5629
+ const detail = query?.case === "named" ? `query:named:${String(query.value.operation)}` : query?.case ? `query:${query.case}` : custody?.case ? `custody:${custody.case}` : offeredIntent ? `offer:${offeredIntent}` : operation.case || "empty";
5629
5630
  return { requestId, mode: operation.case || "empty", detail, bytes, encodeMs: monotonicMs() - started };
5630
5631
  }
5631
5632
  function nmsInternalDecodeTypedProviderResponse(bytes, requestId) {
@@ -6050,8 +6051,13 @@ function createWasmEnginePlane({ span } = {}) {
6050
6051
  wsContents.set(name, new File(bytes));
6051
6052
  },
6052
6053
  readWsFile(name) {
6053
- const f = wsContents.get(name);
6054
- return f ? f.data : null;
6054
+ const parts = String(name).split("/").filter(Boolean);
6055
+ let node = wsDirNode ?? void 0;
6056
+ for (const part of parts) {
6057
+ if (!(node instanceof Directory)) return null;
6058
+ node = node.contents.get(part);
6059
+ }
6060
+ return node instanceof File ? node.data : null;
6055
6061
  },
6056
6062
  memBytes() {
6057
6063
  return ex ? ex.memory.buffer.byteLength : 0;
@@ -6137,6 +6143,11 @@ function createWasmEnginePlane({ span } = {}) {
6137
6143
  }
6138
6144
  })
6139
6145
  });
6146
+ if (response.outcome.case === "failure") {
6147
+ throw new Error(
6148
+ `${response.outcome.value.code}: ${response.outcome.value.message}`
6149
+ );
6150
+ }
6140
6151
  if (response.outcome.case !== "custody" || response.outcome.value.operation.case !== "packDelta") return null;
6141
6152
  const pack = response.outcome.value.operation.value.pack;
6142
6153
  return pack.length ? pack : null;
@@ -6574,6 +6585,7 @@ function createModelLifecycleOfferRequest(target, args) {
6574
6585
  rng: args.capturedPorts.rng,
6575
6586
  deferProjection: args.deferProjection === true,
6576
6587
  spans: args.spans === true,
6588
+ prepareOnly: args.prepareOnly === true,
6577
6589
  sequence: BigInt(args.sequence),
6578
6590
  clock: create(CapturedClockSchema, {
6579
6591
  physicalMillis: BigInt(args.capturedPorts.clock.physical),
@@ -7705,12 +7717,12 @@ function createAutoSyncController(dependencies, options) {
7705
7717
  var file_nomos_kernel_v1_progress = /* @__PURE__ */ fileDesc("Ch5ub21vcy9rZXJuZWwvdjEvcHJvZ3Jlc3MucHJvdG8SD25vbW9zLmtlcm5lbC52MSLEAwoWS2VybmVsUHJvZ3Jlc3NTbmFwc2hvdBIWCg5zY2hlbWFfdmVyc2lvbhgBIAEoDRIQCghzZXF1ZW5jZRgCIAEoBBI7CglvcGVyYXRpb24YAyABKA4yKC5ub21vcy5rZXJuZWwudjEuS2VybmVsUHJvZ3Jlc3NPcGVyYXRpb24SMwoFcGhhc2UYBCABKA4yJC5ub21vcy5rZXJuZWwudjEuS2VybmVsUHJvZ3Jlc3NQaGFzZRIXCg9jb21wbGV0ZWRfdW5pdHMYBSABKAQSEwoLdG90YWxfdW5pdHMYBiABKAQSMQoEdW5pdBgHIAEoDjIjLm5vbW9zLmtlcm5lbC52MS5LZXJuZWxQcm9ncmVzc1VuaXQSEAoIdGVybWluYWwYCCABKAgSHAoUYWxsb2NhdG9yX2xpdmVfYnl0ZXMYCSABKAQSHAoUYWxsb2NhdG9yX3BlYWtfYnl0ZXMYCiABKAQSQwoSbGF3X2h5ZHJhdGlvbl9zdGVwGAsgASgOMicubm9tb3Mua2VybmVsLnYxLktlcm5lbExhd0h5ZHJhdGlvblN0ZXASGgoSbGF3X3BhY2thZ2Vfc2hhMjU2GAwgASgJKnAKF0tlcm5lbFByb2dyZXNzT3BlcmF0aW9uEikKJUtFUk5FTF9QUk9HUkVTU19PUEVSQVRJT05fVU5TUEVDSUZJRUQQABIqCiZLRVJORUxfUFJPR1JFU1NfT1BFUkFUSU9OX1JFU1RPUkVfTUFJThABKtkDChNLZXJuZWxQcm9ncmVzc1BoYXNlEiUKIUtFUk5FTF9QUk9HUkVTU19QSEFTRV9VTlNQRUNJRklFRBAAEicKI0tFUk5FTF9QUk9HUkVTU19QSEFTRV9DSEVDS19DVVNUT0RZEAESJAogS0VSTkVMX1BST0dSRVNTX1BIQVNFX1JFQURfQ0hBSU4QAhIrCidLRVJORUxfUFJPR1JFU1NfUEhBU0VfSU5JVElBTElaRV9FTkdJTkUQAxInCiNLRVJORUxfUFJPR1JFU1NfUEhBU0VfUkVBRF9USU1FTElORRAEEiUKIUtFUk5FTF9QUk9HUkVTU19QSEFTRV9IWURSQVRFX0xBVxAFEioKJktFUk5FTF9QUk9HUkVTU19QSEFTRV9SRUNPVkVSWV9QUkVTQ0FOEAYSKAokS0VSTkVMX1BST0dSRVNTX1BIQVNFX1ZFUklGWV9JTlRFTlRTEAcSKQolS0VSTkVMX1BST0dSRVNTX1BIQVNFX1BST01PVEVfQ1VTVE9EWRAIEioKJktFUk5FTF9QUk9HUkVTU19QSEFTRV9SRUJVSUxEX0ZST05USUVSEAkSIgoeS0VSTkVMX1BST0dSRVNTX1BIQVNFX0NPTVBMRVRFEAoqgQEKEktlcm5lbFByb2dyZXNzVW5pdBIkCiBLRVJORUxfUFJPR1JFU1NfVU5JVF9VTlNQRUNJRklFRBAAEh8KG0tFUk5FTF9QUk9HUkVTU19VTklUX0lOVEVOVBABEiQKIEtFUk5FTF9QUk9HUkVTU19VTklUX0xBV19QQUNLQUdFEAIqqwIKFktlcm5lbExhd0h5ZHJhdGlvblN0ZXASKQolS0VSTkVMX0xBV19IWURSQVRJT05fU1RFUF9VTlNQRUNJRklFRBAAEioKJktFUk5FTF9MQVdfSFlEUkFUSU9OX1NURVBfUkVBRF9DTE9TVVJFEAESKwonS0VSTkVMX0xBV19IWURSQVRJT05fU1RFUF9DT01QT1NFX1NUQUdFEAISLAooS0VSTkVMX0xBV19IWURSQVRJT05fU1RFUF9ERVJJVkVfU0NIRU1BUxADEi8KK0tFUk5FTF9MQVdfSFlEUkFUSU9OX1NURVBfTE9BRF9QT0xJQ1lfU0hFTEwQBBIuCipLRVJORUxfTEFXX0hZRFJBVElPTl9TVEVQX1BBQ0tBR0VfQ09NUExFVEUQBWIGcHJvdG8z");
7706
7718
 
7707
7719
  // ../cloud/web-client/src/_adapter/proto/nomos/runtime/v2/runtime_pb.js
7708
- var file_nomos_runtime_v2_runtime = /* @__PURE__ */ fileDesc("Ch5ub21vcy9ydW50aW1lL3YyL3J1bnRpbWUucHJvdG8SEG5vbW9zLnJ1bnRpbWUudjIioAkKDlJ1bnRpbWVSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIyCgV0cmFjZRgDIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhY2VDb250ZXh0SAGIAQESOgoLa2VybmVsX2NhbGwYCiABKAsyIy5ub21vcy5ydW50aW1lLnYyLktlcm5lbENhbGxSZXF1ZXN0SAASMwoHY29ubmVjdBgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdFJlcXVlc3RIABJCCg9saXN0X3dvcmtzcGFjZXMYDCABKAsyJy5ub21vcy5ydW50aW1lLnYyLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdEgAEkgKEnNuYXBzaG90X3dvcmtzcGFjZRgNIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0SAASQAoOc3luY193b3Jrc3BhY2UYDiABKAsyJi5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXF1ZXN0SAASQQoPc3RhcnRfYXV0b19zeW5jGA8gASgLMiYubm9tb3MucnVudGltZS52Mi5TdGFydEF1dG9TeW5jUmVxdWVzdEgAEj8KDnN0b3BfYXV0b19zeW5jGBAgASgLMiUubm9tb3MucnVudGltZS52Mi5TdG9wQXV0b1N5bmNSZXF1ZXN0SAASLwoFd2F0Y2gYESABKAsyHi5ub21vcy5ydW50aW1lLnYyLldhdGNoUmVxdWVzdEgAEjMKB3Vud2F0Y2gYEiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlVud2F0Y2hSZXF1ZXN0SAASQAoOcHJlcGFyZV9kb21haW4YEyABKAsyJi5ub21vcy5ydW50aW1lLnYyLlByZXBhcmVEb21haW5SZXF1ZXN0SAASTQoVcmVzb2x2ZV9jdXN0b2R5X2JyZWFrGBQgASgLMiwubm9tb3MucnVudGltZS52Mi5SZXNvbHZlQ3VzdG9keUJyZWFrUmVxdWVzdEgAEjoKC2Nsb3NlX3JlYWxtGBUgASgLMiMubm9tb3MucnVudGltZS52Mi5DbG9zZVJlYWxtUmVxdWVzdEgAEjoKC2RlYWRfbGV0dGVyGBYgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVxdWVzdEgAEkAKDmhpc3RvcmljX3F1ZXJ5GBcgASgLMiYubm9tb3MucnVudGltZS52Mi5IaXN0b3JpY1F1ZXJ5UmVxdWVzdEgAEkIKD21vZGVsX2xpZmVjeWNsZRgYIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxMaWZlY3ljbGVSZXF1ZXN0SAASXQodZXN0YWJsaXNoX2FwcGxpY2F0aW9uX2N1c3RvZHkYGSABKAsyNC5ub21vcy5ydW50aW1lLnYyLkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3RIAEIJCgdjb21tYW5kQggKBl90cmFjZSJTChFLZXJuZWxDYWxsUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEi0KB3JlcXVlc3QYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuQ2FsbFJlcXVlc3Qi8QIKIkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZwYXJlbnQYAiABKAkSEQoJcHJpbmNpcGFsGAMgASgJEg8KB3N1YmplY3QYBCABKAkSFQoNZGV2aWNlX3NlY3JldBgFIAEoDBIVCg1kZXZpY2VfcHVibGljGAYgASgMEhIKCmF1dGhfdG9rZW4YByABKAkSEAoIaWRfdG9rZW4YCCABKAkSFAoMdmVyaWZpZWRfdmlhGAkgASgJEg8KB2Jvcm5fYXQYCiABKAkSOwoTZW5yb2xsX2ZpcnN0X2RldmljZRgLIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsEj0KFWJpcnRoX3JlY2VpdmluZ19ncm91cBgMIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsEg8KB2NvbmZpcm0YDSABKAginwEKHUFwcGxpY2F0aW9uQ3VzdG9keUVzdGFibGlzaGVkEgwKBGhvbWUYASABKAkSFwoKY2hpbGRfaGVhZBgCIAEoCUgAiAEBEhAKCHZlcmlmaWVkGAMgASgIEh8KEnZlcmlmaWNhdGlvbl9lcnJvchgEIAEoCUgBiAEBQg0KC19jaGlsZF9oZWFkQhUKE192ZXJpZmljYXRpb25fZXJyb3IiZQoUSGlzdG9yaWNRdWVyeVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZtb21lbnQYAiABKAkSLAoFcXVlcnkYAyABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0IrUJCg9SdW50aW1lUmVzcG9uc2USGAoQcHJvdG9jb2xfdmVyc2lvbhgBIAEoDRISCgpyZXF1ZXN0X2lkGAIgASgEEjMKB2ZhaWx1cmUYCiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVGYWlsdXJlSAASNAoLa2VybmVsX2NhbGwYCyABKAsyHS5ub21vcy5rZXJuZWwudjEuQ2FsbFJlc3BvbnNlSAASMAoJY29ubmVjdGVkGAwgASgLMhsubm9tb3MucnVudGltZS52Mi5Db25uZWN0ZWRIABI5Cg53b3Jrc3BhY2VfbGlzdBgNIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlTGlzdEgAEkEKEndvcmtzcGFjZV9zbmFwc2hvdBgOIAEoCzIjLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlU25hcHNob3RIABJBCg5zeW5jX3dvcmtzcGFjZRgPIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuU3luY1dvcmtzcGFjZVJlc3BvbnNlSAASPgoRYXV0b19zeW5jX3N0YXJ0ZWQYECABKAsyIS5ub21vcy5ydW50aW1lLnYyLkF1dG9TeW5jU3RhcnRlZEgAEj4KEWF1dG9fc3luY19zdG9wcGVkGBEgASgLMiEubm9tb3MucnVudGltZS52Mi5BdXRvU3luY1N0b3BwZWRIABI3Cg13YXRjaF9zdGFydGVkGBIgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaFN0YXJ0ZWRIABI3Cg13YXRjaF9zdG9wcGVkGBMgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaFN0b3BwZWRIABI7Cg9kb21haW5fcHJlcGFyZWQYFCABKAsyIC5ub21vcy5ydW50aW1lLnYyLkRvbWFpblByZXBhcmVkSAASSAoWY3VzdG9keV9icmVha19yZXNvbHZlZBgVIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrUmVzb2x2ZWRIABI1CgxyZWFsbV9jbG9zZWQYFiABKAsyHS5ub21vcy5ydW50aW1lLnYyLlJlYWxtQ2xvc2VkSAASMwoHYmxvY2tlZBgXIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUJsb2NrZWRIABJIChZyZW1vdGVfb2ZmZXJfYWRtaXNzaW9uGBggASgLMiYubm9tb3MucnVudGltZS52Mi5SZW1vdGVPZmZlckFkbWlzc2lvbkgAEjsKC2RlYWRfbGV0dGVyGBkgASgLMiQubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVzcG9uc2VIABJDCg9tb2RlbF9saWZlY3ljbGUYGiABKAsyKC5ub21vcy5ydW50aW1lLnYyLk1vZGVsTGlmZWN5Y2xlUmVzcG9uc2VIABJaCh9hcHBsaWNhdGlvbl9jdXN0b2R5X2VzdGFibGlzaGVkGBsgASgLMi8ubm9tb3MucnVudGltZS52Mi5BcHBsaWNhdGlvbkN1c3RvZHlFc3RhYmxpc2hlZEgAQgkKB291dGNvbWUinwEKDlJ1bnRpbWVCbG9ja2VkEkEKCXdvcmtzcGFjZRgBIAEoCzIsLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlUmVzaWRlbmN5UmVxdWlyZWRIABJACghzaWJsaW5ncxgCIAEoCzIsLm5vbW9zLnJ1bnRpbWUudjIuU2libGluZ1Jlc2lkZW5jaWVzUmVxdWlyZWRIAEIICgZyZWFzb24iLwoaV29ya3NwYWNlUmVzaWRlbmN5UmVxdWlyZWQSEQoJd29ya3NwYWNlGAEgASgJIlUKGFNpYmxpbmdSZXNpZGVuY3lSZXF1aXJlZBIRCgl3b3Jrc3BhY2UYASABKAkSEwoLc291cmNlX2hlYWQYAiABKAkSEQoJZm9sZF9yb290GAMgASgJIl0KGlNpYmxpbmdSZXNpZGVuY2llc1JlcXVpcmVkEj8KC3Jlc2lkZW5jaWVzGAEgAygLMioubm9tb3MucnVudGltZS52Mi5TaWJsaW5nUmVzaWRlbmN5UmVxdWlyZWQihgIKFFJlbW90ZU9mZmVyQWRtaXNzaW9uEhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRtYWluGAIgASgJEhgKC3NlYWxlZF9tYWluGAMgASgJSACIAQESLwoHdmVyZGljdBgEIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5PZmZlclJlc3BvbnNlEjMKDGJvcm5fY3VzdG9keRgFIAMoCzIdLm5vbW9zLnJ1bnRpbWUudjIuQm9ybkN1c3RvZHkSEwoLcmVzdWx0X3BhY2sYBiABKAwSGAoLcmVzdWx0X2Jhc2UYByABKAlIAYgBAUIOCgxfc2VhbGVkX21haW5CDgoMX3Jlc3VsdF9iYXNlIkoKC0Jvcm5DdXN0b2R5Ei0KBWNoaWxkGAEgASgLMh4ubm9tb3Mua2VybmVsLnYxLkJvcm5Xb3Jrc3BhY2USDAoEcGFjaxgCIAEoDCL5AQoYQ3VzdG9keU9mZmVyQmF0Y2hSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRI3CgZpbmxpbmUYAyABKAsyJS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbmxpbmVPZmZlcnNIABJGChFzZXNzaW9uX2NhbmRpZGF0ZRgEIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keVNlc3Npb25DYW5kaWRhdGVIABIWCgliYXNlX2hlYWQYBSABKAlIAYgBAUIICgZzb3VyY2VCDAoKX2Jhc2VfaGVhZCJOChJDdXN0b2R5SW50ZW50T2ZmZXISDwoHc2Vzc2lvbhgBIAEoCRISCgpjb21taXRfb2lkGAIgASgJEhMKC2NoYW5nZV91c2RhGAMgASgMIksKE0N1c3RvZHlJbmxpbmVPZmZlcnMSNAoGb2ZmZXJzGAEgAygLMiQubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50T2ZmZXIiLAoXQ3VzdG9keVNlc3Npb25DYW5kaWRhdGUSEQoJcmVmZXJlbmNlGAEgASgJIvcBChlDdXN0b2R5T2ZmZXJCYXRjaFJlc3BvbnNlEhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRI3CglhZG1pc3Npb24YCiABKAsyIi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlBZG1pc3Npb25IABIzCgdmYWlsdXJlGAsgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAEjMKB2Jsb2NrZWQYDCABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVCbG9ja2VkSABCCQoHb3V0Y29tZSLuAgoQQ3VzdG9keUFkbWlzc2lvbhIMCgRtYWluGAEgASgJEhgKC3NlYWxlZF9tYWluGAIgASgJSACIAQESOwoIc2Vzc2lvbnMYAyADKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTZXNzaW9uQWRtaXNzaW9uEjUKDmJpcnRoX291dGNvbWVzGAQgAygLMh0ubm9tb3Mua2VybmVsLnYxLkJpcnRoT3V0Y29tZRIzCgxib3JuX2N1c3RvZHkYBSADKAsyHS5ub21vcy5ydW50aW1lLnYyLkJvcm5DdXN0b2R5EhMKC3Jlc3VsdF9wYWNrGAYgASgMEhgKC3Jlc3VsdF9iYXNlGAcgASgJSAGIAQESOgoHdGltaW5ncxgIIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUFkbWlzc2lvblRpbWluZ3NCDgoMX3NlYWxlZF9tYWluQg4KDF9yZXN1bHRfYmFzZSJlChdDdXN0b2R5U2Vzc2lvbkFkbWlzc2lvbhIPCgdzZXNzaW9uGAEgASgJEjkKB2ludGVudHMYAiADKAsyKC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRBZG1pc3Npb24ikAIKFkN1c3RvZHlJbnRlbnRBZG1pc3Npb24SEgoKY29tbWl0X29pZBgBIAEoCRIWCglpbnRlbnRfaWQYAiABKAlIAYgBARI7CghhZG1pdHRlZBgKIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudEFkbWl0dGVkSAASOQoHc2tpcHBlZBgLIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudFNraXBwZWRIABI5CgdyZWZ1c2VkGAwgASgLMiYubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50UmVmdXNlZEgAQgkKB291dGNvbWVCDAoKX2ludGVudF9pZCKQAQoVQ3VzdG9keUludGVudEFkbWl0dGVkEgwKBGhlYWQYASABKAkSMwoHY3JlYXRlZBgCIAMoCzIiLm5vbW9zLmtlcm5lbC52MS5PZmZlckFnZ3JlZ2F0ZVJlZhI0CghhZmZlY3RlZBgDIAMoCzIiLm5vbW9zLmtlcm5lbC52MS5PZmZlckFnZ3JlZ2F0ZVJlZiIvChRDdXN0b2R5SW50ZW50U2tpcHBlZBIXCg9hbHJlYWR5X29uX21haW4YASABKAgiWgoUQ3VzdG9keUludGVudFJlZnVzZWQSDwoHbWVzc2FnZRgBIAEoCRIVCg1kZWFkX2xldHRlcmVkGAIgASgIEhEKBGhpbnQYAyABKAlIAIgBAUIHCgVfaGludCLtAQoXQ3VzdG9keUFkbWlzc2lvblRpbWluZ3MSFAoMdG90YWxfbWlsbGlzGAEgASgBEhMKC3NjYW5fbWlsbGlzGAIgASgBEhQKDGZldGNoX21pbGxpcxgDIAEoARITCgtzZWFsX21pbGxpcxgEIAEoARIYChBnYXRlX2ZvbGRfbWlsbGlzGAUgASgBEhQKDGludGVudF9jb3VudBgGIAEoDRIVCg1zZXNzaW9uX2NvdW50GAcgASgNEjUKBXNwYW5zGAggAygLMiYubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QWRtaXNzaW9uU3BhbiKXAQoUQ3VzdG9keUFkbWlzc2lvblNwYW4SCgoCaWQYASABKAkSDQoFdHJhY2sYAiABKAkSDAoEbmFtZRgDIAEoCRIMCgRraW5kGAQgASgJEg0KBWRlcHRoGAUgASgNEhsKE3N0YXJ0ZWRfdW5peF9taWxsaXMYBiABKAESHAoUZmluaXNoZWRfdW5peF9taWxsaXMYByABKAEiQgoMVHJhY2VDb250ZXh0EhAKCHRyYWNlX2lkGAEgASgMEg8KB3NwYW5faWQYAiABKAwSDwoHc2FtcGxlZBgDIAEoCCLpAQoOUnVudGltZUZhaWx1cmUSDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEhEKCWNvbXBvbmVudBgDIAEoCRIWCgl3b3Jrc3BhY2UYBCABKAlIAIgBARITCgZkb21haW4YBSABKAlIAYgBARIWCglkaXJlY3RpdmUYBiABKAlIAogBARI5CgphdHRyaWJ1dGVzGAcgAygLMiUubm9tb3MucnVudGltZS52Mi5EaWFnbm9zdGljQXR0cmlidXRlQgwKCl93b3Jrc3BhY2VCCQoHX2RvbWFpbkIMCgpfZGlyZWN0aXZlIqUBChNEaWFnbm9zdGljQXR0cmlidXRlEgwKBG5hbWUYASABKAkSFgoMc3RyaW5nX3ZhbHVlGAIgASgJSAASFwoNaW50ZWdlcl92YWx1ZRgDIAEoEkgAEhYKDGRvdWJsZV92YWx1ZRgEIAEoAUgAEhcKDWJvb2xlYW5fdmFsdWUYBSABKAhIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAQgcKBXZhbHVlIs0CCg5Db25uZWN0UmVxdWVzdBIRCgl3b3Jrc3BhY2UYASABKAkSEQoJY2xpZW50X2lkGAIgASgJEhQKB3Nlc3Npb24YAyABKAlIAIgBARISCgVjbG91ZBgEIAEoCUgBiAEBEhIKCmF1dGhfdG9rZW4YBSABKAwSFQoNYXV0aG9yX3NlY3JldBgGIAEoDBIiChptYXhpbXVtX21vdW50ZWRfd29ya3NwYWNlcxgHIAEoDRIUCgxhbGxvd191bmJvcm4YCCABKAgSDwoHcmVjb3ZlchgJIAEoCBJCChRjdXN0b2R5X2JyZWFrX3BvbGljeRgKIAEoDjIkLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrUG9saWN5EhsKE2hhc19yZXN0b3JlX2N1c3RvZHkYCyABKAhCCgoIX3Nlc3Npb25CCAoGX2Nsb3VkIosBCglDb25uZWN0ZWQSEQoJd29ya3NwYWNlGAEgASgJEg8KB3Nlc3Npb24YAiABKAkSEwoLY2xvdWRfYm91bmQYAyABKAgSOAoIcmVjb3ZlcnkYBCABKAsyIS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlSZWNvdmVyeUgAiAEBQgsKCV9yZWNvdmVyeSJbCg9DdXN0b2R5UmVjb3ZlcnkSFQoNcHJldmlvdXNfaGVhZBgBIAEoCRIWCg5yZWNvdmVyZWRfaGVhZBgCIAEoCRIZChFyZWNvdmVyZWRfaW50ZW50cxgDIAEoBCIXChVMaXN0V29ya3NwYWNlc1JlcXVlc3QirQEKEFdvcmtzcGFjZVN1bW1hcnkSDwoHc2Vzc2lvbhgBIAEoCRIRCgl3b3Jrc3BhY2UYAiABKAkSNwoJcmVzaWRlbmN5GAMgASgOMiQubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VSZXNpZGVuY3kSPAoMc3luY19wb3N0dXJlGAQgASgOMiYubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTeW5jUG9zdHVyZSJHCg1Xb3Jrc3BhY2VMaXN0EjYKCndvcmtzcGFjZXMYASADKAsyIi5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVN1bW1hcnkiTQoYU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSFAoHaWZfaGVhZBgCIAEoCUgAiAEBQgoKCF9pZl9oZWFkIlwKEVdvcmtzcGFjZVNuYXBzaG90EhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRoZWFkGAIgASgJEhEKCXVuY2hhbmdlZBgDIAEoCBITCgtoYXNfY3VzdG9keRgEIAEoCCI2ChRTeW5jV29ya3NwYWNlUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEg0KBWFkbWl0GAIgASgIIrwFChVTeW5jV29ya3NwYWNlUmVzcG9uc2USEQoJd29ya3NwYWNlGAEgASgJEhoKDXByZXZpb3VzX2hlYWQYAiABKAlIAIgBARIZCgxjdXJyZW50X2hlYWQYAyABKAlIAYgBARIQCghhZG1pdHRlZBgEIAEoBBIPCgdyZWZ1c2VkGAUgASgEEhAKCGRlZmVycmVkGAYgASgEEhIKCmxvY2FsX29ubHkYByABKAgSDgoGcHVsbGVkGAggASgIEhAKCGRpdmVyZ2VkGAkgASgIEhoKEnJlY29ubmVjdF9yZXF1aXJlZBgKIAEoCBITCgtzdGlsbF9haGVhZBgLIAEoCBIPCgdvZmZsaW5lGAwgASgIEhMKC3B1c2hfZmFpbGVkGA0gASgIEh0KFWRpcmVjdF9vZmZlcl9kZWZlcnJlZBgOIAEoCBI1Cg5iaXJ0aF9vdXRjb21lcxgPIAMoCzIdLm5vbW9zLmtlcm5lbC52MS5CaXJ0aE91dGNvbWUSGwoTYWRtaXR0ZWRfaW50ZW50X2lkcxgQIAMoCRIcChRjb252ZXJnZWRfaW50ZW50X2lkcxgRIAMoCRJCCgpwdXNoX2Vycm9yGBIgASgLMikubm9tb3MucnVudGltZS52Mi5SdW50aW1lVHJhbnNwb3J0RmFpbHVyZUgCiAEBEkcKD2Rpc2NvdmVyeV9lcnJvchgTIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVRyYW5zcG9ydEZhaWx1cmVIA4gBARIzCgd0aW1pbmdzGBQgASgLMiIubm9tb3MucnVudGltZS52Mi5TeW5jUGhhc2VUaW1pbmdzQhAKDl9wcmV2aW91c19oZWFkQg8KDV9jdXJyZW50X2hlYWRCDQoLX3B1c2hfZXJyb3JCEgoQX2Rpc2NvdmVyeV9lcnJvciJdChdSdW50aW1lVHJhbnNwb3J0RmFpbHVyZRIQCghlbmRwb2ludBgBIAEoCRIOCgZzdGF0dXMYAiABKBESDwoHcmVmdXNlZBgDIAEoCBIPCgdtZXNzYWdlGAQgASgJIrEBChBTeW5jUGhhc2VUaW1pbmdzEhMKC3B1c2hfbWlsbGlzGAEgASgBEhQKDGFkbWl0X21pbGxpcxgCIAEoARIXCg9wcmVmZXRjaF9taWxsaXMYAyABKAESFwoPY29udmVyZ2VfbWlsbGlzGAQgASgBEhIKCnB1c2hfYnl0ZXMYBSABKAQSFQoNc2VydmVyX21pbGxpcxgGIAEoARIVCg1vZmZlcl9pbl9wdXNoGAcgASgIIt8BChRTdGFydEF1dG9TeW5jUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEhwKD2RlYm91bmNlX21pbGxpcxgCIAEoDUgAiAEBEhwKD2ZhbGxiYWNrX21pbGxpcxgDIAEoDUgBiAEBEhoKDXNpZ25hbF9taWxsaXMYBCABKA1IAogBARIWCglzaWduYWxfaWQYBSABKAlIA4gBAUISChBfZGVib3VuY2VfbWlsbGlzQhIKEF9mYWxsYmFja19taWxsaXNCEAoOX3NpZ25hbF9taWxsaXNCDAoKX3NpZ25hbF9pZCIiCg9BdXRvU3luY1N0YXJ0ZWQSDwoHc2Vzc2lvbhgBIAEoCSImChNTdG9wQXV0b1N5bmNSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkiIgoPQXV0b1N5bmNTdG9wcGVkEg8KB3Nlc3Npb24YASABKAkiqgEKDFdhdGNoUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEhcKD3N1YnNjcmlwdGlvbl9pZBgCIAEoCRIpCgRraW5kGAMgASgOMhsubm9tb3MucnVudGltZS52Mi5XYXRjaEtpbmQSLAoFcXVlcnkYBCABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0EhcKD2ludGVydmFsX21pbGxpcxgFIAEoDSInCgxXYXRjaFN0YXJ0ZWQSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJIikKDlVud2F0Y2hSZXF1ZXN0EhcKD3N1YnNjcmlwdGlvbl9pZBgBIAEoCSInCgxXYXRjaFN0b3BwZWQSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJInUKFFByZXBhcmVEb21haW5SZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGZG9tYWluGAIgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAMgASgJEhYKCWRpcmVjdGl2ZRgEIAEoCUgAiAEBQgwKCl9kaXJlY3RpdmUiUgoORG9tYWluUHJlcGFyZWQSDgoGZG9tYWluGAEgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAIgASgJEhgKEGFscmVhZHlfcmVzaWRlbnQYAyABKAgi9gEKFU1vZGVsTGlmZWN5Y2xlUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEj0KBXN0YWdlGAogASgLMiwubm9tb3MucnVudGltZS52Mi5TdGFnZUdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAEj0KBWFkb3B0GAsgASgLMiwubm9tb3MucnVudGltZS52Mi5BZG9wdEdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAEkEKB3Jlc3RvcmUYDCABKAsyLi5ub21vcy5ydW50aW1lLnYyLlJlc3RvcmVHZW5lcmF0ZWRNb2RlbFJlcXVlc3RIAEILCglvcGVyYXRpb24ihgEKGlN0YWdlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIWCg5jYW5kaWRhdGVfaGFzaBgCIAEoCRIQCghsYXdfdXNkehgDIAEoDBIbCg5zb3VyY2Vfc2Vzc2lvbhgEIAEoCUgAiAEBQhEKD19zb3VyY2Vfc2Vzc2lvbiJ6ChpBZG9wdEdlbmVyYXRlZE1vZGVsUmVxdWVzdBIOCgZkb21haW4YASABKAkSFgoOY2FuZGlkYXRlX2hhc2gYAiABKAkSHgoRYWNjZXB0YW5jZV9yZWFzb24YAyABKAlIAIgBAUIUChJfYWNjZXB0YW5jZV9yZWFzb24iegocUmVzdG9yZUdlbmVyYXRlZE1vZGVsUmVxdWVzdBIOCgZkb21haW4YASABKAkSFAoMY3VycmVudF9oYXNoGAIgASgJEh4KEWFjY2VwdGFuY2VfcmVhc29uGAMgASgJSACIAQFCFAoSX2FjY2VwdGFuY2VfcmVhc29uIpMBCg9Nb2RlbERpZmZlcmVuY2USMwoEa2luZBgBIAEoDjIlLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxEaWZmZXJlbmNlS2luZBIRCgRhcmVhGAIgASgJSACIAQESEwoGYWN0aW9uGAMgASgJSAGIAQESDwoHc3VtbWFyeRgEIAEoCUIHCgVfYXJlYUIJCgdfYWN0aW9uIqUBCgtNb2RlbFJldmlldxIXCg9jaGVja2VkX2FjdGlvbnMYASABKAQSGQoRY2FuZGlkYXRlX2FjdGlvbnMYAiABKAQSGQoMc2FtZV9vdXRjb21lGAMgASgISACIAQESNgoLZGlmZmVyZW5jZXMYBCADKAsyIS5ub21vcy5ydW50aW1lLnYyLk1vZGVsRGlmZmVyZW5jZUIPCg1fc2FtZV9vdXRjb21lIoUCChZNb2RlbExpZmVjeWNsZVJlc3BvbnNlEhAKCGFjY2VwdGVkGAEgASgIEjQKBXN0YWdlGAIgASgOMiUubm9tb3MucnVudGltZS52Mi5Nb2RlbExpZmVjeWNsZVN0YWdlEhQKB21lc3NhZ2UYAyABKAlIAIgBARIRCgRoZWFkGAQgASgJSAGIAQESFwoKcmVjZWlwdF9pZBgFIAEoCUgCiAEBEjIKBnJldmlldxgGIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxSZXZpZXdIA4gBAUIKCghfbWVzc2FnZUIHCgVfaGVhZEINCgtfcmVjZWlwdF9pZEIJCgdfcmV2aWV3ImcKGlJlc29sdmVDdXN0b2R5QnJlYWtSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSOAoIZGVjaXNpb24YAiABKA4yJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha0RlY2lzaW9uImEKFEN1c3RvZHlCcmVha1Jlc29sdmVkEg8KB3Nlc3Npb24YASABKAkSOAoIZGVjaXNpb24YAiABKA4yJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha0RlY2lzaW9uIhMKEUNsb3NlUmVhbG1SZXF1ZXN0Ig0KC1JlYWxtQ2xvc2VkIuUBChFEZWFkTGV0dGVyUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEjgKBGxpc3QYCiABKAsyKC5ub21vcy5ydW50aW1lLnYyLkxpc3REZWFkTGV0dGVyc1JlcXVlc3RIABI5CgVyZXRyeRgLIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuUmV0cnlEZWFkTGV0dGVyUmVxdWVzdEgAEj0KB2Rpc2NhcmQYDCABKAsyKi5ub21vcy5ydW50aW1lLnYyLkRpc2NhcmREZWFkTGV0dGVyUmVxdWVzdEgAQgsKCW9wZXJhdGlvbiIYChZMaXN0RGVhZExldHRlcnNSZXF1ZXN0IisKFlJldHJ5RGVhZExldHRlclJlcXVlc3QSEQoJaW50ZW50X2lkGAEgASgJIi0KGERpc2NhcmREZWFkTGV0dGVyUmVxdWVzdBIRCglpbnRlbnRfaWQYASABKAkivQEKEkRlYWRMZXR0ZXJSZXNwb25zZRIwCgRsaXN0GAogASgLMiAubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyTGlzdEgAEjIKBXJldHJ5GAsgASgLMiEubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmV0cnlIABI2CgdkaXNjYXJkGAwgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyRGlzY2FyZEgAQgkKB291dGNvbWUiRAoORGVhZExldHRlckxpc3QSMgoHZW50cmllcxgBIAMoCzIhLm5vbW9zLnJ1bnRpbWUudjIuRGVhZExldHRlckVudHJ5IrkBCg9EZWFkTGV0dGVyRW50cnkSDwoCaWQYASABKAlIAIgBARISCgpjb21taXRfb2lkGAIgASgJEg4KBnNvdXJjZRgDIAEoCRIPCgdtZXNzYWdlGAQgASgJEhMKBmRvbWFpbhgFIAEoCUgBiAEBEhYKCWRpcmVjdGl2ZRgGIAEoCUgCiAEBEhMKC3JlY29yZGVkX2F0GAcgASgJQgUKA19pZEIJCgdfZG9tYWluQgwKCl9kaXJlY3RpdmUieQoPRGVhZExldHRlclJldHJ5Eg8KB3JldHJpZWQYASABKAgSEQoEaGVhZBgCIAEoCUgAiAEBEhcKD2FscmVhZHlfb25fbWFpbhgDIAEoCBIUCgdtZXNzYWdlGAQgASgJSAGIAQFCBwoFX2hlYWRCCgoIX21lc3NhZ2UiJAoRRGVhZExldHRlckRpc2NhcmQSDwoHcmVtb3ZlZBgBIAEoBCLNBQoMUnVudGltZUV2ZW50EhAKCHNlcXVlbmNlGAEgASgEEhQKB3Nlc3Npb24YAiABKAlIAYgBARIvCgVyZWFkeRgKIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlYWR5SAASNwoNd2F0Y2hfY2hhbmdlZBgLIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hDaGFuZ2VkSAASOQoOc3luY19jb21wbGV0ZWQYDCABKAsyHy5ub21vcy5ydW50aW1lLnYyLlN5bmNDb21wbGV0ZWRIABI1CgxsaW5rX2NoYW5nZWQYDSABKAsyHS5ub21vcy5ydW50aW1lLnYyLkxpbmtDaGFuZ2VkSAASOQoOc2lnbmFsX2NoYW5nZWQYDiABKAsyHy5ub21vcy5ydW50aW1lLnYyLlNpZ25hbENoYW5nZWRIABI7Cg9jdXN0b2R5X2NoYW5nZWQYDyABKAsyIC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlDaGFuZ2VkSAASQgoTbG9jYWxfd29ya19yZWplY3RlZBgQIAEoCzIjLm5vbW9zLnJ1bnRpbWUudjIuTG9jYWxXb3JrUmVqZWN0ZWRIABIzCgtsYXdfY2hhbmdlZBgRIAEoCzIcLm5vbW9zLnJ1bnRpbWUudjIuTGF3Q2hhbmdlZEgAEkMKD2tlcm5lbF9wcm9ncmVzcxgSIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuS2VybmVsUHJvZ3Jlc3NPYnNlcnZlZEgAEi0KBHNwYW4YEyABKAsyHS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVTcGFuSAASPwoRdHJhbnNmZXJfcHJvZ3Jlc3MYFCABKAsyIi5ub21vcy5ydW50aW1lLnYyLlRyYW5zZmVyUHJvZ3Jlc3NIAEIHCgVldmVudEIKCghfc2Vzc2lvbiI+CgxSdW50aW1lUmVhZHkSFwoPcnVudGltZV92ZXJzaW9uGAEgASgJEhUKDWtlcm5lbF9zaGEyNTYYAiABKAwigAEKDFdhdGNoQ2hhbmdlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkSEwoLcmVzdWx0X3VzZGEYAiABKAwSNgoHZmFpbHVyZRgDIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIAIgBAUIKCghfZmFpbHVyZSKcAQoNU3luY0NvbXBsZXRlZBIOCgZyZWFzb24YASABKAkSNwoGcmVzdWx0GAIgASgLMicubm9tb3MucnVudGltZS52Mi5TeW5jV29ya3NwYWNlUmVzcG9uc2USNgoHZmFpbHVyZRgDIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIAIgBAUIKCghfZmFpbHVyZSI7CgtMaW5rQ2hhbmdlZBIsCgZzdGF0dXMYASABKA4yHC5ub21vcy5ydW50aW1lLnYyLkxpbmtTdGF0dXMiOAoNU2lnbmFsQ2hhbmdlZBIOCgZkb21haW4YASABKAkSFwoPcHJvamVjdGlvbl91c2RhGAIgASgMIvQBCg5DdXN0b2R5Q2hhbmdlZBIxCgRraW5kGAEgASgOMiMubm9tb3MucnVudGltZS52Mi5DdXN0b2R5Q2hhbmdlS2luZBI1Cg1jdXN0b2R5X2JyZWFrGAIgASgLMh4ubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QnJlYWsSFgoJb3BlcmF0aW9uGAMgASgJSACIAQESFQoIcmVjbG9uZWQYBCABKAhIAYgBARIbCg5wYXJrZWRfaW50ZW50cxgFIAEoBEgCiAEBQgwKCl9vcGVyYXRpb25CCwoJX3JlY2xvbmVkQhEKD19wYXJrZWRfaW50ZW50cyLhAQoRTG9jYWxXb3JrUmVqZWN0ZWQSEQoJd29ya3NwYWNlGAEgASgJEjYKB3JlZnVzZWQYAiADKAsyJS5ub21vcy5ydW50aW1lLnYyLlJlamVjdGVkTG9jYWxJbnRlbnQSDgoGcGFya2VkGAMgASgIEhUKCHJlc2V0X3RvGAQgASgJSACIAQESEQoJcmV0cnlhYmxlGAUgASgIEjoKBnNvdXJjZRgGIAEoDjIqLm5vbW9zLnJ1bnRpbWUudjIuTG9jYWxXb3JrUmVqZWN0aW9uU291cmNlQgsKCV9yZXNldF90byJjChNDdXN0b2R5U3VwZXJzZXNzaW9uEhoKDXN1cGVyc2VkZWRfYXQYASABKAlIAIgBARITCgZyZWFzb24YAiABKAlIAYgBAUIQCg5fc3VwZXJzZWRlZF9hdEIJCgdfcmVhc29uIrgCCgxDdXN0b2R5QnJlYWsSMAoEa2luZBgBIAEoDjIiLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrS2luZBIVCg1sb2NhbF9nZW5lc2lzGAIgASgJEhYKDnJlbW90ZV9nZW5lc2lzGAMgASgJEhoKEnJlbW90ZV9pbmNhcm5hdGlvbhgEIAEoCRJACgxzdXBlcnNlc3Npb24YBSABKAsyJS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTdXBlcnNlc3Npb25IAIgBARIaChJsb2NhbF9vbmx5X2ludGVudHMYBiABKAQSIgoVbGFzdF9zeW5jZWRfYXRfbWlsbGlzGAcgASgESAGIAQFCDwoNX3N1cGVyc2Vzc2lvbkIYChZfbGFzdF9zeW5jZWRfYXRfbWlsbGlzIs0BChNSZWplY3RlZExvY2FsSW50ZW50EhYKCWludGVudF9pZBgBIAEoCUgAiAEBEhcKCmNvbW1pdF9vaWQYAiABKAlIAYgBARITCgZkb21haW4YAyABKAlIAogBARIWCglkaXJlY3RpdmUYBCABKAlIA4gBARIPCgdtZXNzYWdlGAUgASgJEhEKCXJldHJ5YWJsZRgGIAEoCEIMCgpfaW50ZW50X2lkQg0KC19jb21taXRfb2lkQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSJQCgpMYXdDaGFuZ2VkEg4KBmRvbWFpbhgBIAEoCRIWCg5wYWNrYWdlX3NoYTI1NhgCIAEoCRIaChJjb21wYXRpYmlsaXR5X3VzZGEYAyABKAwi3QEKC1J1bnRpbWVTcGFuEhAKCHRyYWNlX2lkGAEgASgMEg8KB3NwYW5faWQYAiABKAwSGwoOcGFyZW50X3NwYW5faWQYAyABKAxIAIgBARIMCgRuYW1lGAQgASgJEhoKEnN0YXJ0ZWRfdW5peF9uYW5vcxgFIAEoBBIWCg5kdXJhdGlvbl9uYW5vcxgGIAEoBBI5CgphdHRyaWJ1dGVzGAcgAygLMiUubm9tb3MucnVudGltZS52Mi5EaWFnbm9zdGljQXR0cmlidXRlQhEKD19wYXJlbnRfc3Bhbl9pZCLqAQoWS2VybmVsUHJvZ3Jlc3NPYnNlcnZlZBI5CghzbmFwc2hvdBgBIAEoCzInLm5vbW9zLmtlcm5lbC52MS5LZXJuZWxQcm9ncmVzc1NuYXBzaG90EiQKHGhvc3Rfb2JzZXJ2ZWRfZWxhcHNlZF9taWNyb3MYAiABKAQSKgoiaG9zdF9vYnNlcnZlZF9waGFzZV9lbGFwc2VkX21pY3JvcxgDIAEoBBIeChZwcm9jZXNzX3Jlc2lkZW50X2J5dGVzGAQgASgEEiMKG3Byb2Nlc3NfcGVha19yZXNpZGVudF9ieXRlcxgFIAEoBCKCAQoQVHJhbnNmZXJQcm9ncmVzcxIWCg5yZWNlaXZlZF9ieXRlcxgBIAEoBBIYCgt0b3RhbF9ieXRlcxgCIAEoBEgAiAEBEiwKBGtpbmQYAyABKA4yHi5ub21vcy5ydW50aW1lLnYyLlRyYW5zZmVyS2luZEIOCgxfdG90YWxfYnl0ZXMqmQEKEkN1c3RvZHlCcmVha1BvbGljeRIkCiBDVVNUT0RZX0JSRUFLX1BPTElDWV9VTlNQRUNJRklFRBAAEhwKGENVU1RPRFlfQlJFQUtfUE9MSUNZX0FTSxABEh4KGkNVU1RPRFlfQlJFQUtfUE9MSUNZX0FET1BUEAISHwobQ1VTVE9EWV9CUkVBS19QT0xJQ1lfUkVKRUNUEAMqoAEKEldvcmtzcGFjZVJlc2lkZW5jeRIjCh9XT1JLU1BBQ0VfUkVTSURFTkNZX1VOU1BFQ0lGSUVEEAASHwobV09SS1NQQUNFX1JFU0lERU5DWV9NT1VOVEVEEAESHgoaV09SS1NQQUNFX1JFU0lERU5DWV9QQVJLRUQQAhIkCiBXT1JLU1BBQ0VfUkVTSURFTkNZX0NVU1RPRFlfT05MWRADKo0BChRXb3Jrc3BhY2VTeW5jUG9zdHVyZRImCiJXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX1VOU1BFQ0lGSUVEEAASJQohV09SS1NQQUNFX1NZTkNfUE9TVFVSRV9MT0NBTF9PTkxZEAESJgoiV09SS1NQQUNFX1NZTkNfUE9TVFVSRV9DTE9VRF9CT1VORBACKqgBCglXYXRjaEtpbmQSGgoWV0FUQ0hfS0lORF9VTlNQRUNJRklFRBAAEhQKEFdBVENIX0tJTkRfUVVFUlkQARIUChBXQVRDSF9LSU5EX0JZX0lEEAISFgoSV0FUQ0hfS0lORF9TUEFUSUFMEAMSFwoTV0FUQ0hfS0lORF9BQ1RJVklUWRAEIgQIBRAFKhxXQVRDSF9LSU5EX1BFTkRJTkdfQ09ORkxJQ1RTKqQDChNNb2RlbExpZmVjeWNsZVN0YWdlEiUKIU1PREVMX0xJRkVDWUNMRV9TVEFHRV9VTlNQRUNJRklFRBAAEisKJ01PREVMX0xJRkVDWUNMRV9TVEFHRV9JREVOVElUWV9SRVFVSVJFRBABEioKJk1PREVMX0xJRkVDWUNMRV9TVEFHRV9TVEFHSU5HX1JFUVVJUkVEEAISIwofTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BSRUZMSUdIVBADEi0KKU1PREVMX0xJRkVDWUNMRV9TVEFHRV9BQ0NFUFRBTkNFX1JFUVVJUkVEEAQSIwofTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FETUlTU0lPThAFEiEKHU1PREVMX0xJRkVDWUNMRV9TVEFHRV9QRU5ESU5HEAYSIgoeTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BST01PVEVEEAcSIgoeTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1JFU1RPUkVEEAgSKQolTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FMUkVBRFlfQ1VSUkVOVBAJKqQBChNNb2RlbERpZmZlcmVuY2VLaW5kEiUKIU1PREVMX0RJRkZFUkVOQ0VfS0lORF9VTlNQRUNJRklFRBAAEh8KG01PREVMX0RJRkZFUkVOQ0VfS0lORF9SVUxFUxABEiEKHU1PREVMX0RJRkZFUkVOQ0VfS0lORF9PVVRDT01FEAISIgoeTU9ERUxfRElGRkVSRU5DRV9LSU5EX0VWSURFTkNFEAMqgwEKFEN1c3RvZHlCcmVha0RlY2lzaW9uEiYKIkNVU1RPRFlfQlJFQUtfREVDSVNJT05fVU5TUEVDSUZJRUQQABIgChxDVVNUT0RZX0JSRUFLX0RFQ0lTSU9OX0FET1BUEAESIQodQ1VTVE9EWV9CUkVBS19ERUNJU0lPTl9SRUpFQ1QQAipXCgpMaW5rU3RhdHVzEhsKF0xJTktfU1RBVFVTX1VOU1BFQ0lGSUVEEAASFAoQTElOS19TVEFUVVNfT1BFThABEhYKEkxJTktfU1RBVFVTX0NMT1NFRBACKuIBChFDdXN0b2R5Q2hhbmdlS2luZBIjCh9DVVNUT0RZX0NIQU5HRV9LSU5EX1VOU1BFQ0lGSUVEEAASIAocQ1VTVE9EWV9DSEFOR0VfS0lORF9ERVRFQ1RFRBABEiAKHENVU1RPRFlfQ0hBTkdFX0tJTkRfUkVKRUNURUQQAhIgChxDVVNUT0RZX0NIQU5HRV9LSU5EX0FET1BUSU5HEAMSJQohQ1VTVE9EWV9DSEFOR0VfS0lORF9BRE9QVF9SRUZVU0VEEAQSGwoXQ1VTVE9EWV9DSEFOR0VfS0lORF9BU0sQBSp6ChBDdXN0b2R5QnJlYWtLaW5kEiIKHkNVU1RPRFlfQlJFQUtfS0lORF9VTlNQRUNJRklFRBAAEiEKHUNVU1RPRFlfQlJFQUtfS0lORF9TVVBFUlNFREVEEAESHwobQ1VTVE9EWV9CUkVBS19LSU5EX0RJVkVSR0VEEAIqmAEKGExvY2FsV29ya1JlamVjdGlvblNvdXJjZRIrCidMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfVU5TUEVDSUZJRUQQABIpCiVMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfQURNSVNTSU9OEAESJAogTE9DQUxfV09SS19SRUpFQ1RJT05fU09VUkNFX1NZTkMQAip2CgxUcmFuc2ZlcktpbmQSHQoZVFJBTlNGRVJfS0lORF9VTlNQRUNJRklFRBAAEhcKE1RSQU5TRkVSX0tJTkRfREVMVEEQARIWChJUUkFOU0ZFUl9LSU5EX0ZVTEwQAhIWChJUUkFOU0ZFUl9LSU5EX1BVU0gQAzJkChNOb21vc1J1bnRpbWVTZXJ2aWNlEk0KBkludm9rZRIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlcXVlc3QaIS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVSZXNwb25zZWIGcHJvdG8z", [file_nomos_kernel_v1_kernel, file_nomos_kernel_v1_progress]);
7709
- var CustodyOfferBatchRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_runtime_v2_runtime, 12);
7710
- var CustodyIntentOfferSchema = /* @__PURE__ */ messageDesc(file_nomos_runtime_v2_runtime, 13);
7711
- var CustodyInlineOffersSchema = /* @__PURE__ */ messageDesc(file_nomos_runtime_v2_runtime, 14);
7712
- var CustodySessionCandidateSchema = /* @__PURE__ */ messageDesc(file_nomos_runtime_v2_runtime, 15);
7713
- var CustodyOfferBatchResponseSchema = /* @__PURE__ */ messageDesc(file_nomos_runtime_v2_runtime, 16);
7720
+ var file_nomos_runtime_v2_runtime = /* @__PURE__ */ fileDesc("Ch5ub21vcy9ydW50aW1lL3YyL3J1bnRpbWUucHJvdG8SEG5vbW9zLnJ1bnRpbWUudjIitwoKDlJ1bnRpbWVSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIyCgV0cmFjZRgDIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhY2VDb250ZXh0SAGIAQESOgoLa2VybmVsX2NhbGwYCiABKAsyIy5ub21vcy5ydW50aW1lLnYyLktlcm5lbENhbGxSZXF1ZXN0SAASMwoHY29ubmVjdBgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdFJlcXVlc3RIABJCCg9saXN0X3dvcmtzcGFjZXMYDCABKAsyJy5ub21vcy5ydW50aW1lLnYyLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdEgAEkgKEnNuYXBzaG90X3dvcmtzcGFjZRgNIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0SAASQAoOc3luY193b3Jrc3BhY2UYDiABKAsyJi5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXF1ZXN0SAASQQoPc3RhcnRfYXV0b19zeW5jGA8gASgLMiYubm9tb3MucnVudGltZS52Mi5TdGFydEF1dG9TeW5jUmVxdWVzdEgAEj8KDnN0b3BfYXV0b19zeW5jGBAgASgLMiUubm9tb3MucnVudGltZS52Mi5TdG9wQXV0b1N5bmNSZXF1ZXN0SAASLwoFd2F0Y2gYESABKAsyHi5ub21vcy5ydW50aW1lLnYyLldhdGNoUmVxdWVzdEgAEjMKB3Vud2F0Y2gYEiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlVud2F0Y2hSZXF1ZXN0SAASQAoOcHJlcGFyZV9kb21haW4YEyABKAsyJi5ub21vcy5ydW50aW1lLnYyLlByZXBhcmVEb21haW5SZXF1ZXN0SAASTQoVcmVzb2x2ZV9jdXN0b2R5X2JyZWFrGBQgASgLMiwubm9tb3MucnVudGltZS52Mi5SZXNvbHZlQ3VzdG9keUJyZWFrUmVxdWVzdEgAEjoKC2Nsb3NlX3JlYWxtGBUgASgLMiMubm9tb3MucnVudGltZS52Mi5DbG9zZVJlYWxtUmVxdWVzdEgAEjoKC2RlYWRfbGV0dGVyGBYgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVxdWVzdEgAEkAKDmhpc3RvcmljX3F1ZXJ5GBcgASgLMiYubm9tb3MucnVudGltZS52Mi5IaXN0b3JpY1F1ZXJ5UmVxdWVzdEgAEkIKD21vZGVsX2xpZmVjeWNsZRgYIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxMaWZlY3ljbGVSZXF1ZXN0SAASXQodZXN0YWJsaXNoX2FwcGxpY2F0aW9uX2N1c3RvZHkYGSABKAsyNC5ub21vcy5ydW50aW1lLnYyLkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3RIABJEChB3b3Jrc3BhY2Vfc3RhdHVzGBogASgLMigubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdGF0dXNSZXF1ZXN0SAASTwoWcmVtb3RlX2dlbmVyYXRlZF9vZmZlchgbIAEoCzItLm5vbW9zLnJ1bnRpbWUudjIuUmVtb3RlR2VuZXJhdGVkT2ZmZXJSZXF1ZXN0SABCCQoHY29tbWFuZEIICgZfdHJhY2UiUwoRS2VybmVsQ2FsbFJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRItCgdyZXF1ZXN0GAIgASgLMhwubm9tb3Mua2VybmVsLnYxLkNhbGxSZXF1ZXN0IvECCiJFc3RhYmxpc2hBcHBsaWNhdGlvbkN1c3RvZHlSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGcGFyZW50GAIgASgJEhEKCXByaW5jaXBhbBgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEhUKDWRldmljZV9zZWNyZXQYBSABKAwSFQoNZGV2aWNlX3B1YmxpYxgGIAEoDBISCgphdXRoX3Rva2VuGAcgASgJEhAKCGlkX3Rva2VuGAggASgJEhQKDHZlcmlmaWVkX3ZpYRgJIAEoCRIPCgdib3JuX2F0GAogASgJEjsKE2Vucm9sbF9maXJzdF9kZXZpY2UYCyABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbBI9ChViaXJ0aF9yZWNlaXZpbmdfZ3JvdXAYDCABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbBIPCgdjb25maXJtGA0gASgIIp8BCh1BcHBsaWNhdGlvbkN1c3RvZHlFc3RhYmxpc2hlZBIMCgRob21lGAEgASgJEhcKCmNoaWxkX2hlYWQYAiABKAlIAIgBARIQCgh2ZXJpZmllZBgDIAEoCBIfChJ2ZXJpZmljYXRpb25fZXJyb3IYBCABKAlIAYgBAUINCgtfY2hpbGRfaGVhZEIVChNfdmVyaWZpY2F0aW9uX2Vycm9yImUKFEhpc3RvcmljUXVlcnlSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGbW9tZW50GAIgASgJEiwKBXF1ZXJ5GAMgASgLMh0ubm9tb3Mua2VybmVsLnYxLlF1ZXJ5UmVxdWVzdCLGCgoPUnVudGltZVJlc3BvbnNlEhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIzCgdmYWlsdXJlGAogASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAEjQKC2tlcm5lbF9jYWxsGAsgASgLMh0ubm9tb3Mua2VybmVsLnYxLkNhbGxSZXNwb25zZUgAEjAKCWNvbm5lY3RlZBgMIAEoCzIbLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdGVkSAASOQoOd29ya3NwYWNlX2xpc3QYDSABKAsyHy5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZUxpc3RIABJBChJ3b3Jrc3BhY2Vfc25hcHNob3QYDiABKAsyIy5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVNuYXBzaG90SAASQQoOc3luY193b3Jrc3BhY2UYDyABKAsyJy5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXNwb25zZUgAEj4KEWF1dG9fc3luY19zdGFydGVkGBAgASgLMiEubm9tb3MucnVudGltZS52Mi5BdXRvU3luY1N0YXJ0ZWRIABI+ChFhdXRvX3N5bmNfc3RvcHBlZBgRIAEoCzIhLm5vbW9zLnJ1bnRpbWUudjIuQXV0b1N5bmNTdG9wcGVkSAASNwoNd2F0Y2hfc3RhcnRlZBgSIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hTdGFydGVkSAASNwoNd2F0Y2hfc3RvcHBlZBgTIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hTdG9wcGVkSAASOwoPZG9tYWluX3ByZXBhcmVkGBQgASgLMiAubm9tb3MucnVudGltZS52Mi5Eb21haW5QcmVwYXJlZEgAEkgKFmN1c3RvZHlfYnJlYWtfcmVzb2x2ZWQYFSABKAsyJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha1Jlc29sdmVkSAASNQoMcmVhbG1fY2xvc2VkGBYgASgLMh0ubm9tb3MucnVudGltZS52Mi5SZWFsbUNsb3NlZEgAEjMKB2Jsb2NrZWQYFyABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVCbG9ja2VkSAASSAoWcmVtb3RlX29mZmVyX2FkbWlzc2lvbhgYIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuUmVtb3RlT2ZmZXJBZG1pc3Npb25IABI7CgtkZWFkX2xldHRlchgZIAEoCzIkLm5vbW9zLnJ1bnRpbWUudjIuRGVhZExldHRlclJlc3BvbnNlSAASQwoPbW9kZWxfbGlmZWN5Y2xlGBogASgLMigubm9tb3MucnVudGltZS52Mi5Nb2RlbExpZmVjeWNsZVJlc3BvbnNlSAASWgofYXBwbGljYXRpb25fY3VzdG9keV9lc3RhYmxpc2hlZBgbIAEoCzIvLm5vbW9zLnJ1bnRpbWUudjIuQXBwbGljYXRpb25DdXN0b2R5RXN0YWJsaXNoZWRIABI9ChB3b3Jrc3BhY2Vfc3RhdHVzGBwgASgLMiEubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdGF0dXNIABJQChZyZW1vdGVfZ2VuZXJhdGVkX29mZmVyGB0gASgLMi4ubm9tb3MucnVudGltZS52Mi5SZW1vdGVHZW5lcmF0ZWRPZmZlckFjY2VwdGVkSABCCQoHb3V0Y29tZSK3AQobUmVtb3RlR2VuZXJhdGVkT2ZmZXJSZXF1ZXN0EhYKDnNvdXJjZV9zZXNzaW9uGAEgASgJEhgKEHRhcmdldF93b3Jrc3BhY2UYAiABKAkSDQoFYWN0b3IYAyABKAkSFQoNYXV0aG9yX3NlY3JldBgEIAEoDBISCgphdXRoX3Rva2VuGAUgASgMEiwKBGNhbGwYBiABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbCI/ChxSZW1vdGVHZW5lcmF0ZWRPZmZlckFjY2VwdGVkEhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRoZWFkGAIgASgJIp8BCg5SdW50aW1lQmxvY2tlZBJBCgl3b3Jrc3BhY2UYASABKAsyLC5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVJlc2lkZW5jeVJlcXVpcmVkSAASQAoIc2libGluZ3MYAiABKAsyLC5ub21vcy5ydW50aW1lLnYyLlNpYmxpbmdSZXNpZGVuY2llc1JlcXVpcmVkSABCCAoGcmVhc29uIi8KGldvcmtzcGFjZVJlc2lkZW5jeVJlcXVpcmVkEhEKCXdvcmtzcGFjZRgBIAEoCSJVChhTaWJsaW5nUmVzaWRlbmN5UmVxdWlyZWQSEQoJd29ya3NwYWNlGAEgASgJEhMKC3NvdXJjZV9oZWFkGAIgASgJEhEKCWZvbGRfcm9vdBgDIAEoCSJdChpTaWJsaW5nUmVzaWRlbmNpZXNSZXF1aXJlZBI/CgtyZXNpZGVuY2llcxgBIAMoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU2libGluZ1Jlc2lkZW5jeVJlcXVpcmVkIoYCChRSZW1vdGVPZmZlckFkbWlzc2lvbhIRCgl3b3Jrc3BhY2UYASABKAkSDAoEbWFpbhgCIAEoCRIYCgtzZWFsZWRfbWFpbhgDIAEoCUgAiAEBEi8KB3ZlcmRpY3QYBCABKAsyHi5ub21vcy5rZXJuZWwudjEuT2ZmZXJSZXNwb25zZRIzCgxib3JuX2N1c3RvZHkYBSADKAsyHS5ub21vcy5ydW50aW1lLnYyLkJvcm5DdXN0b2R5EhMKC3Jlc3VsdF9wYWNrGAYgASgMEhgKC3Jlc3VsdF9iYXNlGAcgASgJSAGIAQFCDgoMX3NlYWxlZF9tYWluQg4KDF9yZXN1bHRfYmFzZSJKCgtCb3JuQ3VzdG9keRItCgVjaGlsZBgBIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5Cb3JuV29ya3NwYWNlEgwKBHBhY2sYAiABKAwi+QEKGEN1c3RvZHlPZmZlckJhdGNoUmVxdWVzdBIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSNwoGaW5saW5lGAMgASgLMiUubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW5saW5lT2ZmZXJzSAASRgoRc2Vzc2lvbl9jYW5kaWRhdGUYBCABKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTZXNzaW9uQ2FuZGlkYXRlSAASFgoJYmFzZV9oZWFkGAUgASgJSAGIAQFCCAoGc291cmNlQgwKCl9iYXNlX2hlYWQiTgoSQ3VzdG9keUludGVudE9mZmVyEg8KB3Nlc3Npb24YASABKAkSEgoKY29tbWl0X29pZBgCIAEoCRITCgtjaGFuZ2VfdXNkYRgDIAEoDCJLChNDdXN0b2R5SW5saW5lT2ZmZXJzEjQKBm9mZmVycxgBIAMoCzIkLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudE9mZmVyIiwKF0N1c3RvZHlTZXNzaW9uQ2FuZGlkYXRlEhEKCXJlZmVyZW5jZRgBIAEoCSL3AQoZQ3VzdG9keU9mZmVyQmF0Y2hSZXNwb25zZRIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSNwoJYWRtaXNzaW9uGAogASgLMiIubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QWRtaXNzaW9uSAASMwoHZmFpbHVyZRgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIABIzCgdibG9ja2VkGAwgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lQmxvY2tlZEgAQgkKB291dGNvbWUi7gIKEEN1c3RvZHlBZG1pc3Npb24SDAoEbWFpbhgBIAEoCRIYCgtzZWFsZWRfbWFpbhgCIAEoCUgAiAEBEjsKCHNlc3Npb25zGAMgAygLMikubm9tb3MucnVudGltZS52Mi5DdXN0b2R5U2Vzc2lvbkFkbWlzc2lvbhI1Cg5iaXJ0aF9vdXRjb21lcxgEIAMoCzIdLm5vbW9zLmtlcm5lbC52MS5CaXJ0aE91dGNvbWUSMwoMYm9ybl9jdXN0b2R5GAUgAygLMh0ubm9tb3MucnVudGltZS52Mi5Cb3JuQ3VzdG9keRITCgtyZXN1bHRfcGFjaxgGIAEoDBIYCgtyZXN1bHRfYmFzZRgHIAEoCUgBiAEBEjoKB3RpbWluZ3MYCCABKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlBZG1pc3Npb25UaW1pbmdzQg4KDF9zZWFsZWRfbWFpbkIOCgxfcmVzdWx0X2Jhc2UiZQoXQ3VzdG9keVNlc3Npb25BZG1pc3Npb24SDwoHc2Vzc2lvbhgBIAEoCRI5CgdpbnRlbnRzGAIgAygLMigubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50QWRtaXNzaW9uIpACChZDdXN0b2R5SW50ZW50QWRtaXNzaW9uEhIKCmNvbW1pdF9vaWQYASABKAkSFgoJaW50ZW50X2lkGAIgASgJSAGIAQESOwoIYWRtaXR0ZWQYCiABKAsyJy5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRBZG1pdHRlZEgAEjkKB3NraXBwZWQYCyABKAsyJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRTa2lwcGVkSAASOQoHcmVmdXNlZBgMIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudFJlZnVzZWRIAEIJCgdvdXRjb21lQgwKCl9pbnRlbnRfaWQikAEKFUN1c3RvZHlJbnRlbnRBZG1pdHRlZBIMCgRoZWFkGAEgASgJEjMKB2NyZWF0ZWQYAiADKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJBZ2dyZWdhdGVSZWYSNAoIYWZmZWN0ZWQYAyADKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJBZ2dyZWdhdGVSZWYiLwoUQ3VzdG9keUludGVudFNraXBwZWQSFwoPYWxyZWFkeV9vbl9tYWluGAEgASgIIloKFEN1c3RvZHlJbnRlbnRSZWZ1c2VkEg8KB21lc3NhZ2UYASABKAkSFQoNZGVhZF9sZXR0ZXJlZBgCIAEoCBIRCgRoaW50GAMgASgJSACIAQFCBwoFX2hpbnQi7QEKF0N1c3RvZHlBZG1pc3Npb25UaW1pbmdzEhQKDHRvdGFsX21pbGxpcxgBIAEoARITCgtzY2FuX21pbGxpcxgCIAEoARIUCgxmZXRjaF9taWxsaXMYAyABKAESEwoLc2VhbF9taWxsaXMYBCABKAESGAoQZ2F0ZV9mb2xkX21pbGxpcxgFIAEoARIUCgxpbnRlbnRfY291bnQYBiABKA0SFQoNc2Vzc2lvbl9jb3VudBgHIAEoDRI1CgVzcGFucxgIIAMoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUFkbWlzc2lvblNwYW4ilwEKFEN1c3RvZHlBZG1pc3Npb25TcGFuEgoKAmlkGAEgASgJEg0KBXRyYWNrGAIgASgJEgwKBG5hbWUYAyABKAkSDAoEa2luZBgEIAEoCRINCgVkZXB0aBgFIAEoDRIbChNzdGFydGVkX3VuaXhfbWlsbGlzGAYgASgBEhwKFGZpbmlzaGVkX3VuaXhfbWlsbGlzGAcgASgBIkIKDFRyYWNlQ29udGV4dBIQCgh0cmFjZV9pZBgBIAEoDBIPCgdzcGFuX2lkGAIgASgMEg8KB3NhbXBsZWQYAyABKAgi6QEKDlJ1bnRpbWVGYWlsdXJlEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIRCgljb21wb25lbnQYAyABKAkSFgoJd29ya3NwYWNlGAQgASgJSACIAQESEwoGZG9tYWluGAUgASgJSAGIAQESFgoJZGlyZWN0aXZlGAYgASgJSAKIAQESOQoKYXR0cmlidXRlcxgHIAMoCzIlLm5vbW9zLnJ1bnRpbWUudjIuRGlhZ25vc3RpY0F0dHJpYnV0ZUIMCgpfd29ya3NwYWNlQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSKlAQoTRGlhZ25vc3RpY0F0dHJpYnV0ZRIMCgRuYW1lGAEgASgJEhYKDHN0cmluZ192YWx1ZRgCIAEoCUgAEhcKDWludGVnZXJfdmFsdWUYAyABKBJIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIXCg1ib29sZWFuX3ZhbHVlGAUgASgISAASFQoLYnl0ZXNfdmFsdWUYBiABKAxIAEIHCgV2YWx1ZSLNAgoOQ29ubmVjdFJlcXVlc3QSEQoJd29ya3NwYWNlGAEgASgJEhEKCWNsaWVudF9pZBgCIAEoCRIUCgdzZXNzaW9uGAMgASgJSACIAQESEgoFY2xvdWQYBCABKAlIAYgBARISCgphdXRoX3Rva2VuGAUgASgMEhUKDWF1dGhvcl9zZWNyZXQYBiABKAwSIgoabWF4aW11bV9tb3VudGVkX3dvcmtzcGFjZXMYByABKA0SFAoMYWxsb3dfdW5ib3JuGAggASgIEg8KB3JlY292ZXIYCSABKAgSQgoUY3VzdG9keV9icmVha19wb2xpY3kYCiABKA4yJC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha1BvbGljeRIbChNoYXNfcmVzdG9yZV9jdXN0b2R5GAsgASgIQgoKCF9zZXNzaW9uQggKBl9jbG91ZCKLAQoJQ29ubmVjdGVkEhEKCXdvcmtzcGFjZRgBIAEoCRIPCgdzZXNzaW9uGAIgASgJEhMKC2Nsb3VkX2JvdW5kGAMgASgIEjgKCHJlY292ZXJ5GAQgASgLMiEubm9tb3MucnVudGltZS52Mi5DdXN0b2R5UmVjb3ZlcnlIAIgBAUILCglfcmVjb3ZlcnkiWwoPQ3VzdG9keVJlY292ZXJ5EhUKDXByZXZpb3VzX2hlYWQYASABKAkSFgoOcmVjb3ZlcmVkX2hlYWQYAiABKAkSGQoRcmVjb3ZlcmVkX2ludGVudHMYAyABKAQiFwoVTGlzdFdvcmtzcGFjZXNSZXF1ZXN0Iq0BChBXb3Jrc3BhY2VTdW1tYXJ5Eg8KB3Nlc3Npb24YASABKAkSEQoJd29ya3NwYWNlGAIgASgJEjcKCXJlc2lkZW5jeRgDIAEoDjIkLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlUmVzaWRlbmN5EjwKDHN5bmNfcG9zdHVyZRgEIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlU3luY1Bvc3R1cmUiRwoNV29ya3NwYWNlTGlzdBI2Cgp3b3Jrc3BhY2VzGAEgAygLMiIubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdW1tYXJ5IikKFldvcmtzcGFjZVN0YXR1c1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCSJACg9Xb3Jrc3BhY2VTdGF0dXMSEQoJd29ya3NwYWNlGAEgASgJEhEKBGhlYWQYAiABKAlIAIgBAUIHCgVfaGVhZCJNChhTbmFwc2hvdFdvcmtzcGFjZVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIUCgdpZl9oZWFkGAIgASgJSACIAQFCCgoIX2lmX2hlYWQiXAoRV29ya3NwYWNlU25hcHNob3QSEQoJd29ya3NwYWNlGAEgASgJEgwKBGhlYWQYAiABKAkSEQoJdW5jaGFuZ2VkGAMgASgIEhMKC2hhc19jdXN0b2R5GAQgASgIIjYKFFN5bmNXb3Jrc3BhY2VSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDQoFYWRtaXQYAiABKAgivAUKFVN5bmNXb3Jrc3BhY2VSZXNwb25zZRIRCgl3b3Jrc3BhY2UYASABKAkSGgoNcHJldmlvdXNfaGVhZBgCIAEoCUgAiAEBEhkKDGN1cnJlbnRfaGVhZBgDIAEoCUgBiAEBEhAKCGFkbWl0dGVkGAQgASgEEg8KB3JlZnVzZWQYBSABKAQSEAoIZGVmZXJyZWQYBiABKAQSEgoKbG9jYWxfb25seRgHIAEoCBIOCgZwdWxsZWQYCCABKAgSEAoIZGl2ZXJnZWQYCSABKAgSGgoScmVjb25uZWN0X3JlcXVpcmVkGAogASgIEhMKC3N0aWxsX2FoZWFkGAsgASgIEg8KB29mZmxpbmUYDCABKAgSEwoLcHVzaF9mYWlsZWQYDSABKAgSHQoVZGlyZWN0X29mZmVyX2RlZmVycmVkGA4gASgIEjUKDmJpcnRoX291dGNvbWVzGA8gAygLMh0ubm9tb3Mua2VybmVsLnYxLkJpcnRoT3V0Y29tZRIbChNhZG1pdHRlZF9pbnRlbnRfaWRzGBAgAygJEhwKFGNvbnZlcmdlZF9pbnRlbnRfaWRzGBEgAygJEkIKCnB1c2hfZXJyb3IYEiABKAsyKS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVUcmFuc3BvcnRGYWlsdXJlSAKIAQESRwoPZGlzY292ZXJ5X2Vycm9yGBMgASgLMikubm9tb3MucnVudGltZS52Mi5SdW50aW1lVHJhbnNwb3J0RmFpbHVyZUgDiAEBEjMKB3RpbWluZ3MYFCABKAsyIi5ub21vcy5ydW50aW1lLnYyLlN5bmNQaGFzZVRpbWluZ3NCEAoOX3ByZXZpb3VzX2hlYWRCDwoNX2N1cnJlbnRfaGVhZEINCgtfcHVzaF9lcnJvckISChBfZGlzY292ZXJ5X2Vycm9yIl0KF1J1bnRpbWVUcmFuc3BvcnRGYWlsdXJlEhAKCGVuZHBvaW50GAEgASgJEg4KBnN0YXR1cxgCIAEoERIPCgdyZWZ1c2VkGAMgASgIEg8KB21lc3NhZ2UYBCABKAkisQEKEFN5bmNQaGFzZVRpbWluZ3MSEwoLcHVzaF9taWxsaXMYASABKAESFAoMYWRtaXRfbWlsbGlzGAIgASgBEhcKD3ByZWZldGNoX21pbGxpcxgDIAEoARIXCg9jb252ZXJnZV9taWxsaXMYBCABKAESEgoKcHVzaF9ieXRlcxgFIAEoBBIVCg1zZXJ2ZXJfbWlsbGlzGAYgASgBEhUKDW9mZmVyX2luX3B1c2gYByABKAgi3wEKFFN0YXJ0QXV0b1N5bmNSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSHAoPZGVib3VuY2VfbWlsbGlzGAIgASgNSACIAQESHAoPZmFsbGJhY2tfbWlsbGlzGAMgASgNSAGIAQESGgoNc2lnbmFsX21pbGxpcxgEIAEoDUgCiAEBEhYKCXNpZ25hbF9pZBgFIAEoCUgDiAEBQhIKEF9kZWJvdW5jZV9taWxsaXNCEgoQX2ZhbGxiYWNrX21pbGxpc0IQCg5fc2lnbmFsX21pbGxpc0IMCgpfc2lnbmFsX2lkIiIKD0F1dG9TeW5jU3RhcnRlZBIPCgdzZXNzaW9uGAEgASgJIiYKE1N0b3BBdXRvU3luY1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCSIiCg9BdXRvU3luY1N0b3BwZWQSDwoHc2Vzc2lvbhgBIAEoCSKqAQoMV2F0Y2hSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSFwoPc3Vic2NyaXB0aW9uX2lkGAIgASgJEikKBGtpbmQYAyABKA4yGy5ub21vcy5ydW50aW1lLnYyLldhdGNoS2luZBIsCgVxdWVyeRgEIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5RdWVyeVJlcXVlc3QSFwoPaW50ZXJ2YWxfbWlsbGlzGAUgASgNIicKDFdhdGNoU3RhcnRlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkiKQoOVW53YXRjaFJlcXVlc3QSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJIicKDFdhdGNoU3RvcHBlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkidQoUUHJlcGFyZURvbWFpblJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZkb21haW4YAiABKAkSFgoOcGFja2FnZV9zaGEyNTYYAyABKAkSFgoJZGlyZWN0aXZlGAQgASgJSACIAQFCDAoKX2RpcmVjdGl2ZSJSCg5Eb21haW5QcmVwYXJlZBIOCgZkb21haW4YASABKAkSFgoOcGFja2FnZV9zaGEyNTYYAiABKAkSGAoQYWxyZWFkeV9yZXNpZGVudBgDIAEoCCL2AQoVTW9kZWxMaWZlY3ljbGVSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSPQoFc3RhZ2UYCiABKAsyLC5ub21vcy5ydW50aW1lLnYyLlN0YWdlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0SAASPQoFYWRvcHQYCyABKAsyLC5ub21vcy5ydW50aW1lLnYyLkFkb3B0R2VuZXJhdGVkTW9kZWxSZXF1ZXN0SAASQQoHcmVzdG9yZRgMIAEoCzIuLm5vbW9zLnJ1bnRpbWUudjIuUmVzdG9yZUdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAQgsKCW9wZXJhdGlvbiKGAQoaU3RhZ2VHZW5lcmF0ZWRNb2RlbFJlcXVlc3QSDgoGZG9tYWluGAEgASgJEhYKDmNhbmRpZGF0ZV9oYXNoGAIgASgJEhAKCGxhd191c2R6GAMgASgMEhsKDnNvdXJjZV9zZXNzaW9uGAQgASgJSACIAQFCEQoPX3NvdXJjZV9zZXNzaW9uInoKGkFkb3B0R2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIWCg5jYW5kaWRhdGVfaGFzaBgCIAEoCRIeChFhY2NlcHRhbmNlX3JlYXNvbhgDIAEoCUgAiAEBQhQKEl9hY2NlcHRhbmNlX3JlYXNvbiJ6ChxSZXN0b3JlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIUCgxjdXJyZW50X2hhc2gYAiABKAkSHgoRYWNjZXB0YW5jZV9yZWFzb24YAyABKAlIAIgBAUIUChJfYWNjZXB0YW5jZV9yZWFzb24ikwEKD01vZGVsRGlmZmVyZW5jZRIzCgRraW5kGAEgASgOMiUubm9tb3MucnVudGltZS52Mi5Nb2RlbERpZmZlcmVuY2VLaW5kEhEKBGFyZWEYAiABKAlIAIgBARITCgZhY3Rpb24YAyABKAlIAYgBARIPCgdzdW1tYXJ5GAQgASgJQgcKBV9hcmVhQgkKB19hY3Rpb24ipQEKC01vZGVsUmV2aWV3EhcKD2NoZWNrZWRfYWN0aW9ucxgBIAEoBBIZChFjYW5kaWRhdGVfYWN0aW9ucxgCIAEoBBIZCgxzYW1lX291dGNvbWUYAyABKAhIAIgBARI2CgtkaWZmZXJlbmNlcxgEIAMoCzIhLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxEaWZmZXJlbmNlQg8KDV9zYW1lX291dGNvbWUihQIKFk1vZGVsTGlmZWN5Y2xlUmVzcG9uc2USEAoIYWNjZXB0ZWQYASABKAgSNAoFc3RhZ2UYAiABKA4yJS5ub21vcy5ydW50aW1lLnYyLk1vZGVsTGlmZWN5Y2xlU3RhZ2USFAoHbWVzc2FnZRgDIAEoCUgAiAEBEhEKBGhlYWQYBCABKAlIAYgBARIXCgpyZWNlaXB0X2lkGAUgASgJSAKIAQESMgoGcmV2aWV3GAYgASgLMh0ubm9tb3MucnVudGltZS52Mi5Nb2RlbFJldmlld0gDiAEBQgoKCF9tZXNzYWdlQgcKBV9oZWFkQg0KC19yZWNlaXB0X2lkQgkKB19yZXZpZXciZwoaUmVzb2x2ZUN1c3RvZHlCcmVha1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRI4CghkZWNpc2lvbhgCIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrRGVjaXNpb24iYQoUQ3VzdG9keUJyZWFrUmVzb2x2ZWQSDwoHc2Vzc2lvbhgBIAEoCRI4CghkZWNpc2lvbhgCIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrRGVjaXNpb24iEwoRQ2xvc2VSZWFsbVJlcXVlc3QiDQoLUmVhbG1DbG9zZWQi5QEKEURlYWRMZXR0ZXJSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSOAoEbGlzdBgKIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuTGlzdERlYWRMZXR0ZXJzUmVxdWVzdEgAEjkKBXJldHJ5GAsgASgLMigubm9tb3MucnVudGltZS52Mi5SZXRyeURlYWRMZXR0ZXJSZXF1ZXN0SAASPQoHZGlzY2FyZBgMIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuRGlzY2FyZERlYWRMZXR0ZXJSZXF1ZXN0SABCCwoJb3BlcmF0aW9uIhgKFkxpc3REZWFkTGV0dGVyc1JlcXVlc3QiKwoWUmV0cnlEZWFkTGV0dGVyUmVxdWVzdBIRCglpbnRlbnRfaWQYASABKAkiLQoYRGlzY2FyZERlYWRMZXR0ZXJSZXF1ZXN0EhEKCWludGVudF9pZBgBIAEoCSK9AQoSRGVhZExldHRlclJlc3BvbnNlEjAKBGxpc3QYCiABKAsyIC5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJMaXN0SAASMgoFcmV0cnkYCyABKAsyIS5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJSZXRyeUgAEjYKB2Rpc2NhcmQYDCABKAsyIy5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJEaXNjYXJkSABCCQoHb3V0Y29tZSJECg5EZWFkTGV0dGVyTGlzdBIyCgdlbnRyaWVzGAEgAygLMiEubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyRW50cnkiuQEKD0RlYWRMZXR0ZXJFbnRyeRIPCgJpZBgBIAEoCUgAiAEBEhIKCmNvbW1pdF9vaWQYAiABKAkSDgoGc291cmNlGAMgASgJEg8KB21lc3NhZ2UYBCABKAkSEwoGZG9tYWluGAUgASgJSAGIAQESFgoJZGlyZWN0aXZlGAYgASgJSAKIAQESEwoLcmVjb3JkZWRfYXQYByABKAlCBQoDX2lkQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSJ5Cg9EZWFkTGV0dGVyUmV0cnkSDwoHcmV0cmllZBgBIAEoCBIRCgRoZWFkGAIgASgJSACIAQESFwoPYWxyZWFkeV9vbl9tYWluGAMgASgIEhQKB21lc3NhZ2UYBCABKAlIAYgBAUIHCgVfaGVhZEIKCghfbWVzc2FnZSIkChFEZWFkTGV0dGVyRGlzY2FyZBIPCgdyZW1vdmVkGAEgASgEIs0FCgxSdW50aW1lRXZlbnQSEAoIc2VxdWVuY2UYASABKAQSFAoHc2Vzc2lvbhgCIAEoCUgBiAEBEi8KBXJlYWR5GAogASgLMh4ubm9tb3MucnVudGltZS52Mi5SdW50aW1lUmVhZHlIABI3Cg13YXRjaF9jaGFuZ2VkGAsgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaENoYW5nZWRIABI5Cg5zeW5jX2NvbXBsZXRlZBgMIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuU3luY0NvbXBsZXRlZEgAEjUKDGxpbmtfY2hhbmdlZBgNIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuTGlua0NoYW5nZWRIABI5Cg5zaWduYWxfY2hhbmdlZBgOIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuU2lnbmFsQ2hhbmdlZEgAEjsKD2N1c3RvZHlfY2hhbmdlZBgPIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUNoYW5nZWRIABJCChNsb2NhbF93b3JrX3JlamVjdGVkGBAgASgLMiMubm9tb3MucnVudGltZS52Mi5Mb2NhbFdvcmtSZWplY3RlZEgAEjMKC2xhd19jaGFuZ2VkGBEgASgLMhwubm9tb3MucnVudGltZS52Mi5MYXdDaGFuZ2VkSAASQwoPa2VybmVsX3Byb2dyZXNzGBIgASgLMigubm9tb3MucnVudGltZS52Mi5LZXJuZWxQcm9ncmVzc09ic2VydmVkSAASLQoEc3BhbhgTIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVNwYW5IABI/ChF0cmFuc2Zlcl9wcm9ncmVzcxgUIAEoCzIiLm5vbW9zLnJ1bnRpbWUudjIuVHJhbnNmZXJQcm9ncmVzc0gAQgcKBWV2ZW50QgoKCF9zZXNzaW9uIj4KDFJ1bnRpbWVSZWFkeRIXCg9ydW50aW1lX3ZlcnNpb24YASABKAkSFQoNa2VybmVsX3NoYTI1NhgCIAEoDCKAAQoMV2F0Y2hDaGFuZ2VkEhcKD3N1YnNjcmlwdGlvbl9pZBgBIAEoCRITCgtyZXN1bHRfdXNkYRgCIAEoDBI2CgdmYWlsdXJlGAMgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAiAEBQgoKCF9mYWlsdXJlIpwBCg1TeW5jQ29tcGxldGVkEg4KBnJlYXNvbhgBIAEoCRI3CgZyZXN1bHQYAiABKAsyJy5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXNwb25zZRI2CgdmYWlsdXJlGAMgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAiAEBQgoKCF9mYWlsdXJlIjsKC0xpbmtDaGFuZ2VkEiwKBnN0YXR1cxgBIAEoDjIcLm5vbW9zLnJ1bnRpbWUudjIuTGlua1N0YXR1cyI4Cg1TaWduYWxDaGFuZ2VkEg4KBmRvbWFpbhgBIAEoCRIXCg9wcm9qZWN0aW9uX3VzZGEYAiABKAwi9AEKDkN1c3RvZHlDaGFuZ2VkEjEKBGtpbmQYASABKA4yIy5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlDaGFuZ2VLaW5kEjUKDWN1c3RvZHlfYnJlYWsYAiABKAsyHi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVhaxIWCglvcGVyYXRpb24YAyABKAlIAIgBARIVCghyZWNsb25lZBgEIAEoCEgBiAEBEhsKDnBhcmtlZF9pbnRlbnRzGAUgASgESAKIAQFCDAoKX29wZXJhdGlvbkILCglfcmVjbG9uZWRCEQoPX3BhcmtlZF9pbnRlbnRzIuEBChFMb2NhbFdvcmtSZWplY3RlZBIRCgl3b3Jrc3BhY2UYASABKAkSNgoHcmVmdXNlZBgCIAMoCzIlLm5vbW9zLnJ1bnRpbWUudjIuUmVqZWN0ZWRMb2NhbEludGVudBIOCgZwYXJrZWQYAyABKAgSFQoIcmVzZXRfdG8YBCABKAlIAIgBARIRCglyZXRyeWFibGUYBSABKAgSOgoGc291cmNlGAYgASgOMioubm9tb3MucnVudGltZS52Mi5Mb2NhbFdvcmtSZWplY3Rpb25Tb3VyY2VCCwoJX3Jlc2V0X3RvImMKE0N1c3RvZHlTdXBlcnNlc3Npb24SGgoNc3VwZXJzZWRlZF9hdBgBIAEoCUgAiAEBEhMKBnJlYXNvbhgCIAEoCUgBiAEBQhAKDl9zdXBlcnNlZGVkX2F0QgkKB19yZWFzb24iuAIKDEN1c3RvZHlCcmVhaxIwCgRraW5kGAEgASgOMiIubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QnJlYWtLaW5kEhUKDWxvY2FsX2dlbmVzaXMYAiABKAkSFgoOcmVtb3RlX2dlbmVzaXMYAyABKAkSGgoScmVtb3RlX2luY2FybmF0aW9uGAQgASgJEkAKDHN1cGVyc2Vzc2lvbhgFIAEoCzIlLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keVN1cGVyc2Vzc2lvbkgAiAEBEhoKEmxvY2FsX29ubHlfaW50ZW50cxgGIAEoBBIiChVsYXN0X3N5bmNlZF9hdF9taWxsaXMYByABKARIAYgBAUIPCg1fc3VwZXJzZXNzaW9uQhgKFl9sYXN0X3N5bmNlZF9hdF9taWxsaXMizQEKE1JlamVjdGVkTG9jYWxJbnRlbnQSFgoJaW50ZW50X2lkGAEgASgJSACIAQESFwoKY29tbWl0X29pZBgCIAEoCUgBiAEBEhMKBmRvbWFpbhgDIAEoCUgCiAEBEhYKCWRpcmVjdGl2ZRgEIAEoCUgDiAEBEg8KB21lc3NhZ2UYBSABKAkSEQoJcmV0cnlhYmxlGAYgASgIQgwKCl9pbnRlbnRfaWRCDQoLX2NvbW1pdF9vaWRCCQoHX2RvbWFpbkIMCgpfZGlyZWN0aXZlIlAKCkxhd0NoYW5nZWQSDgoGZG9tYWluGAEgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAIgASgJEhoKEmNvbXBhdGliaWxpdHlfdXNkYRgDIAEoDCLdAQoLUnVudGltZVNwYW4SEAoIdHJhY2VfaWQYASABKAwSDwoHc3Bhbl9pZBgCIAEoDBIbCg5wYXJlbnRfc3Bhbl9pZBgDIAEoDEgAiAEBEgwKBG5hbWUYBCABKAkSGgoSc3RhcnRlZF91bml4X25hbm9zGAUgASgEEhYKDmR1cmF0aW9uX25hbm9zGAYgASgEEjkKCmF0dHJpYnV0ZXMYByADKAsyJS5ub21vcy5ydW50aW1lLnYyLkRpYWdub3N0aWNBdHRyaWJ1dGVCEQoPX3BhcmVudF9zcGFuX2lkIuoBChZLZXJuZWxQcm9ncmVzc09ic2VydmVkEjkKCHNuYXBzaG90GAEgASgLMicubm9tb3Mua2VybmVsLnYxLktlcm5lbFByb2dyZXNzU25hcHNob3QSJAocaG9zdF9vYnNlcnZlZF9lbGFwc2VkX21pY3JvcxgCIAEoBBIqCiJob3N0X29ic2VydmVkX3BoYXNlX2VsYXBzZWRfbWljcm9zGAMgASgEEh4KFnByb2Nlc3NfcmVzaWRlbnRfYnl0ZXMYBCABKAQSIwobcHJvY2Vzc19wZWFrX3Jlc2lkZW50X2J5dGVzGAUgASgEIoIBChBUcmFuc2ZlclByb2dyZXNzEhYKDnJlY2VpdmVkX2J5dGVzGAEgASgEEhgKC3RvdGFsX2J5dGVzGAIgASgESACIAQESLAoEa2luZBgDIAEoDjIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhbnNmZXJLaW5kQg4KDF90b3RhbF9ieXRlcyqZAQoSQ3VzdG9keUJyZWFrUG9saWN5EiQKIENVU1RPRFlfQlJFQUtfUE9MSUNZX1VOU1BFQ0lGSUVEEAASHAoYQ1VTVE9EWV9CUkVBS19QT0xJQ1lfQVNLEAESHgoaQ1VTVE9EWV9CUkVBS19QT0xJQ1lfQURPUFQQAhIfChtDVVNUT0RZX0JSRUFLX1BPTElDWV9SRUpFQ1QQAyqgAQoSV29ya3NwYWNlUmVzaWRlbmN5EiMKH1dPUktTUEFDRV9SRVNJREVOQ1lfVU5TUEVDSUZJRUQQABIfChtXT1JLU1BBQ0VfUkVTSURFTkNZX01PVU5URUQQARIeChpXT1JLU1BBQ0VfUkVTSURFTkNZX1BBUktFRBACEiQKIFdPUktTUEFDRV9SRVNJREVOQ1lfQ1VTVE9EWV9PTkxZEAMqjQEKFFdvcmtzcGFjZVN5bmNQb3N0dXJlEiYKIldPUktTUEFDRV9TWU5DX1BPU1RVUkVfVU5TUEVDSUZJRUQQABIlCiFXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX0xPQ0FMX09OTFkQARImCiJXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX0NMT1VEX0JPVU5EEAIqqAEKCVdhdGNoS2luZBIaChZXQVRDSF9LSU5EX1VOU1BFQ0lGSUVEEAASFAoQV0FUQ0hfS0lORF9RVUVSWRABEhQKEFdBVENIX0tJTkRfQllfSUQQAhIWChJXQVRDSF9LSU5EX1NQQVRJQUwQAxIXChNXQVRDSF9LSU5EX0FDVElWSVRZEAQiBAgFEAUqHFdBVENIX0tJTkRfUEVORElOR19DT05GTElDVFMqpAMKE01vZGVsTGlmZWN5Y2xlU3RhZ2USJQohTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1VOU1BFQ0lGSUVEEAASKwonTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0lERU5USVRZX1JFUVVJUkVEEAESKgomTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1NUQUdJTkdfUkVRVUlSRUQQAhIjCh9NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUFJFRkxJR0hUEAMSLQopTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FDQ0VQVEFOQ0VfUkVRVUlSRUQQBBIjCh9NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfQURNSVNTSU9OEAUSIQodTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BFTkRJTkcQBhIiCh5NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUFJPTU9URUQQBxIiCh5NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUkVTVE9SRUQQCBIpCiVNT0RFTF9MSUZFQ1lDTEVfU1RBR0VfQUxSRUFEWV9DVVJSRU5UEAkqpAEKE01vZGVsRGlmZmVyZW5jZUtpbmQSJQohTU9ERUxfRElGRkVSRU5DRV9LSU5EX1VOU1BFQ0lGSUVEEAASHwobTU9ERUxfRElGRkVSRU5DRV9LSU5EX1JVTEVTEAESIQodTU9ERUxfRElGRkVSRU5DRV9LSU5EX09VVENPTUUQAhIiCh5NT0RFTF9ESUZGRVJFTkNFX0tJTkRfRVZJREVOQ0UQAyqDAQoUQ3VzdG9keUJyZWFrRGVjaXNpb24SJgoiQ1VTVE9EWV9CUkVBS19ERUNJU0lPTl9VTlNQRUNJRklFRBAAEiAKHENVU1RPRFlfQlJFQUtfREVDSVNJT05fQURPUFQQARIhCh1DVVNUT0RZX0JSRUFLX0RFQ0lTSU9OX1JFSkVDVBACKlcKCkxpbmtTdGF0dXMSGwoXTElOS19TVEFUVVNfVU5TUEVDSUZJRUQQABIUChBMSU5LX1NUQVRVU19PUEVOEAESFgoSTElOS19TVEFUVVNfQ0xPU0VEEAIq4gEKEUN1c3RvZHlDaGFuZ2VLaW5kEiMKH0NVU1RPRFlfQ0hBTkdFX0tJTkRfVU5TUEVDSUZJRUQQABIgChxDVVNUT0RZX0NIQU5HRV9LSU5EX0RFVEVDVEVEEAESIAocQ1VTVE9EWV9DSEFOR0VfS0lORF9SRUpFQ1RFRBACEiAKHENVU1RPRFlfQ0hBTkdFX0tJTkRfQURPUFRJTkcQAxIlCiFDVVNUT0RZX0NIQU5HRV9LSU5EX0FET1BUX1JFRlVTRUQQBBIbChdDVVNUT0RZX0NIQU5HRV9LSU5EX0FTSxAFKnoKEEN1c3RvZHlCcmVha0tpbmQSIgoeQ1VTVE9EWV9CUkVBS19LSU5EX1VOU1BFQ0lGSUVEEAASIQodQ1VTVE9EWV9CUkVBS19LSU5EX1NVUEVSU0VERUQQARIfChtDVVNUT0RZX0JSRUFLX0tJTkRfRElWRVJHRUQQAiqYAQoYTG9jYWxXb3JrUmVqZWN0aW9uU291cmNlEisKJ0xPQ0FMX1dPUktfUkVKRUNUSU9OX1NPVVJDRV9VTlNQRUNJRklFRBAAEikKJUxPQ0FMX1dPUktfUkVKRUNUSU9OX1NPVVJDRV9BRE1JU1NJT04QARIkCiBMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfU1lOQxACKnYKDFRyYW5zZmVyS2luZBIdChlUUkFOU0ZFUl9LSU5EX1VOU1BFQ0lGSUVEEAASFwoTVFJBTlNGRVJfS0lORF9ERUxUQRABEhYKElRSQU5TRkVSX0tJTkRfRlVMTBACEhYKElRSQU5TRkVSX0tJTkRfUFVTSBADMmQKE05vbW9zUnVudGltZVNlcnZpY2USTQoGSW52b2tlEiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lUmVxdWVzdBohLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlc3BvbnNlYgZwcm90bzM", [file_nomos_kernel_v1_kernel, file_nomos_kernel_v1_progress]);
7721
+ var CustodyOfferBatchRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_runtime_v2_runtime, 14);
7722
+ var CustodyIntentOfferSchema = /* @__PURE__ */ messageDesc(file_nomos_runtime_v2_runtime, 15);
7723
+ var CustodyInlineOffersSchema = /* @__PURE__ */ messageDesc(file_nomos_runtime_v2_runtime, 16);
7724
+ var CustodySessionCandidateSchema = /* @__PURE__ */ messageDesc(file_nomos_runtime_v2_runtime, 17);
7725
+ var CustodyOfferBatchResponseSchema = /* @__PURE__ */ messageDesc(file_nomos_runtime_v2_runtime, 18);
7714
7726
 
7715
7727
  // ../cloud/web-client/src/custody_sync.ts
7716
7728
  function presentCanonicalCustodyConvergence(convergence, context) {
@@ -7757,7 +7769,7 @@ function presentCanonicalCustodyConvergence(convergence, context) {
7757
7769
  endpoint: `/v2/workspaces/${context.workspace}`,
7758
7770
  status: 0,
7759
7771
  refused: false,
7760
- error: String(convergence.error instanceof Error ? convergence.error.message : convergence.error).slice(0, 300)
7772
+ error: String(convergence.error instanceof Error ? convergence.error.message : convergence.error).slice(0, 1200)
7761
7773
  };
7762
7774
  return {
7763
7775
  result: {
@@ -7835,7 +7847,10 @@ async function convergeCanonicalCustody(options) {
7835
7847
  return { kind: "custodyBreak", custodyBreak: converged.custodyBreak };
7836
7848
  }
7837
7849
  pulled = converged.upToDate !== true;
7838
- } catch {
7850
+ } catch (error) {
7851
+ console.error(
7852
+ `[nomos-sync-convergence] remote=${remoteHead} base=${syncedBase ?? "none"}: ` + (error instanceof Error ? error.message : String(error))
7853
+ );
7839
7854
  diverged = true;
7840
7855
  }
7841
7856
  }
@@ -8283,6 +8298,16 @@ function prepareManagedPromotion(report, candidateHash, domain, opts = {}) {
8283
8298
  error: `the package-wide report does not cover the generated business area '${domain}'`
8284
8299
  };
8285
8300
  }
8301
+ const dispositions = report.dispositions;
8302
+ const changesStableIdentity = dispositions !== void 0 && (dispositions.retired.length > 0 || Object.keys(dispositions.retyped).length > 0 || Object.keys(dispositions.rebinds).length > 0);
8303
+ if (changesStableIdentity && !acceptanceReason) {
8304
+ return {
8305
+ ok: false,
8306
+ stage: "acceptance",
8307
+ report,
8308
+ error: "the current-frontier transition changes stable business identities and needs an attributed acceptance reason"
8309
+ };
8310
+ }
8286
8311
  const preflight = {
8287
8312
  candidateHash,
8288
8313
  // A package may be reached through any one of its generated domain clients. The
@@ -13123,7 +13148,7 @@ function jwtClaimOf(token, claim) {
13123
13148
  }
13124
13149
  }
13125
13150
  function createGovernanceOffers(ctx) {
13126
- const { offerDirective, offerCall, offerModelLifecycle, serialize, queryById, queryRows, attestationSignKernel, _fetch, base, workspace, deviceSecret, authHeaders, receivingGroupNameOf: receivingGroupNameOf2, sha256hexBytes: sha256hexBytes2, bytesUnb64: bytesUnb642, birthCertificateLawPayload, actorForShareQuote: actorForShareQuote2, installedInterfaceInner, mintKeylessDelegation: mintKeylessDelegation2, signWorkspaceOffer, resolveFrameworkRoute } = ctx;
13151
+ const { offerDirective, offerCall, offerModelLifecycle, serialize, queryById, queryRows, attestationSignKernel, _fetch, base, workspace, deviceSecret, authHeaders, connectionAuthToken, connectionFrameworkCalls, receivingGroupNameOf: receivingGroupNameOf2, sha256hexBytes: sha256hexBytes2, bytesUnb64: bytesUnb642, birthCertificateLawPayload, actorForShareQuote: actorForShareQuote2, installedInterfaceInner, mintKeylessDelegation: mintKeylessDelegation2, signWorkspaceOffer, resolveFrameworkRoute } = ctx;
13127
13152
  const g = {
13128
13153
  /**
13129
13154
  * AUTHOR a SIGNED governance/framework intent locally and return the sealed offer bytes (base64) ready to
@@ -13228,6 +13253,54 @@ function createGovernanceOffers(ctx) {
13228
13253
  });
13229
13254
  return g.postGovernanceOffer({ directiveId: call.directive, intentBytes: sealed.intentBytes, ws: parent, authToken, domain: call.domain });
13230
13255
  },
13256
+ /**
13257
+ * Offer one exact compiler-generated call to another workspace without
13258
+ * mounting or replaying that target locally. The source holon's kernel
13259
+ * signs only the target-kernel-prepared USDA; the host receives neither a
13260
+ * tenant object nor authority to invent an operation.
13261
+ */
13262
+ offerRemoteGeneratedCall: async ({
13263
+ call,
13264
+ target,
13265
+ actor,
13266
+ authorSecret,
13267
+ authToken
13268
+ }) => {
13269
+ const signingSecret = authorSecret || deviceSecret;
13270
+ if (!target) throw new TypeError("a remote generated offer requires its target workspace");
13271
+ if (!actor) throw new TypeError("a remote generated offer requires its attributable actor");
13272
+ if (!signingSecret) throw new TypeError("a remote generated offer requires an enrolled device key");
13273
+ const sealed = await signWorkspaceOffer({
13274
+ target,
13275
+ call,
13276
+ actor,
13277
+ authorSecret: signingSecret,
13278
+ authToken
13279
+ });
13280
+ const verdict = await g.postGovernanceOffer({
13281
+ directiveId: call.directive,
13282
+ intentBytes: sealed.intentBytes,
13283
+ ws: target,
13284
+ authToken,
13285
+ domain: call.domain
13286
+ });
13287
+ if (!verdict.ok || verdict.body && typeof verdict.body === "object" && (verdict.body.ok === false || verdict.body.refused)) {
13288
+ const detail = typeof verdict.body === "string" ? verdict.body : JSON.stringify(verdict.body ?? "remote offer refused");
13289
+ throw new NomosClientError(
13290
+ `Remote generated call '${call.domain}/${call.directive}' was refused by '${target}': ${detail.slice(0, 500)}`,
13291
+ {
13292
+ code: "nomos.offer.remote_refused",
13293
+ workspace: target,
13294
+ operation: call.directive,
13295
+ recommendedAction: NomosRecommendedAction.retry,
13296
+ info: verdict.errorInfo
13297
+ }
13298
+ );
13299
+ }
13300
+ const body = verdict.body && typeof verdict.body === "object" ? verdict.body : void 0;
13301
+ const head = verdict.head ?? (typeof body?.head === "string" ? body.head : "");
13302
+ return { workspace: target, head };
13303
+ },
13231
13304
  /**
13232
13305
  * Derive the device key's base64 PUBLIC half from its base64 SECRET seed, IN the local wasm (the
13233
13306
  * kernel `attestation_sign` op returns the public half; the secret never leaves this process).
@@ -13414,7 +13487,10 @@ function createGovernanceOffers(ctx) {
13414
13487
  */
13415
13488
  ensureParentSignerEnrollment: async (args = {}) => {
13416
13489
  const { parent, device, domain, grantedAt, authToken, idToken, signIn, verifiedVia, validFromEpoch = 0, frameworkCalls } = args;
13417
- const keyless = !!(idToken || typeof signIn === "function");
13490
+ const effectiveAuthToken = authToken || connectionAuthToken();
13491
+ const effectiveIdToken = idToken || effectiveAuthToken;
13492
+ const effectiveFrameworkCalls = frameworkCalls ?? connectionFrameworkCalls;
13493
+ const keyless = !!(effectiveIdToken || typeof signIn === "function");
13418
13494
  const directiveId = args.directiveId || (keyless ? "enrollFirstDevice" : "enrollSigner");
13419
13495
  const principal = canonicalPrincipal(args.principal);
13420
13496
  let publicKey = device && device.public || args.publicKey;
@@ -13424,13 +13500,13 @@ function createGovernanceOffers(ctx) {
13424
13500
  if (!publicKey && authorSecret) publicKey = await g.devicePublicOf(authorSecret);
13425
13501
  if (!publicKey) throw new Error("ensureParentSignerEnrollment requires the device `publicKey` (pass `device`/`publicKey`, or a secret it can be derived from)");
13426
13502
  const keyHash = await sha256hexBytes2(bytesUnb642(publicKey));
13427
- const posture = await g.parentSignerEnrollment({ parent, principal, keyHash, authToken });
13503
+ const posture = await g.parentSignerEnrollment({ parent, principal, keyHash, authToken: effectiveAuthToken });
13428
13504
  if (posture.enrolled) return { parent, principal, keyHash, enrolled: true, repaired: false, checkedAt: posture.checkedAt };
13429
13505
  if (posture.revoked) {
13430
13506
  throw new Error(`ensureParentSignerEnrollment: key ${keyHash.slice(0, 16)}\u2026 was REVOKED on ${parent} (${signerObjectOf(principal)}#signer is remove-wins) \u2014 mint a new device key and enroll it; a revoked key cannot be lawfully re-enrolled [nomos.authz.signer_revoked]`);
13431
13507
  }
13432
13508
  if (!authorSecret) throw new Error("ensureParentSignerEnrollment: the signer tuple is absent on the parent and no `authorSecret`/`device.secret` was supplied to lawfully re-enroll it");
13433
- const token = keyless ? typeof signIn === "function" ? await signIn(keyHash) : idToken : null;
13509
+ const token = keyless ? typeof signIn === "function" ? await signIn(keyHash) : effectiveIdToken : null;
13434
13510
  let resolved = domain ? { domain, directiveId } : null;
13435
13511
  let enrollmentRoute;
13436
13512
  if (!resolved && parent === workspace && typeof installedInterfaceInner === "function") {
@@ -13455,7 +13531,7 @@ function createGovernanceOffers(ctx) {
13455
13531
  }
13456
13532
  resolved = { domain: enrollmentRoute.domain, directiveId };
13457
13533
  }
13458
- if (!resolved) resolved = await g.discoverDirectiveDomain({ ws: parent, directiveId, authToken });
13534
+ if (!resolved) resolved = await g.discoverDirectiveDomain({ ws: parent, directiveId, authToken: effectiveAuthToken });
13459
13535
  let delegationPayload;
13460
13536
  if (keyless) {
13461
13537
  if (typeof mintKeylessDelegation2 !== "function") throw new Error("ensureParentSignerEnrollment: the keyless lane needs a signing holon (mintKeylessDelegation) to build the delegation cert \u2014 open the holon with a device key");
@@ -13477,12 +13553,29 @@ function createGovernanceOffers(ctx) {
13477
13553
  }
13478
13554
  const issuerClaim = verifiedVia || (token ? jwtClaimOf(token, "iss") : void 0);
13479
13555
  const payload = keyless ? { keyHash, verifiedVia: issuerClaim, validFromEpoch, grantedAt: (/* @__PURE__ */ new Date()).toISOString(), idpToken: token, ...delegationPayload ?? {} } : { keyHash, grantedBy: principal, grantedAt: typeof grantedAt === "number" ? grantedAt : Date.now() };
13480
- if (frameworkCalls === void 0) {
13481
- throw new TypeError("ensureParentSignerEnrollment requires compiler-generated framework calls");
13556
+ if (effectiveFrameworkCalls === void 0) {
13557
+ const message = "The installed client cannot author the typed enrollFirstDevice call required to seat this device";
13558
+ throw new NomosClientError(message, {
13559
+ code: "nomos.application.contract_missing",
13560
+ workspace: parent,
13561
+ operation: "enrollFirstDevice",
13562
+ recommendedAction: NomosRecommendedAction.redeployLaw,
13563
+ info: {
13564
+ code: "nomos.application.contract_missing",
13565
+ message,
13566
+ component: "nomos.application",
13567
+ workspace: parent,
13568
+ operation: "enrollFirstDevice",
13569
+ attributes: {
13570
+ "nomos.application.missing_contract": "generatedFrameworkCalls.identity.enrollFirstDevice",
13571
+ "nomos.recovery.action": "request-parent-authorized-device-recovery"
13572
+ }
13573
+ }
13574
+ });
13482
13575
  }
13483
13576
  const call = keyless ? (() => {
13484
13577
  if (typeof issuerClaim !== "string" || !issuerClaim || !token) throw new Error("verified first-device enrollment needs its typed issuer and identity proof");
13485
- return frameworkCalls.identity.enrollFirstDevice({
13578
+ return effectiveFrameworkCalls.identity.enrollFirstDevice({
13486
13579
  domain: resolved.domain,
13487
13580
  workspace: parent,
13488
13581
  keyHash,
@@ -13492,7 +13585,7 @@ function createGovernanceOffers(ctx) {
13492
13585
  idpToken: token,
13493
13586
  ...delegationPayload ?? {}
13494
13587
  });
13495
- })() : frameworkCalls.identity.enrollSigner({
13588
+ })() : effectiveFrameworkCalls.identity.enrollSigner({
13496
13589
  domain: resolved.domain,
13497
13590
  workspace: parent,
13498
13591
  keyHash,
@@ -13504,7 +13597,7 @@ function createGovernanceOffers(ctx) {
13504
13597
  const res = await offerCall(call, { actor: principal, signWith: authorSecret });
13505
13598
  verdict = { ok: true, status: 200, body: res };
13506
13599
  } else {
13507
- const bearer = authToken || token;
13600
+ const bearer = effectiveAuthToken || token;
13508
13601
  const sealed = await signWorkspaceOffer({
13509
13602
  target: parent,
13510
13603
  call,
@@ -13889,13 +13982,17 @@ function installedLawOfRows(rows) {
13889
13982
  }
13890
13983
  return out;
13891
13984
  }
13892
- function lawStatusOf(installed, clientHash) {
13985
+ function lawStatusOf(installed, clientHash, current) {
13893
13986
  const known = Array.isArray(installed);
13894
13987
  const list = known ? installed : [];
13988
+ const currentSupplied = current !== void 0;
13989
+ const currentKnown = currentSupplied ? Array.isArray(current) : known;
13990
+ const serving = currentSupplied ? Array.isArray(current) ? current : [] : list;
13895
13991
  return {
13896
13992
  installed: list,
13897
13993
  ...clientHash !== void 0 ? { clientHash } : {},
13898
- drifted: !!(clientHash !== void 0 && known && !list.includes(clientHash))
13994
+ ...currentSupplied ? { current } : {},
13995
+ drifted: !!(clientHash !== void 0 && currentKnown && !serving.includes(clientHash))
13899
13996
  };
13900
13997
  }
13901
13998
  function lawDriftMessage({
@@ -14144,6 +14241,25 @@ ${String(commit).toLowerCase()}`;
14144
14241
  }
14145
14242
  };
14146
14243
  };
14244
+ if (!restoreFrom && !mountInPlace && !localOnly && !salvageOnly && !recover) {
14245
+ const _coldSnapshot = span(
14246
+ "receive",
14247
+ "boot: fetch checkpointed custody snapshot",
14248
+ "cfetch"
14249
+ );
14250
+ try {
14251
+ const response = await _fetch(
14252
+ `${base}/v2/workspaces/${workspace}/snapshot`,
14253
+ { headers: authHeaders }
14254
+ );
14255
+ if (response.ok && response.headers.get("x-nomos-layout") === "local-custody-v3") {
14256
+ restoreFrom = new Uint8Array(await response.arrayBuffer());
14257
+ }
14258
+ } catch {
14259
+ } finally {
14260
+ _coldSnapshot.end({ restored: !!restoreFrom });
14261
+ }
14262
+ }
14147
14263
  const repoArg = `/work/ws/${workspace}`;
14148
14264
  const provider = kernelProvider || createWasmKernelProvider({ span });
14149
14265
  const readRemoteInfo = async () => ({
@@ -14413,10 +14529,12 @@ ${String(commit).toLowerCase()}`;
14413
14529
  const watchStops = /* @__PURE__ */ new Set();
14414
14530
  let installedLawRowsCache;
14415
14531
  let installedLawCurrentCache;
14532
+ let installedLawCurrentError = "";
14416
14533
  let installedInterfaceCache;
14417
14534
  const invalidateInstalledLawMetadata = () => {
14418
14535
  installedLawRowsCache = void 0;
14419
14536
  installedLawCurrentCache = void 0;
14537
+ installedLawCurrentError = "";
14420
14538
  installedInterfaceCache = void 0;
14421
14539
  };
14422
14540
  let _disposed = false;
@@ -14463,17 +14581,19 @@ ${String(commit).toLowerCase()}`;
14463
14581
  scheduleMaintenanceSoon();
14464
14582
  };
14465
14583
  const prepareDomainReady = async (domain, packageHash, directiveId) => {
14466
- requestDomainMaintenance(domain, packageHash, directiveId);
14584
+ const currentPackage = currentLawInner()?.[domain];
14585
+ const servingPackage = typeof currentPackage === "string" && currentPackage.length > 0 ? currentPackage : packageHash;
14586
+ requestDomainMaintenance(domain, servingPackage, directiveId);
14467
14587
  const readiness = await prepareDomainUntilReady({
14468
14588
  domain,
14469
- packageHash,
14589
+ packageHash: servingPackage,
14470
14590
  directiveId,
14471
14591
  warm: () => serialize(
14472
14592
  async () => namedQueryTyped(QueryOperation.WARM, {
14473
14593
  interactiveOnly: true,
14474
14594
  requestedDomain: domain,
14475
14595
  ...directiveId ? { requestedDirective: directiveId } : {},
14476
- requestedPackage: packageHash
14596
+ requestedPackage: servingPackage
14477
14597
  }),
14478
14598
  "prepare generated domain",
14479
14599
  false
@@ -14486,7 +14606,7 @@ ${String(commit).toLowerCase()}`;
14486
14606
  });
14487
14607
  if (readiness.prepared) {
14488
14608
  const index = _maintenanceTargets.findIndex(
14489
- (target) => target.domain === domain && target.packageHash === packageHash && target.directiveId === directiveId
14609
+ (target) => target.domain === domain && target.packageHash === servingPackage && target.directiveId === directiveId
14490
14610
  );
14491
14611
  if (index >= 0) _maintenanceTargets.splice(index, 1);
14492
14612
  }
@@ -15161,7 +15281,9 @@ ${String(commit).toLowerCase()}`;
15161
15281
  const answer = namedQueryTyped(QueryOperation.INSTALLED_LAW);
15162
15282
  if (Array.isArray(answer?.domains)) {
15163
15283
  const currentLaw = answer?.currentLaw;
15164
- installedLawCurrentCache = currentLaw && typeof currentLaw === "object" && !Array.isArray(currentLaw) ? currentLaw : null;
15284
+ if (currentLaw && typeof currentLaw === "object" && !Array.isArray(currentLaw)) {
15285
+ installedLawCurrentCache = currentLaw;
15286
+ }
15165
15287
  installedLawRowsCache = answer.domains.map(
15166
15288
  (domain) => ({
15167
15289
  id: domain.installationId,
@@ -15205,21 +15327,36 @@ ${String(commit).toLowerCase()}`;
15205
15327
  return installedLawRowsCache;
15206
15328
  };
15207
15329
  const currentLawInner = () => {
15208
- installRowsInner();
15209
15330
  if (installedLawCurrentCache !== void 0) return installedLawCurrentCache;
15210
15331
  try {
15211
15332
  const answer = namedQueryTyped(QueryOperation.CURRENT_LAW);
15212
15333
  const current = answer?.keyMap ?? answer?.currentLaw ?? answer;
15213
- installedLawCurrentCache = current && typeof current === "object" && !Array.isArray(current) ? current : null;
15214
- } catch {
15215
- installedLawCurrentCache = null;
15334
+ if (current && typeof current === "object" && !Array.isArray(current)) {
15335
+ installedLawCurrentError = "";
15336
+ installedLawCurrentCache = current;
15337
+ return installedLawCurrentCache;
15338
+ }
15339
+ installedLawCurrentError = "kernel current-law read returned no typed domain map";
15340
+ } catch (error) {
15341
+ installedLawCurrentError = String(
15342
+ error?.message || error || "kernel current-law read failed"
15343
+ );
15216
15344
  }
15217
- return installedLawCurrentCache;
15345
+ return null;
15218
15346
  };
15219
15347
  const installedLawInner = () => {
15220
15348
  const rows = installRowsInner();
15221
15349
  return rows === null ? null : installedLawOfRows(rows);
15222
15350
  };
15351
+ const currentLawHashesInner = () => {
15352
+ const current = currentLawInner();
15353
+ if (current === null) return null;
15354
+ return [...new Set(
15355
+ Object.values(current).filter(
15356
+ (identity) => typeof identity === "string" && identity.length > 0
15357
+ )
15358
+ )];
15359
+ };
15223
15360
  const recomputeCompat = ({ silent = false } = {}) => {
15224
15361
  if (!compatState) return null;
15225
15362
  const installRows = installRowsInner();
@@ -15373,16 +15510,28 @@ ${String(commit).toLowerCase()}`;
15373
15510
  );
15374
15511
  }
15375
15512
  let pack = null;
15513
+ const packErrors = [];
15376
15514
  for (const base2 of bases) {
15377
15515
  try {
15378
15516
  pack = provider.packDelta(base2, head);
15379
- } catch {
15517
+ } catch (error) {
15518
+ packErrors.push(`${base2 ?? "<full>"}: ${String(error)}`);
15380
15519
  pack = null;
15381
15520
  }
15382
15521
  if (pack) break;
15383
15522
  }
15384
- if (!pack)
15385
- throw new Error("the kernel could not build the candidate custody pack");
15523
+ if (!pack) {
15524
+ const missingOid = packErrors.join(" ").match(/(?:object with id|find commit) ([0-9a-f]{40})/i)?.[1];
15525
+ const objectBytes = (oid) => ["nomos.git/objects", "objects", ".git/objects"].map((root) => {
15526
+ const bytes = provider.readWsFile(
15527
+ `${root}/${oid.slice(0, 2)}/${oid.slice(2)}`
15528
+ );
15529
+ return `${root}=${bytes?.byteLength ?? 0}B`;
15530
+ }).join(",");
15531
+ throw new Error(
15532
+ `the kernel could not build the candidate custody pack${packErrors.length === 0 ? "" : ` (${packErrors[0]})`}; head[${objectBytes(head)}]${missingOid ? `; missing[${objectBytes(missingOid)}]` : ""}`
15533
+ );
15534
+ }
15386
15535
  await pushPack(
15387
15536
  remote,
15388
15537
  authHeaders,
@@ -16530,6 +16679,10 @@ ${String(commit).toLowerCase()}`;
16530
16679
  error: "the generated model identity is missing"
16531
16680
  };
16532
16681
  }
16682
+ const currentHash = String(currentLawInner()?.[domain] ?? "");
16683
+ if (currentHash === candidateHash) {
16684
+ return { ok: true, stage: "already-current" };
16685
+ }
16533
16686
  const candidateInstallation = (installRowsInner() ?? []).find(
16534
16687
  (row) => row?.id === `domain-installation:${candidateHash}`
16535
16688
  );
@@ -16543,23 +16696,8 @@ ${String(commit).toLowerCase()}`;
16543
16696
  error: candidatePhase.length === 0 ? `model '${candidateHash}' is not staged in this workspace; deploy the generated USDA package before opening this application` : `model '${candidateHash}' is '${candidatePhase}', so it cannot become current`
16544
16697
  };
16545
16698
  }
16546
- const currentHash = String(currentLawInner()?.[domain] ?? "");
16547
16699
  if (candidatePhase === "Active") {
16548
- try {
16549
- const readiness = await prepareDomainReady(domain, candidateHash);
16550
- if (readiness.prepared !== true) {
16551
- throw new Error(
16552
- `the admitted model '${candidateHash}' authenticated '${domain}' USDA slice did not become ready (${readiness.reason} after ${readiness.quanta} maintenance quanta)`
16553
- );
16554
- }
16555
- return { ok: true, stage: "already-current" };
16556
- } catch (error) {
16557
- return {
16558
- ok: false,
16559
- stage: "preflight",
16560
- error: String(error?.message || error)
16561
- };
16562
- }
16700
+ return { ok: true, stage: "already-current" };
16563
16701
  }
16564
16702
  let report;
16565
16703
  let transition;
@@ -16698,12 +16836,13 @@ ${String(commit).toLowerCase()}`;
16698
16836
  );
16699
16837
  const data = row?.data;
16700
16838
  const domainKeys = Array.isArray(data?.["spec.domainKeys"]) ? data["spec.domainKeys"].map(String) : [];
16701
- if (!data || !domainKeys.includes(domain)) return null;
16839
+ const exactSingleDomain = String(data?.["spec.domainHash"] ?? "") === candidateHash && String(currentLawInner()?.[domain] ?? "") === candidateHash && domainKeys.length === 0;
16840
+ if (!data || !domainKeys.includes(domain) && !exactSingleDomain) return null;
16702
16841
  return {
16703
16842
  hash: candidateHash,
16704
16843
  phase: String(data["status.phase"] ?? ""),
16705
16844
  dependencies: Array.isArray(data["spec.dependencies"]) ? data["spec.dependencies"].map(String) : [],
16706
- domainKeys
16845
+ domainKeys: exactSingleDomain ? [domain] : domainKeys
16707
16846
  };
16708
16847
  };
16709
16848
  const _nomosStageGeneratedModel = async (domain, candidateHash, lawUsdz, dependencies) => {
@@ -16727,14 +16866,10 @@ ${String(commit).toLowerCase()}`;
16727
16866
  `generated model '${candidateHash}' has no USDZ transport asset`
16728
16867
  );
16729
16868
  }
16730
- const predecessor = rows.find((entry) => {
16731
- const data = entry?.data;
16732
- return String(data?.["status.phase"] ?? "") === "Active" && Array.isArray(data?.["spec.domainKeys"]) && data["spec.domainKeys"].map(String).includes(domain);
16733
- });
16734
- const priorHash = String(predecessor?.data?.["spec.domainHash"] ?? "");
16869
+ const priorHash = String(currentLawInner()?.[domain] ?? "");
16735
16870
  if (!priorHash) {
16736
16871
  throw new Error(
16737
- `generated application cannot identify the active '${domain}' model it would supersede`
16872
+ `generated application cannot identify the active '${domain}' model it would supersede` + (installedLawCurrentError ? `: ${installedLawCurrentError}` : "")
16738
16873
  );
16739
16874
  }
16740
16875
  const head = await offerDirective(
@@ -18425,6 +18560,8 @@ ${String(commit).toLowerCase()}`;
18425
18560
  workspace,
18426
18561
  deviceSecret,
18427
18562
  authHeaders,
18563
+ connectionAuthToken: () => activeAuthToken,
18564
+ connectionFrameworkCalls: frameworkCalls,
18428
18565
  receivingGroupNameOf,
18429
18566
  sha256hexBytes,
18430
18567
  bytesUnb64,
@@ -19828,6 +19965,7 @@ ${String(commit).toLowerCase()}`;
19828
19965
  "application-open"
19829
19966
  );
19830
19967
  let requiredParentCustodyHead;
19968
+ let requiredDelegationKeyHash;
19831
19969
  try {
19832
19970
  if (spec.idToken || typeof spec.signIn === "function") {
19833
19971
  const enrollment = await api.enrollFirstDevice({
@@ -19844,6 +19982,7 @@ ${String(commit).toLowerCase()}`;
19844
19982
  enrollFirstDeviceCall: spec.enrollFirstDeviceCall
19845
19983
  });
19846
19984
  requiredParentCustodyHead = enrollment.verdict?.head;
19985
+ requiredDelegationKeyHash = enrollment.keyHash;
19847
19986
  if (!requiredParentCustodyHead || !OID40_RE.test(requiredParentCustodyHead)) {
19848
19987
  throw new Error(
19849
19988
  `enrollFirstDevice at '${parent}' admitted without an exact custody head; refusing to prepare birth against an unbound resident frontier`
@@ -19894,9 +20033,16 @@ ${String(commit).toLowerCase()}`;
19894
20033
  }
19895
20034
  );
19896
20035
  if (dq.ok) {
19897
- const rows = await dq.json().catch(() => null);
19898
- const has = Array.isArray(rows) ? rows.length > 0 : rows && Array.isArray(rows.rows) ? rows.rows.length > 0 : false;
19899
- if (has) {
20036
+ const response = await dq.json().catch(() => null);
20037
+ const rows = Array.isArray(response) ? response : response && Array.isArray(response.rows) ? response.rows : [];
20038
+ const hasExactDeviceDelegation = rows.some((row) => {
20039
+ if (!row || typeof row !== "object") return false;
20040
+ const data = row.data;
20041
+ if (!data || typeof data !== "object") return false;
20042
+ const fields = data;
20043
+ return fields.certificateParentKey === device.public && (requiredDelegationKeyHash === void 0 || fields.deviceKey === `key:${requiredDelegationKeyHash}`);
20044
+ });
20045
+ if (hasExactDeviceDelegation) {
19900
20046
  sawDelegation = true;
19901
20047
  break;
19902
20048
  }
@@ -19907,7 +20053,7 @@ ${String(commit).toLowerCase()}`;
19907
20053
  }
19908
20054
  if (!sawDelegation) {
19909
20055
  const err = new Error(
19910
- `receiving-group setup: parent '${parent}' still holds NO SignerDelegation for '${owner}' after ${pollTimeoutMs}ms. enrollFirstDevice seated the device SIGNER, but the home cert chain's links[1] (the platform-signed delegation) never surfaced \u2014 the birth would come up UNWARRANTED/headless (birth-cert-not-seeded). The enroll must record the keyless delegation (enrollFirstDevice.delegationCert) BEFORE birth. [ParentSignerDelegationMissing]`
20056
+ `receiving-group setup: parent '${parent}' still holds NO SignerDelegation for '${owner}' after ${pollTimeoutMs}ms. enrollFirstDevice seated the device SIGNER, but the home cert chain's links[1] (the platform-signed delegation for device '${String(requiredDelegationKeyHash ?? "unknown").slice(0, 12)}\u2026') never surfaced \u2014 the birth would combine different device generations and fail its certificate chain. The enroll must record the keyless delegation (enrollFirstDevice.delegationCert) BEFORE birth. [ParentSignerDelegationMissing]`
19911
20057
  );
19912
20058
  err.code = "ParentSignerDelegationMissing";
19913
20059
  throw err;
@@ -20121,7 +20267,22 @@ ${String(commit).toLowerCase()}`;
20121
20267
  * lifecycle view: active = served now; superseded/retired = replayable, not served.
20122
20268
  * `drifted` is true ONLY on the word of a successful read.
20123
20269
  */
20124
- lawStatus: () => serialize(async () => lawStatusOf(installedLawInner(), clientLawHash)),
20270
+ lawStatus: () => serialize(async () => {
20271
+ const currentLaw = currentLawInner();
20272
+ const current = currentLawHashesInner();
20273
+ const status = lawStatusOf(
20274
+ installedLawRowsCache === void 0 ? null : installedLawInner(),
20275
+ clientLawHash,
20276
+ current
20277
+ );
20278
+ console.error(
20279
+ `[nomos-law-status] workspace=${workspace} client=${status.clientHash ?? "unregistered"} current=${status.current?.join(",") ?? "unknown"} installed=${status.installed.join(",")} drifted=${status.drifted}`
20280
+ );
20281
+ return {
20282
+ ...status,
20283
+ currentDomains: currentLaw === null ? null : Object.keys(currentLaw).sort()
20284
+ };
20285
+ }),
20125
20286
  /**
20126
20287
  * Register the BAKED law hash this client was generated under — the soft-warn lane:
20127
20288
  * if the workspace's installed law doesn't carry it, ONE console.warn names the drift
@@ -20135,7 +20296,16 @@ ${String(commit).toLowerCase()}`;
20135
20296
  "registerLawHash(hash) requires the generated client's baked law hash (the 64-hex sha256 of its package)"
20136
20297
  );
20137
20298
  clientLawHash = hash;
20138
- const status = lawStatusOf(installedLawInner(), clientLawHash);
20299
+ const currentLaw = currentLawInner();
20300
+ const current = currentLawHashesInner();
20301
+ const status = lawStatusOf(
20302
+ installedLawRowsCache === void 0 ? null : installedLawInner(),
20303
+ clientLawHash,
20304
+ current
20305
+ );
20306
+ console.error(
20307
+ `[nomos-law-status] workspace=${workspace} client=${status.clientHash ?? "unregistered"} current=${status.current?.join(",") ?? "unknown"} installed=${status.installed.join(",")} drifted=${status.drifted}`
20308
+ );
20139
20309
  if (status.drifted && !warnedDrift) {
20140
20310
  warnedDrift = true;
20141
20311
  console.warn(
@@ -20143,11 +20313,14 @@ ${String(commit).toLowerCase()}`;
20143
20313
  what: "connect",
20144
20314
  workspace,
20145
20315
  clientHash: hash,
20146
- installed: status.installed
20316
+ installed: status.current ?? status.installed
20147
20317
  })
20148
20318
  );
20149
20319
  }
20150
- return status;
20320
+ return {
20321
+ ...status,
20322
+ currentDomains: currentLaw === null ? null : Object.keys(currentLaw).sort()
20323
+ };
20151
20324
  }),
20152
20325
  /**
20153
20326
  * THE COMPAT SUPERPOWER (#72b): the generated client factory hands over its baked `nomosCompat`
@@ -20726,7 +20899,7 @@ ${String(commit).toLowerCase()}`;
20726
20899
  if (result?.offline === true || result?.pushFailed === true || result?.reconnectRequired === true)
20727
20900
  return result;
20728
20901
  const localHead = await serialize(async () => resolveBranchHead());
20729
- if (localHead === syncedBase) return result;
20902
+ if (localHead === syncedBase && !discoverRemote) return result;
20730
20903
  return api.sync({ admit, discoverRemote });
20731
20904
  });
20732
20905
  }
@@ -21580,6 +21753,33 @@ async function openRealm(opts = {}) {
21580
21753
  rebindWatches(name, holon);
21581
21754
  return holon;
21582
21755
  }
21756
+ async function deviceIdentity(secret) {
21757
+ const scratch = `nomos-device-${realmClientId}`;
21758
+ const holon = await mount(scratch, {
21759
+ allowUnborn: true,
21760
+ authToken: "",
21761
+ principal: "",
21762
+ clientId: `${realmClientId}:device-identity`
21763
+ }, { evict: false });
21764
+ try {
21765
+ if (typeof secret === "string" && secret.length > 0) {
21766
+ return { secret, public: await holon.devicePublicOf(secret) };
21767
+ }
21768
+ const created = await holon.authorKeygen();
21769
+ if (!created?.ok || !created.secret || !created.public) {
21770
+ throw new Error("the kernel did not return a complete device identity");
21771
+ }
21772
+ return { secret: created.secret, public: created.public };
21773
+ } finally {
21774
+ try {
21775
+ holon._dispose();
21776
+ } catch {
21777
+ }
21778
+ mounted.delete(scratch);
21779
+ parked.delete(scratch);
21780
+ plane.drop(scratch);
21781
+ }
21782
+ }
21583
21783
  return {
21584
21784
  /** The realm's stable client id (each workspace gets `${clientId}:${name}` unless overridden). */
21585
21785
  clientId: realmClientId,
@@ -21587,6 +21787,8 @@ async function openRealm(opts = {}) {
21587
21787
  plane,
21588
21788
  /** Open (or mount-on-demand) a holon bound to `name` IN this plane. Same surface as `connect()` returns. */
21589
21789
  workspace: (name, wsOpts = {}) => withGate(() => mount(name, wsOpts)),
21790
+ /** Kernel-owned device identity, prepared without reading or creating remote custody. */
21791
+ deviceIdentity: (secret) => withGate(() => deviceIdentity(secret)),
21590
21792
  /** The realm's workspaces + their posture (mounted / parked / has-custody). */
21591
21793
  list: () => {
21592
21794
  const names = /* @__PURE__ */ new Set([
@@ -22455,20 +22657,34 @@ async function nomosInternalOpenGeneratedApplication(options, bind, internals =
22455
22657
  ...environment?.NOMOS_TEST_K_ROOT_PUBLIC ? { __testKRootPublic: environment.NOMOS_TEST_K_ROOT_PUBLIC } : {}
22456
22658
  });
22457
22659
  try {
22458
- let authorityHolon = await measureOpen("open private application custody", () => mountAuthority(secret, authToken));
22459
22660
  const storedJournal = await measureOpen("load application bootstrap state", () => store.loadText(journalState));
22460
22661
  const completed = storedJournal === "complete";
22662
+ const prepareDeviceIdentity = async (durableSecret) => {
22663
+ if (realm.deviceIdentity !== void 0) return realm.deviceIdentity(durableSecret);
22664
+ const legacy = await mountAuthority(durableSecret ?? null, authToken);
22665
+ if (durableSecret !== void 0) {
22666
+ return { secret: durableSecret, public: await legacy.devicePublicOf(durableSecret) };
22667
+ }
22668
+ const created = await legacy.authorKeygen();
22669
+ if (!created?.ok || !created.secret || !created.public) {
22670
+ throw new Error("the runtime did not create a device identity");
22671
+ }
22672
+ return { secret: created.secret, public: created.public };
22673
+ };
22461
22674
  let publicKey;
22462
22675
  if (secret === null) {
22463
- const device = await measureOpen("create application device identity", () => authorityHolon.authorKeygen());
22464
- if (!device.ok || !device.secret || !device.public) throw new Error("the runtime did not create a device identity");
22676
+ const device = await measureOpen("create application device identity", () => prepareDeviceIdentity());
22677
+ if (!device.secret || !device.public) throw new Error("the runtime did not create a device identity");
22465
22678
  await measureOpen("make application device identity durable", () => store.saveText(keyState, device.secret));
22466
22679
  secret = device.secret;
22467
22680
  publicKey = device.public;
22468
22681
  await measureOpen("save application bootstrap progress", () => store.saveText(journalState, "identity-durable"));
22469
22682
  } else {
22470
22683
  const durableSecret = secret;
22471
- publicKey = await measureOpen("restore application device identity", () => authorityHolon.devicePublicOf(durableSecret));
22684
+ publicKey = await measureOpen(
22685
+ "restore application device identity",
22686
+ async () => (await prepareDeviceIdentity(durableSecret)).public
22687
+ );
22472
22688
  }
22473
22689
  const deviceChallengeBytes = Uint8Array.from(bytesFromBase64(publicKey));
22474
22690
  const deviceChallenge = await crypto.subtle.digest("SHA-256", deviceChallengeBytes.buffer).then((digest) => [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, "0")).join(""));
@@ -22478,7 +22694,7 @@ async function nomosInternalOpenGeneratedApplication(options, bind, internals =
22478
22694
  throw applicationError("Sign in changed authority while preparing this application device.", "nomos.authority.changed_during_open");
22479
22695
  }
22480
22696
  authToken = deviceToken;
22481
- authorityHolon = await measureOpen("bind attested application device", () => mountAuthority(secret, authToken));
22697
+ let authorityHolon = await measureOpen("open private application custody", () => mountAuthority(secret, authToken));
22482
22698
  const birthOrRepeat = async () => {
22483
22699
  const birth = await measureOpen("establish private application custody", () => authorityHolon.nomosInternalBirthReceivingGroup({
22484
22700
  parent: application,
@@ -22521,11 +22737,9 @@ async function nomosInternalOpenGeneratedApplication(options, bind, internals =
22521
22737
  }
22522
22738
  };
22523
22739
  if (!completed) {
22524
- let homeAvailable = false;
22525
- try {
22526
- homeAvailable = Boolean(await measureOpen("check private application custody", () => authorityHolon.head()));
22527
- } catch {
22528
- }
22740
+ const homeAvailable = Boolean(
22741
+ await measureOpen("check private application custody", () => authorityHolon.head())
22742
+ );
22529
22743
  if (!homeAvailable) {
22530
22744
  await birthOrRepeat();
22531
22745
  }