From 7876bc30315a7c0749c4e83cf15205092d654f0c Mon Sep 17 00:00:00 2001 From: Sanjay Vasandani Date: Fri, 13 Sep 2024 14:12:59 -0700 Subject: [PATCH] refactor: Use protobuf types in Kingdom Spanner DB --- src/main/k8s/local/BUILD.bazel | 2 +- .../measurement/internal/kingdom/BUILD.bazel | 16 +- src/main/resources/kingdom/spanner/README.md | 17 ++ .../resources/kingdom/spanner/changelog.yaml | 3 + .../kingdom/spanner/create-proto-bundle.sql | 165 ++++++++++++++++++ 5 files changed, 198 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/kingdom/spanner/README.md create mode 100644 src/main/resources/kingdom/spanner/create-proto-bundle.sql diff --git a/src/main/k8s/local/BUILD.bazel b/src/main/k8s/local/BUILD.bazel index 852f2824551..552219510fe 100644 --- a/src/main/k8s/local/BUILD.bazel +++ b/src/main/k8s/local/BUILD.bazel @@ -14,7 +14,7 @@ package( ], ) -SPANNER_EMULATOR_VERSION = "1.5.13" +SPANNER_EMULATOR_VERSION = "1.5.23" SECRET_NAME = "certs-and-configs" diff --git a/src/main/proto/wfa/measurement/internal/kingdom/BUILD.bazel b/src/main/proto/wfa/measurement/internal/kingdom/BUILD.bazel index a120f2348f7..27293580b3c 100644 --- a/src/main/proto/wfa/measurement/internal/kingdom/BUILD.bazel +++ b/src/main/proto/wfa/measurement/internal/kingdom/BUILD.bazel @@ -1,4 +1,4 @@ -load("@rules_proto//proto:defs.bzl", "proto_library") +load("@rules_proto//proto:defs.bzl", "proto_descriptor_set", "proto_library") load( "@wfa_rules_kotlin_jvm//kotlin:defs.bzl", "kt_jvm_grpc_proto_library", @@ -28,9 +28,7 @@ LIBS = [ "event_group_metadata_descriptor", "event_group", "event_template", - "exchange_details", "exchange", - "exchange_step_attempt_details", "exchange_step_attempt", "exchange_step", "exchange_workflow", @@ -49,7 +47,6 @@ LIBS = [ "population", "protocol_config_config", "protocol_config", - "recurring_exchange_details", "recurring_exchange", "requisition_refusal", "state_transition_measurement_log_entry", @@ -60,8 +57,11 @@ DETAILS_LIBS = [ "computation_participant", "data_provider", "duchy_measurement_log_entry", + "exchange", "event_group_metadata_descriptor", "event_group", + "exchange_step_attempt", + "recurring_exchange", "requisition", "measurement_consumer", "measurement_log_entry", @@ -803,3 +803,11 @@ proto_library( ) for name in SERVICES ] + +proto_descriptor_set( + name = "details_descriptor_set", + deps = [ + ":{name}_details_proto".format(name = name) + for name in DETAILS_LIBS + ], +) diff --git a/src/main/resources/kingdom/spanner/README.md b/src/main/resources/kingdom/spanner/README.md new file mode 100644 index 00000000000..af0c2b24f3a --- /dev/null +++ b/src/main/resources/kingdom/spanner/README.md @@ -0,0 +1,17 @@ +# Kingdom Spanner Changelog + +Liquibase changelog for the Kingdom Spanner database. + +## Protobuf Changes + +If the definition of any +[Details message](../../../proto/wfa/measurement/internal/README.md#details-message-types) +in the API changes, it must be accompanied by a changelog entry with the +appropriate `PROTO BUNDLE` DDL statements. See +[Work with protocol buffers in GoogleSQL](https://cloud.google.com/spanner/docs/reference/standard-sql/protocol-buffers). + +The serialized `FileDescriptorSet` can be obtained from the +`//src/main/proto/wfa/measurement/internal/kingdom:details_descriptor_set` Bazel +build target. The base64-encoded value of the output can be passed in a `SET +PROTO_DESCRIPTORS` statement, which will apply to the following DDL batch. See +[`create-proto-bundle.sql`](create-proto-bundle.sql) for an example. diff --git a/src/main/resources/kingdom/spanner/changelog.yaml b/src/main/resources/kingdom/spanner/changelog.yaml index 1f2dc56107e..659740572f4 100644 --- a/src/main/resources/kingdom/spanner/changelog.yaml +++ b/src/main/resources/kingdom/spanner/changelog.yaml @@ -66,3 +66,6 @@ databaseChangeLog: - include: file: reorder-measurements-by-continuation-token.sql relativeToChangeLogFile: true +- include: + file: create-proto-bundle.sql + relativeToChangeLogFile: true \ No newline at end of file diff --git a/src/main/resources/kingdom/spanner/create-proto-bundle.sql b/src/main/resources/kingdom/spanner/create-proto-bundle.sql new file mode 100644 index 00000000000..a1528bc6e7a --- /dev/null +++ b/src/main/resources/kingdom/spanner/create-proto-bundle.sql @@ -0,0 +1,165 @@ +-- liquibase formatted sql + +-- Copyright 2024 The Cross-Media Measurement Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + +-- changeset sanjayvas:19 dbms:cloudspanner +-- comment: Create the initial proto bundle. + +-- Set protobuf FileDescriptorSet as a base64 string. This gets applied to the next DDL batch. +SET PROTO_DESCRIPTORS = 'CsQBCjp3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9jZXJ0aWZpY2F0ZV9kZXRhaWxzLnByb3RvEiB3ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbSIvChJDZXJ0aWZpY2F0ZURldGFpbHMSGQoIeDUwOV9kZXIYASABKAxSB3g1MDlEZXJCKwonb3JnLndmYW5ldC5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tUAFiBnByb3RvMwriBApFd2ZhL21lYXN1cmVtZW50L2ludGVybmFsL2tpbmdkb20vcGFydGljaXBhbnRfcmVxdWlzaXRpb25fcGFyYW1zLnByb3RvEiB3ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbSLkAQoVTGlxdWlkTGVnaW9uc1YyUGFyYW1zEi0KE2VsX2dhbWFsX3B1YmxpY19rZXkYASABKAxSEGVsR2FtYWxQdWJsaWNLZXkSQAodZWxfZ2FtYWxfcHVibGljX2tleV9zaWduYXR1cmUYAiABKAxSGWVsR2FtYWxQdWJsaWNLZXlTaWduYXR1cmUSWgorZWxfZ2FtYWxfcHVibGljX2tleV9zaWduYXR1cmVfYWxnb3JpdGhtX29pZBgDIAEoCVIlZWxHYW1hbFB1YmxpY0tleVNpZ25hdHVyZUFsZ29yaXRobU9pZCLaAQogSG9uZXN0TWFqb3JpdHlTaGFyZVNodWZmbGVQYXJhbXMSJgoPdGlua19wdWJsaWNfa2V5GAEgASgMUg10aW5rUHVibGljS2V5EjkKGXRpbmtfcHVibGljX2tleV9zaWduYXR1cmUYAiABKAxSFnRpbmtQdWJsaWNLZXlTaWduYXR1cmUSUwondGlua19wdWJsaWNfa2V5X3NpZ25hdHVyZV9hbGdvcml0aG1fb2lkGAMgASgJUiJ0aW5rUHVibGljS2V5U2lnbmF0dXJlQWxnb3JpdGhtT2lkQisKJ29yZy53ZmFuZXQubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbVABYgZwcm90bzMKgAUKRndmYS9tZWFzdXJlbWVudC9pbnRlcm5hbC9raW5nZG9tL2NvbXB1dGF0aW9uX3BhcnRpY2lwYW50X2RldGFpbHMucHJvdG8SIHdmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tGkV3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9wYXJ0aWNpcGFudF9yZXF1aXNpdGlvbl9wYXJhbXMucHJvdG8ilwMKHUNvbXB1dGF0aW9uUGFydGljaXBhbnREZXRhaWxzEmUKEWxpcXVpZF9sZWdpb25zX3YyGAEgASgLMjcud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uTGlxdWlkTGVnaW9uc1YyUGFyYW1zSABSD2xpcXVpZExlZ2lvbnNWMhJ5ChxyZWFjaF9vbmx5X2xpcXVpZF9sZWdpb25zX3YyGAIgASgLMjcud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uTGlxdWlkTGVnaW9uc1YyUGFyYW1zSABSGHJlYWNoT25seUxpcXVpZExlZ2lvbnNWMhKHAQodaG9uZXN0X21ham9yaXR5X3NoYXJlX3NodWZmbGUYAyABKAsyQi53ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbS5Ib25lc3RNYWpvcml0eVNoYXJlU2h1ZmZsZVBhcmFtc0gAUhpob25lc3RNYWpvcml0eVNoYXJlU2h1ZmZsZUIKCghwcm90b2NvbEIrCidvcmcud2ZhbmV0Lm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb21QAWIGcHJvdG8zCowCCkF3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9kYXRhX3Byb3ZpZGVyX2NhcGFiaWxpdGllcy5wcm90bxIgd2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20icAoYRGF0YVByb3ZpZGVyQ2FwYWJpbGl0aWVzElQKJ2hvbmVzdF9tYWpvcml0eV9zaGFyZV9zaHVmZmxlX3N1cHBvcnRlZBgBIAEoCFIjaG9uZXN0TWFqb3JpdHlTaGFyZVNodWZmbGVTdXBwb3J0ZWRCKwonb3JnLndmYW5ldC5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tUAFiBnByb3RvMwr/AQofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIjsKCVRpbWVzdGFtcBIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KFAQoTY29tLmdvb2dsZS5wcm90b2J1ZkIOVGltZXN0YW1wUHJvdG9QAVoyZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vdGltZXN0YW1wcGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwq7AgoaZ29vZ2xlL3R5cGUvaW50ZXJ2YWwucHJvdG8SC2dvb2dsZS50eXBlGh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvInwKCEludGVydmFsEjkKCnN0YXJ0X3RpbWUYASABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUglzdGFydFRpbWUSNQoIZW5kX3RpbWUYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgdlbmRUaW1lQmkKD2NvbS5nb29nbGUudHlwZUINSW50ZXJ2YWxQcm90b1ABWjxnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL3R5cGUvaW50ZXJ2YWw7aW50ZXJ2YWz4AQGiAgNHVFBiBnByb3RvMwr/BAo8d2ZhL21lYXN1cmVtZW50L2ludGVybmFsL2tpbmdkb20vZGF0YV9wcm92aWRlcl9kZXRhaWxzLnByb3RvEiB3ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbRoaZ29vZ2xlL3R5cGUvaW50ZXJ2YWwucHJvdG8aQXdmYS9tZWFzdXJlbWVudC9pbnRlcm5hbC9raW5nZG9tL2RhdGFfcHJvdmlkZXJfY2FwYWJpbGl0aWVzLnByb3RvIogDChNEYXRhUHJvdmlkZXJEZXRhaWxzEh8KC2FwaV92ZXJzaW9uGAEgASgJUgphcGlWZXJzaW9uEh0KCnB1YmxpY19rZXkYAiABKAxSCXB1YmxpY0tleRIwChRwdWJsaWNfa2V5X3NpZ25hdHVyZRgDIAEoDFIScHVibGljS2V5U2lnbmF0dXJlEkoKInB1YmxpY19rZXlfc2lnbmF0dXJlX2FsZ29yaXRobV9vaWQYBCABKAlSHnB1YmxpY0tleVNpZ25hdHVyZUFsZ29yaXRobU9pZBJTChpkYXRhX2F2YWlsYWJpbGl0eV9pbnRlcnZhbBgFIAEoCzIVLmdvb2dsZS50eXBlLkludGVydmFsUhhkYXRhQXZhaWxhYmlsaXR5SW50ZXJ2YWwSXgoMY2FwYWJpbGl0aWVzGAYgASgLMjoud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uRGF0YVByb3ZpZGVyQ2FwYWJpbGl0aWVzUgxjYXBhYmlsaXRpZXNCKwonb3JnLndmYW5ldC5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tUAFiBnByb3RvMwqVAwpQd2ZhL21lYXN1cmVtZW50L2ludGVybmFsL2tpbmdkb20vZHVjaHlfbWVhc3VyZW1lbnRfbG9nX2VudHJ5X3N0YWdlX2F0dGVtcHQucHJvdG8SIHdmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tGh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvIsgBCiREdWNoeU1lYXN1cmVtZW50TG9nRW50cnlTdGFnZUF0dGVtcHQSFAoFc3RhZ2UYASABKAVSBXN0YWdlEh0KCnN0YWdlX25hbWUYAiABKAlSCXN0YWdlTmFtZRJEChBzdGFnZV9zdGFydF90aW1lGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIOc3RhZ2VTdGFydFRpbWUSJQoOYXR0ZW1wdF9udW1iZXIYBCABKANSDWF0dGVtcHROdW1iZXJCKwonb3JnLndmYW5ldC5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tUAFiBnByb3RvMwq/AwpKd2ZhL21lYXN1cmVtZW50L2ludGVybmFsL2tpbmdkb20vZHVjaHlfbWVhc3VyZW1lbnRfbG9nX2VudHJ5X2RldGFpbHMucHJvdG8SIHdmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tGlB3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9kdWNoeV9tZWFzdXJlbWVudF9sb2dfZW50cnlfc3RhZ2VfYXR0ZW1wdC5wcm90byLHAQofRHVjaHlNZWFzdXJlbWVudExvZ0VudHJ5RGV0YWlscxI3ChhkdWNoeV9jaGlsZF9yZWZlcmVuY2VfaWQYASABKAlSFWR1Y2h5Q2hpbGRSZWZlcmVuY2VJZBJrCg1zdGFnZV9hdHRlbXB0GAIgASgLMkYud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uRHVjaHlNZWFzdXJlbWVudExvZ0VudHJ5U3RhZ2VBdHRlbXB0UgxzdGFnZUF0dGVtcHRCKwonb3JnLndmYW5ldC5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tUAFiBnByb3RvMwrNAQo3d2ZhL21lYXN1cmVtZW50L2ludGVybmFsL2tpbmdkb20vZXhjaGFuZ2VfZGV0YWlscy5wcm90bxIgd2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20iOwoPRXhjaGFuZ2VEZXRhaWxzEigKEGF1ZGl0X3RyYWlsX2hhc2gYASABKAxSDmF1ZGl0VHJhaWxIYXNoQisKJ29yZy53ZmFuZXQubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbVABYgZwcm90bzMK7F8KIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvEg9nb29nbGUucHJvdG9idWYiTQoRRmlsZURlc2NyaXB0b3JTZXQSOAoEZmlsZRgBIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvUgRmaWxlIpgFChNGaWxlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSGAoHcGFja2FnZRgCIAEoCVIHcGFja2FnZRIeCgpkZXBlbmRlbmN5GAMgAygJUgpkZXBlbmRlbmN5EisKEXB1YmxpY19kZXBlbmRlbmN5GAogAygFUhBwdWJsaWNEZXBlbmRlbmN5EicKD3dlYWtfZGVwZW5kZW5jeRgLIAMoBVIOd2Vha0RlcGVuZGVuY3kSQwoMbWVzc2FnZV90eXBlGAQgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1ILbWVzc2FnZVR5cGUSQQoJZW51bV90eXBlGAUgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlEkEKB3NlcnZpY2UYBiADKAsyJy5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90b1IHc2VydmljZRJDCglleHRlbnNpb24YByADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhI2CgdvcHRpb25zGAggASgLMhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zUgdvcHRpb25zEkkKEHNvdXJjZV9jb2RlX2luZm8YCSABKAsyHy5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm9SDnNvdXJjZUNvZGVJbmZvEhYKBnN5bnRheBgMIAEoCVIGc3ludGF4EjIKB2VkaXRpb24YDiABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbiK5BgoPRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSOwoFZmllbGQYAiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SBWZpZWxkEkMKCWV4dGVuc2lvbhgGIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEkEKC25lc3RlZF90eXBlGAMgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1IKbmVzdGVkVHlwZRJBCgllbnVtX3R5cGUYBCADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSWAoPZXh0ZW5zaW9uX3JhbmdlGAUgAygLMi8uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZVIOZXh0ZW5zaW9uUmFuZ2USRAoKb25lb2ZfZGVjbBgIIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90b1IJb25lb2ZEZWNsEjkKB29wdGlvbnMYByABKAsyHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnNSB29wdGlvbnMSVQoOcmVzZXJ2ZWRfcmFuZ2UYCSADKAsyLi5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgKIAMoCVIMcmVzZXJ2ZWROYW1lGnoKDkV4dGVuc2lvblJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZBJACgdvcHRpb25zGAMgASgLMiYuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9uc1IHb3B0aW9ucxo3Cg1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCLMBAoVRXh0ZW5zaW9uUmFuZ2VPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uElkKC2RlY2xhcmF0aW9uGAIgAygLMjIuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5EZWNsYXJhdGlvbkIDiAECUgtkZWNsYXJhdGlvbhI3CghmZWF0dXJlcxgyIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UghmZWF0dXJlcxJtCgx2ZXJpZmljYXRpb24YAyABKA4yOC5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLlZlcmlmaWNhdGlvblN0YXRlOgpVTlZFUklGSUVEQgOIAQJSDHZlcmlmaWNhdGlvbhqUAQoLRGVjbGFyYXRpb24SFgoGbnVtYmVyGAEgASgFUgZudW1iZXISGwoJZnVsbF9uYW1lGAIgASgJUghmdWxsTmFtZRISCgR0eXBlGAMgASgJUgR0eXBlEhoKCHJlc2VydmVkGAUgASgIUghyZXNlcnZlZBIaCghyZXBlYXRlZBgGIAEoCFIIcmVwZWF0ZWRKBAgEEAUiNAoRVmVyaWZpY2F0aW9uU3RhdGUSDwoLREVDTEFSQVRJT04QABIOCgpVTlZFUklGSUVEEAEqCQjoBxCAgICAAiLBBgoURmllbGREZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAyABKAVSBm51bWJlchJBCgVsYWJlbBgEIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFIFbGFiZWwSPgoEdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgR0eXBlEhsKCXR5cGVfbmFtZRgGIAEoCVIIdHlwZU5hbWUSGgoIZXh0ZW5kZWUYAiABKAlSCGV4dGVuZGVlEiMKDWRlZmF1bHRfdmFsdWUYByABKAlSDGRlZmF1bHRWYWx1ZRIfCgtvbmVvZl9pbmRleBgJIAEoBVIKb25lb2ZJbmRleBIbCglqc29uX25hbWUYCiABKAlSCGpzb25OYW1lEjcKB29wdGlvbnMYCCABKAsyHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zUgdvcHRpb25zEicKD3Byb3RvM19vcHRpb25hbBgRIAEoCFIOcHJvdG8zT3B0aW9uYWwitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVQRUFURUQQAxISCg5MQUJFTF9SRVFVSVJFRBACImMKFE9uZW9mRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSNwoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnNSB29wdGlvbnMi4wIKE0VudW1EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI/CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9SBXZhbHVlEjYKB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNSB29wdGlvbnMSXQoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAUgAygJUgxyZXNlcnZlZE5hbWUaOwoRRW51bVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIoMBChhFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAiABKAVSBm51bWJlchI7CgdvcHRpb25zGAMgASgLMiEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnNSB29wdGlvbnMipwEKFlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI+CgZtZXRob2QYAiADKAsyJi5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvUgZtZXRob2QSOQoHb3B0aW9ucxgDIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9uc1IHb3B0aW9ucyKJAgoVTWV0aG9kRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSHQoKaW5wdXRfdHlwZRgCIAEoCVIJaW5wdXRUeXBlEh8KC291dHB1dF90eXBlGAMgASgJUgpvdXRwdXRUeXBlEjgKB29wdGlvbnMYBCABKAsyHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9uc1IHb3B0aW9ucxIwChBjbGllbnRfc3RyZWFtaW5nGAUgASgIOgVmYWxzZVIPY2xpZW50U3RyZWFtaW5nEjAKEHNlcnZlcl9zdHJlYW1pbmcYBiABKAg6BWZhbHNlUg9zZXJ2ZXJTdHJlYW1pbmcirQkKC0ZpbGVPcHRpb25zEiEKDGphdmFfcGFja2FnZRgBIAEoCVILamF2YVBhY2thZ2USMAoUamF2YV9vdXRlcl9jbGFzc25hbWUYCCABKAlSEmphdmFPdXRlckNsYXNzbmFtZRI1ChNqYXZhX211bHRpcGxlX2ZpbGVzGAogASgIOgVmYWxzZVIRamF2YU11bHRpcGxlRmlsZXMSRAodamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2gYFCABKAhCAhgBUhlqYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoEjoKFmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgYGyABKAg6BWZhbHNlUhNqYXZhU3RyaW5nQ2hlY2tVdGY4ElMKDG9wdGltaXplX2ZvchgJIAEoDjIpLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGU6BVNQRUVEUgtvcHRpbWl6ZUZvchIdCgpnb19wYWNrYWdlGAsgASgJUglnb1BhY2thZ2USNQoTY2NfZ2VuZXJpY19zZXJ2aWNlcxgQIAEoCDoFZmFsc2VSEWNjR2VuZXJpY1NlcnZpY2VzEjkKFWphdmFfZ2VuZXJpY19zZXJ2aWNlcxgRIAEoCDoFZmFsc2VSE2phdmFHZW5lcmljU2VydmljZXMSNQoTcHlfZ2VuZXJpY19zZXJ2aWNlcxgSIAEoCDoFZmFsc2VSEXB5R2VuZXJpY1NlcnZpY2VzEiUKCmRlcHJlY2F0ZWQYFyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEi4KEGNjX2VuYWJsZV9hcmVuYXMYHyABKAg6BHRydWVSDmNjRW5hYmxlQXJlbmFzEioKEW9iamNfY2xhc3NfcHJlZml4GCQgASgJUg9vYmpjQ2xhc3NQcmVmaXgSKQoQY3NoYXJwX25hbWVzcGFjZRglIAEoCVIPY3NoYXJwTmFtZXNwYWNlEiEKDHN3aWZ0X3ByZWZpeBgnIAEoCVILc3dpZnRQcmVmaXgSKAoQcGhwX2NsYXNzX3ByZWZpeBgoIAEoCVIOcGhwQ2xhc3NQcmVmaXgSIwoNcGhwX25hbWVzcGFjZRgpIAEoCVIMcGhwTmFtZXNwYWNlEjQKFnBocF9tZXRhZGF0YV9uYW1lc3BhY2UYLCABKAlSFHBocE1ldGFkYXRhTmFtZXNwYWNlEiEKDHJ1YnlfcGFja2FnZRgtIAEoCVILcnVieVBhY2thZ2USNwoIZmVhdHVyZXMYMiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iOgoMT3B0aW1pemVNb2RlEgkKBVNQRUVEEAESDQoJQ09ERV9TSVpFEAISEAoMTElURV9SVU5USU1FEAMqCQjoBxCAgICAAkoECCoQK0oECCYQJ1IUcGhwX2dlbmVyaWNfc2VydmljZXMi9AMKDk1lc3NhZ2VPcHRpb25zEjwKF21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0GAEgASgIOgVmYWxzZVIUbWVzc2FnZVNldFdpcmVGb3JtYXQSTAofbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvchgCIAEoCDoFZmFsc2VSHG5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3ISJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSGwoJbWFwX2VudHJ5GAcgASgIUghtYXBFbnRyeRJWCiZkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cxgLIAEoCEICGAFSImRlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHMSNwoIZmVhdHVyZXMYDCABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAQQBUoECAUQBkoECAYQB0oECAgQCUoECAkQCiKdDQoMRmllbGRPcHRpb25zEkEKBWN0eXBlGAEgASgOMiMuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZToGU1RSSU5HUgVjdHlwZRIWCgZwYWNrZWQYAiABKAhSBnBhY2tlZBJHCgZqc3R5cGUYBiABKA4yJC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZToJSlNfTk9STUFMUgZqc3R5cGUSGQoEbGF6eRgFIAEoCDoFZmFsc2VSBGxhenkSLgoPdW52ZXJpZmllZF9sYXp5GA8gASgIOgVmYWxzZVIOdW52ZXJpZmllZExhenkSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSGQoEd2VhaxgKIAEoCDoFZmFsc2VSBHdlYWsSKAoMZGVidWdfcmVkYWN0GBAgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSSwoJcmV0ZW50aW9uGBEgASgOMi0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25SZXRlbnRpb25SCXJldGVudGlvbhJICgd0YXJnZXRzGBMgAygOMi4uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlUgd0YXJnZXRzElcKEGVkaXRpb25fZGVmYXVsdHMYFCADKAsyLC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkVkaXRpb25EZWZhdWx0Ug9lZGl0aW9uRGVmYXVsdHMSNwoIZmVhdHVyZXMYFSABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSVQoPZmVhdHVyZV9zdXBwb3J0GBYgASgLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5GZWF0dXJlU3VwcG9ydFIOZmVhdHVyZVN1cHBvcnQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24aWgoORWRpdGlvbkRlZmF1bHQSMgoHZWRpdGlvbhgDIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUgdlZGl0aW9uEhQKBXZhbHVlGAIgASgJUgV2YWx1ZRqWAgoORmVhdHVyZVN1cHBvcnQSRwoSZWRpdGlvbl9pbnRyb2R1Y2VkGAEgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SEWVkaXRpb25JbnRyb2R1Y2VkEkcKEmVkaXRpb25fZGVwcmVjYXRlZBgCIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUhFlZGl0aW9uRGVwcmVjYXRlZBIvChNkZXByZWNhdGlvbl93YXJuaW5nGAMgASgJUhJkZXByZWNhdGlvbldhcm5pbmcSQQoPZWRpdGlvbl9yZW1vdmVkGAQgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SDmVkaXRpb25SZW1vdmVkIi8KBUNUeXBlEgoKBlNUUklORxAAEggKBENPUkQQARIQCgxTVFJJTkdfUElFQ0UQAiI1CgZKU1R5cGUSDQoJSlNfTk9STUFMEAASDQoJSlNfU1RSSU5HEAESDQoJSlNfTlVNQkVSEAIiVQoPT3B0aW9uUmV0ZW50aW9uEhUKEVJFVEVOVElPTl9VTktOT1dOEAASFQoRUkVURU5USU9OX1JVTlRJTUUQARIUChBSRVRFTlRJT05fU09VUkNFEAIijAIKEE9wdGlvblRhcmdldFR5cGUSFwoTVEFSR0VUX1RZUEVfVU5LTk9XThAAEhQKEFRBUkdFVF9UWVBFX0ZJTEUQARIfChtUQVJHRVRfVFlQRV9FWFRFTlNJT05fUkFOR0UQAhIXChNUQVJHRVRfVFlQRV9NRVNTQUdFEAMSFQoRVEFSR0VUX1RZUEVfRklFTEQQBBIVChFUQVJHRVRfVFlQRV9PTkVPRhAFEhQKEFRBUkdFVF9UWVBFX0VOVU0QBhIaChZUQVJHRVRfVFlQRV9FTlVNX0VOVFJZEAcSFwoTVEFSR0VUX1RZUEVfU0VSVklDRRAIEhYKElRBUkdFVF9UWVBFX01FVEhPRBAJKgkI6AcQgICAgAJKBAgEEAVKBAgSEBMirAEKDE9uZW9mT3B0aW9ucxI3CghmZWF0dXJlcxgBIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UghmZWF0dXJlcxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACItECCgtFbnVtT3B0aW9ucxIfCgthbGxvd19hbGlhcxgCIAEoCFIKYWxsb3dBbGlhcxIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJWCiZkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cxgGIAEoCEICGAFSImRlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHMSNwoIZmVhdHVyZXMYByABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAUQBiLYAgoQRW51bVZhbHVlT3B0aW9ucxIlCgpkZXByZWNhdGVkGAEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBI3CghmZWF0dXJlcxgCIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UghmZWF0dXJlcxIoCgxkZWJ1Z19yZWRhY3QYAyABKAg6BWZhbHNlUgtkZWJ1Z1JlZGFjdBJVCg9mZWF0dXJlX3N1cHBvcnQYBCABKAsyLC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkZlYXR1cmVTdXBwb3J0Ug5mZWF0dXJlU3VwcG9ydBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACItUBCg5TZXJ2aWNlT3B0aW9ucxI3CghmZWF0dXJlcxgiIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UghmZWF0dXJlcxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIpkDCg1NZXRob2RPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkEnEKEWlkZW1wb3RlbmN5X2xldmVsGCIgASgOMi8uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVuY3lMZXZlbDoTSURFTVBPVEVOQ1lfVU5LTk9XTlIQaWRlbXBvdGVuY3lMZXZlbBI3CghmZWF0dXJlcxgjIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UghmZWF0dXJlcxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiJQChBJZGVtcG90ZW5jeUxldmVsEhcKE0lERU1QT1RFTkNZX1VOS05PV04QABITCg9OT19TSURFX0VGRkVDVFMQARIOCgpJREVNUE9URU5UEAIqCQjoBxCAgICAAiKaAwoTVW5pbnRlcnByZXRlZE9wdGlvbhJBCgRuYW1lGAIgAygLMi0uZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnRSBG5hbWUSKQoQaWRlbnRpZmllcl92YWx1ZRgDIAEoCVIPaWRlbnRpZmllclZhbHVlEiwKEnBvc2l0aXZlX2ludF92YWx1ZRgEIAEoBFIQcG9zaXRpdmVJbnRWYWx1ZRIsChJuZWdhdGl2ZV9pbnRfdmFsdWUYBSABKANSEG5lZ2F0aXZlSW50VmFsdWUSIQoMZG91YmxlX3ZhbHVlGAYgASgBUgtkb3VibGVWYWx1ZRIhCgxzdHJpbmdfdmFsdWUYByABKAxSC3N0cmluZ1ZhbHVlEicKD2FnZ3JlZ2F0ZV92YWx1ZRgIIAEoCVIOYWdncmVnYXRlVmFsdWUaSgoITmFtZVBhcnQSGwoJbmFtZV9wYXJ0GAEgAigJUghuYW1lUGFydBIhCgxpc19leHRlbnNpb24YAiACKAhSC2lzRXh0ZW5zaW9uIqcKCgpGZWF0dXJlU2V0EpEBCg5maWVsZF9wcmVzZW5jZRgBIAEoDjIpLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LkZpZWxkUHJlc2VuY2VCP4gBAZgBBJgBAaIBDRIIRVhQTElDSVQY5geiAQ0SCElNUExJQ0lUGOcHogENEghFWFBMSUNJVBjoB7IBAwjoB1INZmllbGRQcmVzZW5jZRJsCgllbnVtX3R5cGUYAiABKA4yJC5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5FbnVtVHlwZUIpiAEBmAEGmAEBogELEgZDTE9TRUQY5geiAQkSBE9QRU4Y5weyAQMI6AdSCGVudW1UeXBlEpgBChdyZXBlYXRlZF9maWVsZF9lbmNvZGluZxgDIAEoDjIxLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlJlcGVhdGVkRmllbGRFbmNvZGluZ0ItiAEBmAEEmAEBogENEghFWFBBTkRFRBjmB6IBCxIGUEFDS0VEGOcHsgEDCOgHUhVyZXBlYXRlZEZpZWxkRW5jb2RpbmcSfgoPdXRmOF92YWxpZGF0aW9uGAQgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuVXRmOFZhbGlkYXRpb25CKYgBAZgBBJgBAaIBCRIETk9ORRjmB6IBCxIGVkVSSUZZGOcHsgEDCOgHUg51dGY4VmFsaWRhdGlvbhJ+ChBtZXNzYWdlX2VuY29kaW5nGAUgASgOMisuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuTWVzc2FnZUVuY29kaW5nQiaIAQGYAQSYAQGiARQSD0xFTkdUSF9QUkVGSVhFRBjmB7IBAwjoB1IPbWVzc2FnZUVuY29kaW5nEoIBCgtqc29uX2Zvcm1hdBgGIAEoDjImLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0Lkpzb25Gb3JtYXRCOYgBAZgBA5gBBpgBAaIBFxISTEVHQUNZX0JFU1RfRUZGT1JUGOYHogEKEgVBTExPVxjnB7IBAwjoB1IKanNvbkZvcm1hdCJcCg1GaWVsZFByZXNlbmNlEhoKFkZJRUxEX1BSRVNFTkNFX1VOS05PV04QABIMCghFWFBMSUNJVBABEgwKCElNUExJQ0lUEAISEwoPTEVHQUNZX1JFUVVJUkVEEAMiNwoIRW51bVR5cGUSFQoRRU5VTV9UWVBFX1VOS05PV04QABIICgRPUEVOEAESCgoGQ0xPU0VEEAIiVgoVUmVwZWF0ZWRGaWVsZEVuY29kaW5nEiMKH1JFUEVBVEVEX0ZJRUxEX0VOQ09ESU5HX1VOS05PV04QABIKCgZQQUNLRUQQARIMCghFWFBBTkRFRBACIkkKDlV0ZjhWYWxpZGF0aW9uEhsKF1VURjhfVkFMSURBVElPTl9VTktOT1dOEAASCgoGVkVSSUZZEAISCAoETk9ORRADIgQIARABIlMKD01lc3NhZ2VFbmNvZGluZxIcChhNRVNTQUdFX0VOQ09ESU5HX1VOS05PV04QABITCg9MRU5HVEhfUFJFRklYRUQQARINCglERUxJTUlURUQQAiJICgpKc29uRm9ybWF0EhcKE0pTT05fRk9STUFUX1VOS05PV04QABIJCgVBTExPVxABEhYKEkxFR0FDWV9CRVNUX0VGRk9SVBACKgYI6AcQi04qBgiLThCQTioGCJBOEJFOSgYI5wcQ6Aci7wMKEkZlYXR1cmVTZXREZWZhdWx0cxJYCghkZWZhdWx0cxgBIAMoCzI8Lmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0RGVmYXVsdHMuRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0UghkZWZhdWx0cxJBCg9taW5pbXVtX2VkaXRpb24YBCABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIObWluaW11bUVkaXRpb24SQQoPbWF4aW11bV9lZGl0aW9uGAUgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SDm1heGltdW1FZGl0aW9uGvgBChhGZWF0dXJlU2V0RWRpdGlvbkRlZmF1bHQSMgoHZWRpdGlvbhgDIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUgdlZGl0aW9uEk4KFG92ZXJyaWRhYmxlX2ZlYXR1cmVzGAQgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSE292ZXJyaWRhYmxlRmVhdHVyZXMSQgoOZml4ZWRfZmVhdHVyZXMYBSABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFINZml4ZWRGZWF0dXJlc0oECAEQAkoECAIQA1IIZmVhdHVyZXMipwIKDlNvdXJjZUNvZGVJbmZvEkQKCGxvY2F0aW9uGAEgAygLMiguZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uUghsb2NhdGlvbhrOAQoITG9jYXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSFgoEc3BhbhgCIAMoBUICEAFSBHNwYW4SKQoQbGVhZGluZ19jb21tZW50cxgDIAEoCVIPbGVhZGluZ0NvbW1lbnRzEisKEXRyYWlsaW5nX2NvbW1lbnRzGAQgASgJUhB0cmFpbGluZ0NvbW1lbnRzEjoKGWxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMYBiADKAlSF2xlYWRpbmdEZXRhY2hlZENvbW1lbnRzItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACKqcCCgdFZGl0aW9uEhMKD0VESVRJT05fVU5LTk9XThAAEhMKDkVESVRJT05fTEVHQUNZEIQHEhMKDkVESVRJT05fUFJPVE8yEOYHEhMKDkVESVRJT05fUFJPVE8zEOcHEhEKDEVESVRJT05fMjAyMxDoBxIRCgxFRElUSU9OXzIwMjQQ6QcSFwoTRURJVElPTl8xX1RFU1RfT05MWRABEhcKE0VESVRJT05fMl9URVNUX09OTFkQAhIdChdFRElUSU9OXzk5OTk3X1RFU1RfT05MWRCdjQYSHQoXRURJVElPTl85OTk5OF9URVNUX09OTFkQno0GEh0KF0VESVRJT05fOTk5OTlfVEVTVF9PTkxZEJ+NBhITCgtFRElUSU9OX01BWBD/////B0J+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCt0CCk53ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9ldmVudF9ncm91cF9tZXRhZGF0YV9kZXNjcmlwdG9yX2RldGFpbHMucHJvdG8SIHdmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byKRAQojRXZlbnRHcm91cE1ldGFkYXRhRGVzY3JpcHRvckRldGFpbHMSHwoLYXBpX3ZlcnNpb24YASABKAlSCmFwaVZlcnNpb24SSQoOZGVzY3JpcHRvcl9zZXQYAiABKAsyIi5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXRSDWRlc2NyaXB0b3JTZXRCKwonb3JnLndmYW5ldC5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tUAFiBnByb3RvMwrRAQo1d2ZhL21lYXN1cmVtZW50L2ludGVybmFsL2tpbmdkb20vZXZlbnRfdGVtcGxhdGUucHJvdG8SIHdmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tIkEKDUV2ZW50VGVtcGxhdGUSMAoUZnVsbHlfcXVhbGlmaWVkX3R5cGUYASABKAlSEmZ1bGx5UXVhbGlmaWVkVHlwZUIrCidvcmcud2ZhbmV0Lm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb21QAWIGcHJvdG8zCsAGCjp3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9ldmVudF9ncm91cF9kZXRhaWxzLnByb3RvEiB3ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbRoaZ29vZ2xlL3R5cGUvaW50ZXJ2YWwucHJvdG8aNXdmYS9tZWFzdXJlbWVudC9pbnRlcm5hbC9raW5nZG9tL2V2ZW50X3RlbXBsYXRlLnByb3RvItcEChFFdmVudEdyb3VwRGV0YWlscxIfCgthcGlfdmVyc2lvbhgBIAEoCVIKYXBpVmVyc2lvbhJFCh9tZWFzdXJlbWVudF9jb25zdW1lcl9wdWJsaWNfa2V5GAIgASgMUhxtZWFzdXJlbWVudENvbnN1bWVyUHVibGljS2V5ElwKKW1lYXN1cmVtZW50X2NvbnN1bWVyX3B1YmxpY19rZXlfc2lnbmF0dXJlGAMgASgMQgIYAVIlbWVhc3VyZW1lbnRDb25zdW1lclB1YmxpY0tleVNpZ25hdHVyZRJ2CjdtZWFzdXJlbWVudF9jb25zdW1lcl9wdWJsaWNfa2V5X3NpZ25hdHVyZV9hbGdvcml0aG1fb2lkGAcgASgJQgIYAVIxbWVhc3VyZW1lbnRDb25zdW1lclB1YmxpY0tleVNpZ25hdHVyZUFsZ29yaXRobU9pZBImCg92aWRfbW9kZWxfbGluZXMYBCADKAlSDXZpZE1vZGVsTGluZXMSWAoPZXZlbnRfdGVtcGxhdGVzGAUgAygLMi8ud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uRXZlbnRUZW1wbGF0ZVIOZXZlbnRUZW1wbGF0ZXMSLQoSZW5jcnlwdGVkX21ldGFkYXRhGAYgASgMUhFlbmNyeXB0ZWRNZXRhZGF0YRJTChpkYXRhX2F2YWlsYWJpbGl0eV9pbnRlcnZhbBgIIAEoCzIVLmdvb2dsZS50eXBlLkludGVydmFsUhhkYXRhQXZhaWxhYmlsaXR5SW50ZXJ2YWxCKwonb3JnLndmYW5ldC5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tUAFiBnByb3RvMwrFBApEd2ZhL21lYXN1cmVtZW50L2ludGVybmFsL2tpbmdkb20vZXhjaGFuZ2Vfc3RlcF9hdHRlbXB0X2RldGFpbHMucHJvdG8SIHdmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tGh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvIoQDChpFeGNoYW5nZVN0ZXBBdHRlbXB0RGV0YWlscxJxChFkZWJ1Z19sb2dfZW50cmllcxgEIAMoCzJFLndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLkV4Y2hhbmdlU3RlcEF0dGVtcHREZXRhaWxzLkRlYnVnTG9nUg9kZWJ1Z0xvZ0VudHJpZXMSJQoOc2hhcmVkX291dHB1dHMYBSADKAxSDXNoYXJlZE91dHB1dHMSOQoKc3RhcnRfdGltZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSCXN0YXJ0VGltZRI7Cgt1cGRhdGVfdGltZRgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSCnVwZGF0ZVRpbWUaVAoIRGVidWdMb2cSLgoEdGltZRgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSBHRpbWUSGAoHbWVzc2FnZRgCIAEoCVIHbWVzc2FnZUIrCidvcmcud2ZhbmV0Lm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb21QAWIGcHJvdG8zCvADCjh3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9leGNoYW5nZV93b3JrZmxvdy5wcm90bxIgd2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20i3AIKEEV4Y2hhbmdlV29ya2Zsb3cSTQoFc3RlcHMYASADKAsyNy53ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbS5FeGNoYW5nZVdvcmtmbG93LlN0ZXBSBXN0ZXBzGrEBCgRTdGVwEh0KCnN0ZXBfaW5kZXgYASABKAVSCXN0ZXBJbmRleBI6ChlwcmVyZXF1aXNpdGVfc3RlcF9pbmRpY2VzGAMgAygFUhdwcmVyZXF1aXNpdGVTdGVwSW5kaWNlcxJOCgVwYXJ0eRgCIAEoDjI4LndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLkV4Y2hhbmdlV29ya2Zsb3cuUGFydHlSBXBhcnR5IkUKBVBhcnR5EhUKEVBBUlRZX1VOU1BFQ0lGSUVEEAASEgoOTU9ERUxfUFJPVklERVIQARIRCg1EQVRBX1BST1ZJREVSEAJCKwonb3JnLndmYW5ldC5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tUAFiBnByb3RvMwrWAwpBd2ZhL21lYXN1cmVtZW50L2ludGVybmFsL2tpbmdkb20vcmVjdXJyaW5nX2V4Y2hhbmdlX2RldGFpbHMucHJvdG8SIHdmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tGjh3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9leGNoYW5nZV93b3JrZmxvdy5wcm90byL/AQoYUmVjdXJyaW5nRXhjaGFuZ2VEZXRhaWxzEiMKDWNyb25fc2NoZWR1bGUYASABKAlSDGNyb25TY2hlZHVsZRJfChFleGNoYW5nZV93b3JrZmxvdxgCIAEoCzIyLndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLkV4Y2hhbmdlV29ya2Zsb3dSEGV4Y2hhbmdlV29ya2Zsb3cSPAoaZXh0ZXJuYWxfZXhjaGFuZ2Vfd29ya2Zsb3cYAyABKAxSGGV4dGVybmFsRXhjaGFuZ2VXb3JrZmxvdxIfCgthcGlfdmVyc2lvbhgEIAEoCVIKYXBpVmVyc2lvbkIrCidvcmcud2ZhbmV0Lm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb21QAWIGcHJvdG8zCtgDCjp3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9yZXF1aXNpdGlvbl9yZWZ1c2FsLnByb3RvEiB3ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbSLCAgoSUmVxdWlzaXRpb25SZWZ1c2FsEmgKDWp1c3RpZmljYXRpb24YASABKA4yQi53ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbS5SZXF1aXNpdGlvblJlZnVzYWwuSnVzdGlmaWNhdGlvblINanVzdGlmaWNhdGlvbhIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlIqcBCg1KdXN0aWZpY2F0aW9uEh0KGUpVU1RJRklDQVRJT05fVU5TUEVDSUZJRUQQABIaChZDT05TRU5UX1NJR05BTF9JTlZBTElEEAESGQoVU1BFQ0lGSUNBVElPTl9JTlZBTElEEAISHwobSU5TVUZGSUNJRU5UX1BSSVZBQ1lfQlVER0VUEAMSEQoNVU5GVUxGSUxMQUJMRRAEEgwKCERFQ0xJTkVEEAVCKwonb3JnLndmYW5ldC5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tUAFiBnByb3RvMwq4Bgo6d2ZhL21lYXN1cmVtZW50L2ludGVybmFsL2tpbmdkb20vcmVxdWlzaXRpb25fZGV0YWlscy5wcm90bxIgd2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20aOndmYS9tZWFzdXJlbWVudC9pbnRlcm5hbC9raW5nZG9tL3JlcXVpc2l0aW9uX3JlZnVzYWwucHJvdG8i5gQKElJlcXVpc2l0aW9uRGV0YWlscxI3ChhkYXRhX3Byb3ZpZGVyX3B1YmxpY19rZXkYASABKAxSFWRhdGFQcm92aWRlclB1YmxpY0tleRJOCiJkYXRhX3Byb3ZpZGVyX3B1YmxpY19rZXlfc2lnbmF0dXJlGAIgASgMQgIYAVIeZGF0YVByb3ZpZGVyUHVibGljS2V5U2lnbmF0dXJlEmgKMGRhdGFfcHJvdmlkZXJfcHVibGljX2tleV9zaWduYXR1cmVfYWxnb3JpdGhtX29pZBgIIAEoCUICGAFSKmRhdGFQcm92aWRlclB1YmxpY0tleVNpZ25hdHVyZUFsZ29yaXRobU9pZBI8ChplbmNyeXB0ZWRfcmVxdWlzaXRpb25fc3BlYxgDIAEoDFIYZW5jcnlwdGVkUmVxdWlzaXRpb25TcGVjEh0KCm5vbmNlX2hhc2gYBCABKAxSCW5vbmNlSGFzaBIUCgVub25jZRgFIAEoBlIFbm9uY2USTgoHcmVmdXNhbBgGIAEoCzI0LndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLlJlcXVpc2l0aW9uUmVmdXNhbFIHcmVmdXNhbBIlCg5lbmNyeXB0ZWRfZGF0YRgHIAEoDFINZW5jcnlwdGVkRGF0YRI7ChplbmNyeXB0ZWRfZGF0YV9hcGlfdmVyc2lvbhgJIAEoCVIXZW5jcnlwdGVkRGF0YUFwaVZlcnNpb24SNgoXZXh0ZXJuYWxfY2VydGlmaWNhdGVfaWQYCiABKAZSFWV4dGVybmFsQ2VydGlmaWNhdGVJZEIrCidvcmcud2ZhbmV0Lm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb21QAWIGcHJvdG8zCvkCCkN3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9tZWFzdXJlbWVudF9jb25zdW1lcl9kZXRhaWxzLnByb3RvEiB3ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbSLaAQoaTWVhc3VyZW1lbnRDb25zdW1lckRldGFpbHMSHwoLYXBpX3ZlcnNpb24YASABKAlSCmFwaVZlcnNpb24SHQoKcHVibGljX2tleRgCIAEoDFIJcHVibGljS2V5EjAKFHB1YmxpY19rZXlfc2lnbmF0dXJlGAMgASgMUhJwdWJsaWNLZXlTaWduYXR1cmUSSgoicHVibGljX2tleV9zaWduYXR1cmVfYWxnb3JpdGhtX29pZBgEIAEoCVIecHVibGljS2V5U2lnbmF0dXJlQWxnb3JpdGhtT2lkQisKJ29yZy53ZmFuZXQubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbVABYgZwcm90bzMKpQMKQndmYS9tZWFzdXJlbWVudC9pbnRlcm5hbC9raW5nZG9tL21lYXN1cmVtZW50X2xvZ19lbnRyeV9lcnJvci5wcm90bxIgd2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20aH2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8i5gEKGE1lYXN1cmVtZW50TG9nRW50cnlFcnJvchJTCgR0eXBlGAEgASgOMj8ud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uTWVhc3VyZW1lbnRMb2dFbnRyeUVycm9yLlR5cGVSBHR5cGUSOQoKZXJyb3JfdGltZRgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSCWVycm9yVGltZSI6CgRUeXBlEhQKEFRZUEVfVU5TUEVDSUZJRUQQABINCglUUkFOU0lFTlQQARINCglQRVJNQU5FTlQQAkIrCidvcmcud2ZhbmV0Lm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb21QAWIGcHJvdG8zCvMCCkR3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9tZWFzdXJlbWVudF9sb2dfZW50cnlfZGV0YWlscy5wcm90bxIgd2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20aQndmYS9tZWFzdXJlbWVudC9pbnRlcm5hbC9raW5nZG9tL21lYXN1cmVtZW50X2xvZ19lbnRyeV9lcnJvci5wcm90byKPAQoaTWVhc3VyZW1lbnRMb2dFbnRyeURldGFpbHMSHwoLbG9nX21lc3NhZ2UYASABKAlSCmxvZ01lc3NhZ2USUAoFZXJyb3IYAiABKAsyOi53ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbS5NZWFzdXJlbWVudExvZ0VudHJ5RXJyb3JSBWVycm9yQisKJ29yZy53ZmFuZXQubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbVABYgZwcm90bzMK4QEKO3dmYS9tZWFzdXJlbWVudC9pbnRlcm5hbC9raW5nZG9tL2RpZmZlcmVudGlhbF9wcml2YWN5LnByb3RvEiB3ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbSJLChlEaWZmZXJlbnRpYWxQcml2YWN5UGFyYW1zEhgKB2Vwc2lsb24YASABKAFSB2Vwc2lsb24SFAoFZGVsdGEYAiABKAFSBWRlbHRhQisKJ29yZy53ZmFuZXQubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbVABYgZwcm90bzMK8AYKPHdmYS9tZWFzdXJlbWVudC9pbnRlcm5hbC9raW5nZG9tL2R1Y2h5X3Byb3RvY29sX2NvbmZpZy5wcm90bxIgd2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20aO3dmYS9tZWFzdXJlbWVudC9pbnRlcm5hbC9raW5nZG9tL2RpZmZlcmVudGlhbF9wcml2YWN5LnByb3RvIpsFChNEdWNoeVByb3RvY29sQ29uZmlnEnMKEWxpcXVpZF9sZWdpb25zX3YyGAEgASgLMkUud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uRHVjaHlQcm90b2NvbENvbmZpZy5MaXF1aWRMZWdpb25zVjJIAFIPbGlxdWlkTGVnaW9uc1YyEocBChxyZWFjaF9vbmx5X2xpcXVpZF9sZWdpb25zX3YyGAIgASgLMkUud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uRHVjaHlQcm90b2NvbENvbmZpZy5MaXF1aWRMZWdpb25zVjJIAFIYcmVhY2hPbmx5TGlxdWlkTGVnaW9uc1YyGvgCCg9MaXF1aWRMZWdpb25zVjISawoJbXBjX25vaXNlGAEgASgLMk4ud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uRHVjaHlQcm90b2NvbENvbmZpZy5MaXF1aWRMZWdpb25zVjIuTXBjTm9pc2VSCG1wY05vaXNlGvcBCghNcGNOb2lzZRJzChdibGluZGVkX2hpc3RvZ3JhbV9ub2lzZRgBIAEoCzI7LndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLkRpZmZlcmVudGlhbFByaXZhY3lQYXJhbXNSFWJsaW5kZWRIaXN0b2dyYW1Ob2lzZRJ2Chlub2lzZV9mb3JfcHVibGlzaGVyX25vaXNlGAIgASgLMjsud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uRGlmZmVyZW50aWFsUHJpdmFjeVBhcmFtc1IWbm9pc2VGb3JQdWJsaXNoZXJOb2lzZUIKCghwcm90b2NvbEIrCidvcmcud2ZhbmV0Lm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb21QAWIGcHJvdG8zCpEDCjp3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9tZWFzdXJlbWVudF9mYWlsdXJlLnByb3RvEiB3ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbSL7AQoSTWVhc3VyZW1lbnRGYWlsdXJlElMKBnJlYXNvbhgBIAEoDjI7LndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLk1lYXN1cmVtZW50RmFpbHVyZS5SZWFzb25SBnJlYXNvbhIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlInYKBlJlYXNvbhIWChJSRUFTT05fVU5TUEVDSUZJRUQQABIXChNDRVJUSUZJQ0FURV9SRVZPS0VEEAESFwoTUkVRVUlTSVRJT05fUkVGVVNFRBACEiIKHkNPTVBVVEFUSU9OX1BBUlRJQ0lQQU5UX0ZBSUxFRBADQisKJ29yZy53ZmFuZXQubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbVABYgZwcm90bzMK6RcKNndmYS9tZWFzdXJlbWVudC9pbnRlcm5hbC9raW5nZG9tL3Byb3RvY29sX2NvbmZpZy5wcm90bxIgd2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20aO3dmYS9tZWFzdXJlbWVudC9pbnRlcm5hbC9raW5nZG9tL2RpZmZlcmVudGlhbF9wcml2YWN5LnByb3RvIooVCg5Qcm90b2NvbENvbmZpZxI9ChtleHRlcm5hbF9wcm90b2NvbF9jb25maWdfaWQYASABKAlSGGV4dGVybmFsUHJvdG9jb2xDb25maWdJZBJuChFsaXF1aWRfbGVnaW9uc192MhgDIAEoCzJALndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLlByb3RvY29sQ29uZmlnLkxpcXVpZExlZ2lvbnNWMkgAUg9saXF1aWRMZWdpb25zVjISggEKHHJlYWNoX29ubHlfbGlxdWlkX2xlZ2lvbnNfdjIYBCABKAsyQC53ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbS5Qcm90b2NvbENvbmZpZy5MaXF1aWRMZWdpb25zVjJIAFIYcmVhY2hPbmx5TGlxdWlkTGVnaW9uc1YyElEKBmRpcmVjdBgFIAEoCzI3LndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLlByb3RvY29sQ29uZmlnLkRpcmVjdEgAUgZkaXJlY3QSkAEKHWhvbmVzdF9tYWpvcml0eV9zaGFyZV9zaHVmZmxlGAYgASgLMksud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uUHJvdG9jb2xDb25maWcuSG9uZXN0TWFqb3JpdHlTaGFyZVNodWZmbGVIAFIaaG9uZXN0TWFqb3JpdHlTaGFyZVNodWZmbGUahwoKBkRpcmVjdBJqChBub2lzZV9tZWNoYW5pc21zGAEgAygOMj8ud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uUHJvdG9jb2xDb25maWcuTm9pc2VNZWNoYW5pc21SD25vaXNlTWVjaGFuaXNtcxKLAQoZY3VzdG9tX2RpcmVjdF9tZXRob2RvbG9neRgCIAEoCzJPLndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLlByb3RvY29sQ29uZmlnLkRpcmVjdC5DdXN0b21EaXJlY3RNZXRob2RvbG9neVIXY3VzdG9tRGlyZWN0TWV0aG9kb2xvZ3kSlAEKHGRldGVybWluaXN0aWNfY291bnRfZGlzdGluY3QYAyABKAsyUi53ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbS5Qcm90b2NvbENvbmZpZy5EaXJlY3QuRGV0ZXJtaW5pc3RpY0NvdW50RGlzdGluY3RSGmRldGVybWluaXN0aWNDb3VudERpc3RpbmN0EpABChpkZXRlcm1pbmlzdGljX2Rpc3RyaWJ1dGlvbhgEIAEoCzJRLndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLlByb3RvY29sQ29uZmlnLkRpcmVjdC5EZXRlcm1pbmlzdGljRGlzdHJpYnV0aW9uUhlkZXRlcm1pbmlzdGljRGlzdHJpYnV0aW9uEnsKE2RldGVybWluaXN0aWNfY291bnQYBSABKAsySi53ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbS5Qcm90b2NvbENvbmZpZy5EaXJlY3QuRGV0ZXJtaW5pc3RpY0NvdW50UhJkZXRlcm1pbmlzdGljQ291bnQSdQoRZGV0ZXJtaW5pc3RpY19zdW0YBiABKAsySC53ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbS5Qcm90b2NvbENvbmZpZy5EaXJlY3QuRGV0ZXJtaW5pc3RpY1N1bVIQZGV0ZXJtaW5pc3RpY1N1bRKVAQodbGlxdWlkX2xlZ2lvbnNfY291bnRfZGlzdGluY3QYByABKAsyUi53ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbS5Qcm90b2NvbENvbmZpZy5EaXJlY3QuTGlxdWlkTGVnaW9uc0NvdW50RGlzdGluY3RSGmxpcXVpZExlZ2lvbnNDb3VudERpc3RpbmN0EpEBChtsaXF1aWRfbGVnaW9uc19kaXN0cmlidXRpb24YCCABKAsyUS53ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbS5Qcm90b2NvbENvbmZpZy5EaXJlY3QuTGlxdWlkTGVnaW9uc0Rpc3RyaWJ1dGlvblIZbGlxdWlkTGVnaW9uc0Rpc3RyaWJ1dGlvbhoZChdDdXN0b21EaXJlY3RNZXRob2RvbG9neRocChpEZXRlcm1pbmlzdGljQ291bnREaXN0aW5jdBobChlEZXRlcm1pbmlzdGljRGlzdHJpYnV0aW9uGhQKEkRldGVybWluaXN0aWNDb3VudBoSChBEZXRlcm1pbmlzdGljU3VtGhsKGUxpcXVpZExlZ2lvbnNEaXN0cmlidXRpb24aHAoaTGlxdWlkTGVnaW9uc0NvdW50RGlzdGluY3QapwMKD0xpcXVpZExlZ2lvbnNWMhJgCg1za2V0Y2hfcGFyYW1zGAEgASgLMjsud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uTGlxdWlkTGVnaW9uc1NrZXRjaFBhcmFtc1IMc2tldGNoUGFyYW1zEmsKE2RhdGFfcHJvdmlkZXJfbm9pc2UYAiABKAsyOy53ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbS5EaWZmZXJlbnRpYWxQcml2YWN5UGFyYW1zUhFkYXRhUHJvdmlkZXJOb2lzZRIqChFlbGxpcHRpY19jdXJ2ZV9pZBgDIAEoBVIPZWxsaXB0aWNDdXJ2ZUlkEi8KEW1heGltdW1fZnJlcXVlbmN5GAQgASgFQgIYAVIQbWF4aW11bUZyZXF1ZW5jeRJoCg9ub2lzZV9tZWNoYW5pc20YBSABKA4yPy53ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbS5Qcm90b2NvbENvbmZpZy5Ob2lzZU1lY2hhbmlzbVIObm9pc2VNZWNoYW5pc20aggIKGkhvbmVzdE1ham9yaXR5U2hhcmVTaHVmZmxlEmgKD25vaXNlX21lY2hhbmlzbRgCIAEoDjI/LndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLlByb3RvY29sQ29uZmlnLk5vaXNlTWVjaGFuaXNtUg5ub2lzZU1lY2hhbmlzbRJGCiByZWFjaF9hbmRfZnJlcXVlbmN5X3JpbmdfbW9kdWx1cxgDIAEoBVIccmVhY2hBbmRGcmVxdWVuY3lSaW5nTW9kdWx1cxIsChJyZWFjaF9yaW5nX21vZHVsdXMYBCABKAVSEHJlYWNoUmluZ01vZHVsdXNKBAgBEAIikgEKDk5vaXNlTWVjaGFuaXNtEh8KG05PSVNFX01FQ0hBTklTTV9VTlNQRUNJRklFRBAAEggKBE5PTkUQAxINCglHRU9NRVRSSUMQARIVChFESVNDUkVURV9HQVVTU0lBThACEhYKEkNPTlRJTlVPVVNfTEFQTEFDRRAEEhcKE0NPTlRJTlVPVVNfR0FVU1NJQU4QBUIKCghwcm90b2NvbEoECAIQAyKNAQoZTGlxdWlkTGVnaW9uc1NrZXRjaFBhcmFtcxIdCgpkZWNheV9yYXRlGAEgASgBUglkZWNheVJhdGUSGQoIbWF4X3NpemUYAiABKANSB21heFNpemUSNgoXc2FtcGxpbmdfaW5kaWNhdG9yX3NpemUYAyABKANSFXNhbXBsaW5nSW5kaWNhdG9yU2l6ZUIrCidvcmcud2ZhbmV0Lm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb21QAWIGcHJvdG8zCtQGCjp3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9tZWFzdXJlbWVudF9kZXRhaWxzLnByb3RvEiB3ZmEubWVhc3VyZW1lbnQuaW50ZXJuYWwua2luZ2RvbRo8d2ZhL21lYXN1cmVtZW50L2ludGVybmFsL2tpbmdkb20vZHVjaHlfcHJvdG9jb2xfY29uZmlnLnByb3RvGjp3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9tZWFzdXJlbWVudF9mYWlsdXJlLnByb3RvGjZ3ZmEvbWVhc3VyZW1lbnQvaW50ZXJuYWwva2luZ2RvbS9wcm90b2NvbF9jb25maWcucHJvdG8ijAQKEk1lYXN1cmVtZW50RGV0YWlscxIfCgthcGlfdmVyc2lvbhgBIAEoCVIKYXBpVmVyc2lvbhIpChBtZWFzdXJlbWVudF9zcGVjGAIgASgMUg9tZWFzdXJlbWVudFNwZWMSPAoabWVhc3VyZW1lbnRfc3BlY19zaWduYXR1cmUYAyABKAxSGG1lYXN1cmVtZW50U3BlY1NpZ25hdHVyZRJWCihtZWFzdXJlbWVudF9zcGVjX3NpZ25hdHVyZV9hbGdvcml0aG1fb2lkGAkgASgJUiRtZWFzdXJlbWVudFNwZWNTaWduYXR1cmVBbGdvcml0aG1PaWQSWQoPcHJvdG9jb2xfY29uZmlnGAYgASgLMjAud2ZhLm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb20uUHJvdG9jb2xDb25maWdSDnByb3RvY29sQ29uZmlnEmkKFWR1Y2h5X3Byb3RvY29sX2NvbmZpZxgHIAEoCzI1LndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLkR1Y2h5UHJvdG9jb2xDb25maWdSE2R1Y2h5UHJvdG9jb2xDb25maWcSTgoHZmFpbHVyZRgIIAEoCzI0LndmYS5tZWFzdXJlbWVudC5pbnRlcm5hbC5raW5nZG9tLk1lYXN1cmVtZW50RmFpbHVyZVIHZmFpbHVyZUIrCidvcmcud2ZhbmV0Lm1lYXN1cmVtZW50LmludGVybmFsLmtpbmdkb21QAWIGcHJvdG8z'; + +START BATCH DDL; + +-- Create the initial proto bundle with all types defined in the FileDescriptorSet. +CREATE PROTO BUNDLE ( + `wfa.measurement.internal.kingdom.CertificateDetails`, + `wfa.measurement.internal.kingdom.LiquidLegionsV2Params`, + `wfa.measurement.internal.kingdom.HonestMajorityShareShuffleParams`, + `wfa.measurement.internal.kingdom.ComputationParticipantDetails`, + `wfa.measurement.internal.kingdom.DataProviderCapabilities`, + `google.protobuf.Timestamp`, + `google.type.Interval`, + `wfa.measurement.internal.kingdom.DataProviderDetails`, + `wfa.measurement.internal.kingdom.DuchyMeasurementLogEntryStageAttempt`, + `wfa.measurement.internal.kingdom.DuchyMeasurementLogEntryDetails`, + `wfa.measurement.internal.kingdom.ExchangeDetails`, + `google.protobuf.Edition`, + `google.protobuf.FileDescriptorSet`, + `google.protobuf.FileDescriptorProto`, + `google.protobuf.DescriptorProto`, + `google.protobuf.ExtensionRangeOptions`, + `google.protobuf.FieldDescriptorProto`, + `google.protobuf.OneofDescriptorProto`, + `google.protobuf.EnumDescriptorProto`, + `google.protobuf.EnumValueDescriptorProto`, + `google.protobuf.ServiceDescriptorProto`, + `google.protobuf.MethodDescriptorProto`, + `google.protobuf.FileOptions`, + `google.protobuf.MessageOptions`, + `google.protobuf.FieldOptions`, + `google.protobuf.OneofOptions`, + `google.protobuf.EnumOptions`, + `google.protobuf.EnumValueOptions`, + `google.protobuf.ServiceOptions`, + `google.protobuf.MethodOptions`, + `google.protobuf.UninterpretedOption`, + `google.protobuf.FeatureSet`, + `google.protobuf.FeatureSetDefaults`, + `google.protobuf.SourceCodeInfo`, + `google.protobuf.GeneratedCodeInfo`, + `google.protobuf.DescriptorProto.ExtensionRange`, + `google.protobuf.DescriptorProto.ReservedRange`, + `google.protobuf.ExtensionRangeOptions.VerificationState`, + `google.protobuf.ExtensionRangeOptions.Declaration`, + `google.protobuf.FieldDescriptorProto.Type`, + `google.protobuf.FieldDescriptorProto.Label`, + `google.protobuf.EnumDescriptorProto.EnumReservedRange`, + `google.protobuf.FileOptions.OptimizeMode`, + `google.protobuf.FieldOptions.CType`, + `google.protobuf.FieldOptions.JSType`, + `google.protobuf.FieldOptions.OptionRetention`, + `google.protobuf.FieldOptions.OptionTargetType`, + `google.protobuf.FieldOptions.EditionDefault`, + `google.protobuf.FieldOptions.FeatureSupport`, + `google.protobuf.MethodOptions.IdempotencyLevel`, + `google.protobuf.UninterpretedOption.NamePart`, + `google.protobuf.FeatureSet.FieldPresence`, + `google.protobuf.FeatureSet.EnumType`, + `google.protobuf.FeatureSet.RepeatedFieldEncoding`, + `google.protobuf.FeatureSet.Utf8Validation`, + `google.protobuf.FeatureSet.MessageEncoding`, + `google.protobuf.FeatureSet.JsonFormat`, + `google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault`, + `google.protobuf.SourceCodeInfo.Location`, + `google.protobuf.GeneratedCodeInfo.Annotation`, + `google.protobuf.GeneratedCodeInfo.Annotation.Semantic`, + `wfa.measurement.internal.kingdom.EventGroupMetadataDescriptorDetails`, + `wfa.measurement.internal.kingdom.EventTemplate`, + `wfa.measurement.internal.kingdom.EventGroupDetails`, + `wfa.measurement.internal.kingdom.ExchangeStepAttemptDetails`, + `wfa.measurement.internal.kingdom.ExchangeStepAttemptDetails.DebugLog`, + `wfa.measurement.internal.kingdom.ExchangeWorkflow`, + `wfa.measurement.internal.kingdom.ExchangeWorkflow.Party`, + `wfa.measurement.internal.kingdom.ExchangeWorkflow.Step`, + `wfa.measurement.internal.kingdom.RecurringExchangeDetails`, + `wfa.measurement.internal.kingdom.RequisitionRefusal`, + `wfa.measurement.internal.kingdom.RequisitionRefusal.Justification`, + `wfa.measurement.internal.kingdom.RequisitionDetails`, + `wfa.measurement.internal.kingdom.MeasurementConsumerDetails`, + `wfa.measurement.internal.kingdom.MeasurementLogEntryError`, + `wfa.measurement.internal.kingdom.MeasurementLogEntryError.Type`, + `wfa.measurement.internal.kingdom.MeasurementLogEntryDetails`, + `wfa.measurement.internal.kingdom.DifferentialPrivacyParams`, + `wfa.measurement.internal.kingdom.DuchyProtocolConfig`, + `wfa.measurement.internal.kingdom.DuchyProtocolConfig.LiquidLegionsV2`, + `wfa.measurement.internal.kingdom.DuchyProtocolConfig.LiquidLegionsV2.MpcNoise`, + `wfa.measurement.internal.kingdom.MeasurementFailure`, + `wfa.measurement.internal.kingdom.MeasurementFailure.Reason`, + `wfa.measurement.internal.kingdom.ProtocolConfig`, + `wfa.measurement.internal.kingdom.LiquidLegionsSketchParams`, + `wfa.measurement.internal.kingdom.ProtocolConfig.NoiseMechanism`, + `wfa.measurement.internal.kingdom.ProtocolConfig.Direct`, + `wfa.measurement.internal.kingdom.ProtocolConfig.Direct.CustomDirectMethodology`, + `wfa.measurement.internal.kingdom.ProtocolConfig.Direct.DeterministicCountDistinct`, + `wfa.measurement.internal.kingdom.ProtocolConfig.Direct.DeterministicDistribution`, + `wfa.measurement.internal.kingdom.ProtocolConfig.Direct.DeterministicCount`, + `wfa.measurement.internal.kingdom.ProtocolConfig.Direct.DeterministicSum`, + `wfa.measurement.internal.kingdom.ProtocolConfig.Direct.LiquidLegionsDistribution`, + `wfa.measurement.internal.kingdom.ProtocolConfig.Direct.LiquidLegionsCountDistinct`, + `wfa.measurement.internal.kingdom.ProtocolConfig.LiquidLegionsV2`, + `wfa.measurement.internal.kingdom.ProtocolConfig.HonestMajorityShareShuffle`, + `wfa.measurement.internal.kingdom.MeasurementDetails`, +); + +ALTER TABLE Certificates +ALTER COLUMN CertificateDetails `wfa.measurement.internal.kingdom.CertificateDetails`; + +ALTER TABLE ComputationParticipants +ALTER COLUMN ParticipantDetails `wfa.measurement.internal.kingdom.ComputationParticipantDetails` NOT NULL; + +ALTER TABLE DataProviders +ALTER COLUMN DataProviderDetails `wfa.measurement.internal.kingdom.DataProviderDetails` NOT NULL; + +ALTER TABLE DuchyMeasurementLogEntries +ALTER COLUMN DuchyMeasurementLogDetails `wfa.measurement.internal.kingdom.DuchyMeasurementLogEntryDetails` NOT NULL; + +ALTER TABLE EventGroupMetadataDescriptors +ALTER COLUMN DescriptorDetails `wfa.measurement.internal.kingdom.EventGroupMetadataDescriptorDetails` NOT NULL; + +ALTER TABLE EventGroups +ALTER COLUMN EventGroupDetails `wfa.measurement.internal.kingdom.EventGroupDetails`; + +ALTER TABLE ExchangeStepAttempts +ALTER COLUMN ExchangeStepAttemptDetails `wfa.measurement.internal.kingdom.ExchangeStepAttemptDetails` NOT NULL; + +ALTER TABLE Exchanges +ALTER COLUMN ExchangeDetails `wfa.measurement.internal.kingdom.ExchangeDetails` NOT NULL; + +ALTER TABLE RecurringExchanges +ALTER COLUMN RecurringExchangeDetails `wfa.measurement.internal.kingdom.RecurringExchangeDetails` NOT NULL; + +ALTER TABLE Requisitions +ALTER COLUMN RequisitionDetails `wfa.measurement.internal.kingdom.RequisitionDetails`; + +ALTER TABLE MeasurementConsumers +ALTER COLUMN MeasurementConsumerDetails `wfa.measurement.internal.kingdom.MeasurementConsumerDetails` NOT NULL; + +ALTER TABLE MeasurementLogEntries +ALTER COLUMN MeasurementLogDetails `wfa.measurement.internal.kingdom.MeasurementLogEntryDetails` NOT NULL; + +ALTER TABLE Measurements +ALTER COLUMN MeasurementDetails `wfa.measurement.internal.kingdom.MeasurementDetails` NOT NULL; + +RUN BATCH; \ No newline at end of file