From 675e56b06b4f99fb38900823c9e5999d727e8bff Mon Sep 17 00:00:00 2001 From: Alessandro Yuichi Okimoto Date: Tue, 30 Jan 2024 17:51:51 +0900 Subject: [PATCH 1/3] chore: add proto stopped by property Signed-off-by: Alessandro Yuichi Okimoto --- .../bucketeer/charts/web-gateway/values.yaml | 47 ------------------- 1 file changed, 47 deletions(-) diff --git a/manifests/bucketeer/charts/web-gateway/values.yaml b/manifests/bucketeer/charts/web-gateway/values.yaml index 7210d1e6c9..cc213b92d8 100644 --- a/manifests/bucketeer/charts/web-gateway/values.yaml +++ b/manifests/bucketeer/charts/web-gateway/values.yaml @@ -1,21 +1,4 @@ -fullnameOverride: "web-gateway" -namespace: default -tls: - bucketeerJP: - secrets: - cert: - key: - service: - secret: - cert: - key: envoy: - image: - repository: ghcr.io/bucketeer-io/bucketeer-envoy - tag: v1.26.2 - pullPolicy: IfNotPresent - serviceCluster: bucketeer - adminPort: 8001 eventcounterDescriptor: CrEBCiJwcm90by9ldmVudGNvdW50ZXIvaGlzdG9ncmFtLnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyIjMKCUhpc3RvZ3JhbRISCgRoaXN0GAEgAygDUgRoaXN0EhIKBGJpbnMYAiADKAFSBGJpbnNCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50Y291bnRlcmIGcHJvdG8zCqADCi1wcm90by9ldmVudGNvdW50ZXIvZGlzdHJpYnV0aW9uX3N1bW1hcnkucHJvdG8SFmJ1Y2tldGVlci5ldmVudGNvdW50ZXIaInByb3RvL2V2ZW50Y291bnRlci9oaXN0b2dyYW0ucHJvdG8i8gEKE0Rpc3RyaWJ1dGlvblN1bW1hcnkSEgoEbWVhbhgBIAEoAVIEbWVhbhIOCgJzZBgCIAEoAVICc2QSEgoEcmhhdBgDIAEoAVIEcmhhdBI/CgloaXN0b2dyYW0YBCABKAsyIS5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkhpc3RvZ3JhbVIJaGlzdG9ncmFtEhYKBm1lZGlhbhgFIAEoAVIGbWVkaWFuEiQKDXBlcmNlbnRpbGUwMjUYBiABKAFSDXBlcmNlbnRpbGUwMjUSJAoNcGVyY2VudGlsZTk3NRgHIAEoAVINcGVyY2VudGlsZTk3NUI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMK0QMKKHByb3RvL2V2ZW50Y291bnRlci92YXJpYXRpb25fY291bnQucHJvdG8SFmJ1Y2tldGVlci5ldmVudGNvdW50ZXIizAIKDlZhcmlhdGlvbkNvdW50EiEKDHZhcmlhdGlvbl9pZBgBIAEoCVILdmFyaWF0aW9uSWQSHQoKdXNlcl9jb3VudBgCIAEoA1IJdXNlckNvdW50Eh8KC2V2ZW50X2NvdW50GAMgASgDUgpldmVudENvdW50EhsKCXZhbHVlX3N1bRgEIAEoAVIIdmFsdWVTdW0SHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0EicKD3ZhcmlhdGlvbl92YWx1ZRgGIAEoCVIOdmFyaWF0aW9uVmFsdWUSNAoXdmFsdWVfc3VtX3Blcl91c2VyX21lYW4YByABKAFSE3ZhbHVlU3VtUGVyVXNlck1lYW4SPAobdmFsdWVfc3VtX3Blcl91c2VyX3ZhcmlhbmNlGAggASgBUhd2YWx1ZVN1bVBlclVzZXJWYXJpYW5jZUI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMK1AMKKXByb3RvL2V2ZW50Y291bnRlci9ldmFsdWF0aW9uX2NvdW50LnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyGihwcm90by9ldmVudGNvdW50ZXIvdmFyaWF0aW9uX2NvdW50LnByb3RvIqQCCg9FdmFsdWF0aW9uQ291bnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YAyABKAVSDmZlYXR1cmVWZXJzaW9uEk8KD3JlYWx0aW1lX2NvdW50cxgEIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSDnJlYWx0aW1lQ291bnRzEkkKDGJhdGNoX2NvdW50cxgFIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSC2JhdGNoQ291bnRzEh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdEI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMKhgYKKXByb3RvL2V2ZW50Y291bnRlci9leHBlcmltZW50X2NvdW50LnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyGihwcm90by9ldmVudGNvdW50ZXIvdmFyaWF0aW9uX2NvdW50LnByb3RvIo4DCg9FeHBlcmltZW50Q291bnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YAyABKAVSDmZlYXR1cmVWZXJzaW9uEhsKB2dvYWxfaWQYBCABKAlCAhgBUgZnb2FsSWQSUwoPcmVhbHRpbWVfY291bnRzGAUgAygLMiYuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25Db3VudEICGAFSDnJlYWx0aW1lQ291bnRzEk0KDGJhdGNoX2NvdW50cxgGIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRCAhgBUgtiYXRjaENvdW50cxIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSQwoLZ29hbF9jb3VudHMYCCADKAsyIi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdvYWxDb3VudHNSCmdvYWxDb3VudHMixQEKCkdvYWxDb3VudHMSFwoHZ29hbF9pZBgBIAEoCVIGZ29hbElkEk8KD3JlYWx0aW1lX2NvdW50cxgCIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSDnJlYWx0aW1lQ291bnRzEk0KDGJhdGNoX2NvdW50cxgDIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRCAhgBUgtiYXRjaENvdW50c0I2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMKvQMKI3Byb3RvL2V2ZW50Y291bnRlci90aW1lc2VyaWVzLnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyInwKE1ZhcmlhdGlvblRpbWVzZXJpZXMSIQoMdmFyaWF0aW9uX2lkGAEgASgJUgt2YXJpYXRpb25JZBJCCgp0aW1lc2VyaWVzGAIgASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUgp0aW1lc2VyaWVzIr8BCgpUaW1lc2VyaWVzEh4KCnRpbWVzdGFtcHMYASADKANSCnRpbWVzdGFtcHMSFgoGdmFsdWVzGAIgAygBUgZ2YWx1ZXMSOwoEdW5pdBgDIAEoDjInLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllcy5Vbml0UgR1bml0EiEKDHRvdGFsX2NvdW50cxgEIAEoA1ILdG90YWxDb3VudHMiGQoEVW5pdBIICgRIT1VSEAASBwoDREFZEAFCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50Y291bnRlcmIGcHJvdG8zCrATCilwcm90by9ldmVudGNvdW50ZXIvdmFyaWF0aW9uX3Jlc3VsdC5wcm90bxIWYnVja2V0ZWVyLmV2ZW50Y291bnRlchoocHJvdG8vZXZlbnRjb3VudGVyL3ZhcmlhdGlvbl9jb3VudC5wcm90bxotcHJvdG8vZXZlbnRjb3VudGVyL2Rpc3RyaWJ1dGlvbl9zdW1tYXJ5LnByb3RvGiNwcm90by9ldmVudGNvdW50ZXIvdGltZXNlcmllcy5wcm90byKsEQoPVmFyaWF0aW9uUmVzdWx0EiEKDHZhcmlhdGlvbl9pZBgBIAEoCVILdmFyaWF0aW9uSWQSUQoQZXhwZXJpbWVudF9jb3VudBgCIAEoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSD2V4cGVyaW1lbnRDb3VudBJRChBldmFsdWF0aW9uX2NvdW50GAMgASgLMiYuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25Db3VudFIPZXZhbHVhdGlvbkNvdW50Ek8KDWN2cl9wcm9iX2Jlc3QYBCABKAsyKy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkRpc3RyaWJ1dGlvblN1bW1hcnlSC2N2clByb2JCZXN0EmAKFmN2cl9wcm9iX2JlYXRfYmFzZWxpbmUYBSABKAsyKy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkRpc3RyaWJ1dGlvblN1bW1hcnlSE2N2clByb2JCZWF0QmFzZWxpbmUSRgoIY3ZyX3Byb2IYBiABKAsyKy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkRpc3RyaWJ1dGlvblN1bW1hcnlSB2N2clByb2ISawogZXZhbHVhdGlvbl91c2VyX2NvdW50X3RpbWVzZXJpZXMYByABKAsyIi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLlRpbWVzZXJpZXNSHWV2YWx1YXRpb25Vc2VyQ291bnRUaW1lc2VyaWVzEm0KIWV2YWx1YXRpb25fZXZlbnRfY291bnRfdGltZXNlcmllcxgIIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1IeZXZhbHVhdGlvbkV2ZW50Q291bnRUaW1lc2VyaWVzEl8KGmdvYWxfdXNlcl9jb3VudF90aW1lc2VyaWVzGAkgASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUhdnb2FsVXNlckNvdW50VGltZXNlcmllcxJhChtnb2FsX2V2ZW50X2NvdW50X3RpbWVzZXJpZXMYCiABKAsyIi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLlRpbWVzZXJpZXNSGGdvYWxFdmVudENvdW50VGltZXNlcmllcxJdChlnb2FsX3ZhbHVlX3N1bV90aW1lc2VyaWVzGAsgASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUhZnb2FsVmFsdWVTdW1UaW1lc2VyaWVzElYKFWN2cl9tZWRpYW5fdGltZXNlcmllcxgMIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1ITY3ZyTWVkaWFuVGltZXNlcmllcxJkChxjdnJfcGVyY2VudGlsZTAyNV90aW1lc2VyaWVzGA0gASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUhpjdnJQZXJjZW50aWxlMDI1VGltZXNlcmllcxJkChxjdnJfcGVyY2VudGlsZTk3NV90aW1lc2VyaWVzGA4gASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUhpjdnJQZXJjZW50aWxlOTc1VGltZXNlcmllcxJJCg5jdnJfdGltZXNlcmllcxgPIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1INY3ZyVGltZXNlcmllcxJtCiJnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl90aW1lc2VyaWVzGBAgASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUh1nb2FsVmFsdWVTdW1QZXJVc2VyVGltZXNlcmllcxJqChxnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl9wcm9iGBEgASgLMisuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5EaXN0cmlidXRpb25TdW1tYXJ5Uhdnb2FsVmFsdWVTdW1QZXJVc2VyUHJvYhJzCiFnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl9wcm9iX2Jlc3QYEiABKAsyKy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkRpc3RyaWJ1dGlvblN1bW1hcnlSG2dvYWxWYWx1ZVN1bVBlclVzZXJQcm9iQmVzdBKEAQoqZ29hbF92YWx1ZV9zdW1fcGVyX3VzZXJfcHJvYl9iZWF0X2Jhc2VsaW5lGBMgASgLMisuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5EaXN0cmlidXRpb25TdW1tYXJ5UiNnb2FsVmFsdWVTdW1QZXJVc2VyUHJvYkJlYXRCYXNlbGluZRJ6Cilnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl9tZWRpYW5fdGltZXNlcmllcxgUIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1IjZ29hbFZhbHVlU3VtUGVyVXNlck1lZGlhblRpbWVzZXJpZXMSiAEKMGdvYWxfdmFsdWVfc3VtX3Blcl91c2VyX3BlcmNlbnRpbGUwMjVfdGltZXNlcmllcxgVIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1IqZ29hbFZhbHVlU3VtUGVyVXNlclBlcmNlbnRpbGUwMjVUaW1lc2VyaWVzEogBCjBnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl9wZXJjZW50aWxlOTc1X3RpbWVzZXJpZXMYFiABKAsyIi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLlRpbWVzZXJpZXNSKmdvYWxWYWx1ZVN1bVBlclVzZXJQZXJjZW50aWxlOTc1VGltZXNlcmllc0I2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMKpgIKJHByb3RvL2V2ZW50Y291bnRlci9nb2FsX3Jlc3VsdC5wcm90bxIWYnVja2V0ZWVyLmV2ZW50Y291bnRlchopcHJvdG8vZXZlbnRjb3VudGVyL3ZhcmlhdGlvbl9yZXN1bHQucHJvdG8iewoKR29hbFJlc3VsdBIXCgdnb2FsX2lkGAEgASgJUgZnb2FsSWQSVAoRdmFyaWF0aW9uX3Jlc3VsdHMYAiADKAsyJy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLlZhcmlhdGlvblJlc3VsdFIQdmFyaWF0aW9uUmVzdWx0c0I2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMK2gIKKnByb3RvL2V2ZW50Y291bnRlci9leHBlcmltZW50X3Jlc3VsdC5wcm90bxIWYnVja2V0ZWVyLmV2ZW50Y291bnRlchokcHJvdG8vZXZlbnRjb3VudGVyL2dvYWxfcmVzdWx0LnByb3RvIq0BChBFeHBlcmltZW50UmVzdWx0Eg4KAmlkGAEgASgJUgJpZBIjCg1leHBlcmltZW50X2lkGAIgASgJUgxleHBlcmltZW50SWQSHQoKdXBkYXRlZF9hdBgDIAEoA1IJdXBkYXRlZEF0EkUKDGdvYWxfcmVzdWx0cxgEIAMoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR29hbFJlc3VsdFILZ29hbFJlc3VsdHNCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50Y291bnRlcmIGcHJvdG8zCuQBChlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiNgoDQW55EhkKCHR5cGVfdXJsGAEgASgJUgd0eXBlVXJsEhQKBXZhbHVlGAIgASgMUgV2YWx1ZUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQghBbnlQcm90b1ABWixnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9hbnlwYqICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCvsBCh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiI6CghEdXJhdGlvbhIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINRHVyYXRpb25Qcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9kdXJhdGlvbnBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMK1gEKHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSJnCglWYXJpYXRpb24SDgoCaWQYASABKAlSAmlkEhQKBXZhbHVlGAIgASgJUgV2YWx1ZRISCgRuYW1lGAMgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCp4CChpwcm90by9mZWF0dXJlL3JlYXNvbi5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUisQEKBlJlYXNvbhIyCgR0eXBlGAEgASgOMh4uYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uLlR5cGVSBHR5cGUSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkIloKBFR5cGUSCgoGVEFSR0VUEAASCAoEUlVMRRABEgsKB0RFRkFVTFQQAxIKCgZDTElFTlQQBBIRCg1PRkZfVkFSSUFUSU9OEAUSEAoMUFJFUkVRVUlTSVRFEAZCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwqYBgoecHJvdG8vZmVhdHVyZS9ldmFsdWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZRodcHJvdG8vZmVhdHVyZS92YXJpYXRpb24ucHJvdG8aGnByb3RvL2ZlYXR1cmUvcmVhc29uLnByb3RvIuMCCgpFdmFsdWF0aW9uEg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAMgASgFUg5mZWF0dXJlVmVyc2lvbhIXCgd1c2VyX2lkGAQgASgJUgZ1c2VySWQSIQoMdmFyaWF0aW9uX2lkGAUgASgJUgt2YXJpYXRpb25JZBI+Cgl2YXJpYXRpb24YBiABKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25CAhgBUgl2YXJpYXRpb24SMQoGcmVhc29uGAcgASgLMhkuYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uUgZyZWFzb24SJwoPdmFyaWF0aW9uX3ZhbHVlGAggASgJUg52YXJpYXRpb25WYWx1ZRIlCg52YXJpYXRpb25fbmFtZRgJIAEoCVINdmFyaWF0aW9uTmFtZSKGAgoPVXNlckV2YWx1YXRpb25zEhIKAmlkGAEgASgJQgIYAVICaWQSPwoLZXZhbHVhdGlvbnMYAiADKAsyHS5idWNrZXRlZXIuZmVhdHVyZS5FdmFsdWF0aW9uUgtldmFsdWF0aW9ucxIdCgpjcmVhdGVkX2F0GAMgASgDUgljcmVhdGVkQXQSMAoUYXJjaGl2ZWRfZmVhdHVyZV9pZHMYBCADKAlSEmFyY2hpdmVkRmVhdHVyZUlkcxIhCgxmb3JjZV91cGRhdGUYBSABKAhSC2ZvcmNlVXBkYXRlIioKBVN0YXRlEgoKBlFVRVVFRBAAEgsKB1BBUlRJQUwQARIICgRGVUxMEAJCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwrABAoVcHJvdG8vdXNlci91c2VyLnByb3RvEg5idWNrZXRlZXIudXNlciLeAwoEVXNlchIOCgJpZBgBIAEoCVICaWQSMgoEZGF0YRgCIAMoCzIeLmJ1Y2tldGVlci51c2VyLlVzZXIuRGF0YUVudHJ5UgRkYXRhEkUKC3RhZ2dlZF9kYXRhGAMgAygLMiQuYnVja2V0ZWVyLnVzZXIuVXNlci5UYWdnZWREYXRhRW50cnlSCnRhZ2dlZERhdGESGwoJbGFzdF9zZWVuGAQgASgDUghsYXN0U2VlbhIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQafAoERGF0YRI6CgV2YWx1ZRgBIAMoCzIkLmJ1Y2tldGVlci51c2VyLlVzZXIuRGF0YS5WYWx1ZUVudHJ5UgV2YWx1ZRo4CgpWYWx1ZUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaNwoJRGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaWAoPVGFnZ2VkRGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuYnVja2V0ZWVyLnVzZXIuVXNlci5EYXRhUgV2YWx1ZToCOAFCLlosZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL3VzZXJiBnByb3RvMwqmMAoecHJvdG8vZXZlbnQvY2xpZW50L2V2ZW50LnByb3RvEhZidWNrZXRlZXIuZXZlbnQuY2xpZW50Ghlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvGh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8aHnByb3RvL2ZlYXR1cmUvZXZhbHVhdGlvbi5wcm90bxoacHJvdG8vZmVhdHVyZS9yZWFzb24ucHJvdG8aFXByb3RvL3VzZXIvdXNlci5wcm90byJ4CgVFdmVudBIOCgJpZBgBIAEoCVICaWQSKgoFZXZlbnQYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgVldmVudBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYAyABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlIpIECg9FdmFsdWF0aW9uRXZlbnQSHAoJdGltZXN0YW1wGAEgASgDUgl0aW1lc3RhbXASHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgDIAEoBVIOZmVhdHVyZVZlcnNpb24SFwoHdXNlcl9pZBgEIAEoCVIGdXNlcklkEiEKDHZhcmlhdGlvbl9pZBgFIAEoCVILdmFyaWF0aW9uSWQSKAoEdXNlchgGIAEoCzIULmJ1Y2tldGVlci51c2VyLlVzZXJSBHVzZXISMQoGcmVhc29uGAcgASgLMhkuYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uUgZyZWFzb24SEAoDdGFnGAggASgJUgN0YWcSPQoJc291cmNlX2lkGAkgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHwoLc2RrX3ZlcnNpb24YCiABKAlSCnNka1ZlcnNpb24SUQoIbWV0YWRhdGEYCyADKAsyNS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkV2YWx1YXRpb25FdmVudC5NZXRhZGF0YUVudHJ5UghtZXRhZGF0YRo7Cg1NZXRhZGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi3AMKCUdvYWxFdmVudBIcCgl0aW1lc3RhbXAYASABKANSCXRpbWVzdGFtcBIXCgdnb2FsX2lkGAIgASgJUgZnb2FsSWQSFwoHdXNlcl9pZBgDIAEoCVIGdXNlcklkEhQKBXZhbHVlGAQgASgBUgV2YWx1ZRIoCgR1c2VyGAUgASgLMhQuYnVja2V0ZWVyLnVzZXIuVXNlclIEdXNlchJDCgtldmFsdWF0aW9ucxgGIAMoCzIdLmJ1Y2tldGVlci5mZWF0dXJlLkV2YWx1YXRpb25CAhgBUgtldmFsdWF0aW9ucxIQCgN0YWcYByABKAlSA3RhZxI9Cglzb3VyY2VfaWQYCCABKA4yIC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlNvdXJjZUlkUghzb3VyY2VJZBIfCgtzZGtfdmVyc2lvbhgJIAEoCVIKc2RrVmVyc2lvbhJLCghtZXRhZGF0YRgKIAMoCzIvLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuR29hbEV2ZW50Lk1ldGFkYXRhRW50cnlSCG1ldGFkYXRhGjsKDU1ldGFkYXRhRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLFAgoMTWV0cmljc0V2ZW50EhwKCXRpbWVzdGFtcBgBIAEoA1IJdGltZXN0YW1wEioKBWV2ZW50GAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIFZXZlbnQSPQoJc291cmNlX2lkGAMgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHwoLc2RrX3ZlcnNpb24YBCABKAlSCnNka1ZlcnNpb24STgoIbWV0YWRhdGEYBSADKAsyMi5idWNrZXRlZXIuZXZlbnQuY2xpZW50Lk1ldHJpY3NFdmVudC5NZXRhZGF0YUVudHJ5UghtZXRhZGF0YRo7Cg1NZXRhZGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi9gEKIEdldEV2YWx1YXRpb25MYXRlbmN5TWV0cmljc0V2ZW50ElwKBmxhYmVscxgBIAMoCzJELmJ1Y2tldGVlci5ldmVudC5jbGllbnQuR2V0RXZhbHVhdGlvbkxhdGVuY3lNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxI1CghkdXJhdGlvbhgCIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblIIZHVyYXRpb24aOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AToCGAEi1gEKHUdldEV2YWx1YXRpb25TaXplTWV0cmljc0V2ZW50ElkKBmxhYmVscxgBIAMoCzJBLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuR2V0RXZhbHVhdGlvblNpemVNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxIbCglzaXplX2J5dGUYAiABKAVSCHNpemVCeXRlGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE6AhgBIrkCChNMYXRlbmN5TWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkEk8KBmxhYmVscxgCIAMoCzI3LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuTGF0ZW5jeU1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzEjkKCGR1cmF0aW9uGAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQgIYAVIIZHVyYXRpb24SJQoObGF0ZW5jeV9zZWNvbmQYBCABKAFSDWxhdGVuY3lTZWNvbmQaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLuAQoQU2l6ZU1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJMCgZsYWJlbHMYAiADKAsyNC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlNpemVNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxIbCglzaXplX2J5dGUYAyABKAVSCHNpemVCeXRlGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEiNQodVGltZW91dEVycm9yQ291bnRNZXRyaWNzRXZlbnQSEAoDdGFnGAEgASgJUgN0YWc6AhgBIjYKHkludGVybmFsRXJyb3JDb3VudE1ldHJpY3NFdmVudBIQCgN0YWcYASABKAlSA3RhZzoCGAEi5wEKG0JhZFJlcXVlc3RFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJXCgZsYWJlbHMYAiADKAsyPy5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkJhZFJlcXVlc3RFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi6wEKHVVuYXV0aG9yaXplZEVycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElkKBmxhYmVscxgCIAMoCzJBLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuVW5hdXRob3JpemVkRXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIuUBChpGb3JiaWRkZW5FcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJWCgZsYWJlbHMYAiADKAsyPi5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkZvcmJpZGRlbkVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLjAQoZTm90Rm91bmRFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJVCgZsYWJlbHMYAiADKAsyPS5idWNrZXRlZXIuZXZlbnQuY2xpZW50Lk5vdEZvdW5kRXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIvkBCiRDbGllbnRDbG9zZWRSZXF1ZXN0RXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSYAoGbGFiZWxzGAIgAygLMkguYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5DbGllbnRDbG9zZWRSZXF1ZXN0RXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIu8BCh9JbnRlcm5hbFNlcnZlckVycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElsKBmxhYmVscxgCIAMoCzJDLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuSW50ZXJuYWxTZXJ2ZXJFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi9wEKI1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkEl8KBmxhYmVscxgCIAMoCzJHLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuU2VydmljZVVuYXZhaWxhYmxlRXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIuEBChhUaW1lb3V0RXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVAoGbGFiZWxzGAIgAygLMjwuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5UaW1lb3V0RXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIuMBChlJbnRlcm5hbEVycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElUKBmxhYmVscxgCIAMoCzI9LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuSW50ZXJuYWxFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi4QEKGE5ldHdvcmtFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJUCgZsYWJlbHMYAiADKAsyPC5idWNrZXRlZXIuZXZlbnQuY2xpZW50Lk5ldHdvcmtFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi6QEKHEludGVybmFsU2RrRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSWAoGbGFiZWxzGAIgAygLMkAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5JbnRlcm5hbFNka0Vycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLhAQoYVW5rbm93bkVycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElQKBmxhYmVscxgCIAMoCzI8LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuVW5rbm93bkVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLFAQoIT3BzRXZlbnQSHAoJdGltZXN0YW1wGAEgASgDUgl0aW1lc3RhbXASHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgDIAEoBVIOZmVhdHVyZVZlcnNpb24SIQoMdmFyaWF0aW9uX2lkGAQgASgJUgt2YXJpYXRpb25JZBIXCgdnb2FsX2lkGAUgASgJUgZnb2FsSWQSFwoHdXNlcl9pZBgGIAEoCVIGdXNlcklkIlwKDVVzZXJHb2FsRXZlbnQSHAoJdGltZXN0YW1wGAEgASgDUgl0aW1lc3RhbXASFwoHZ29hbF9pZBgCIAEoCVIGZ29hbElkEhQKBXZhbHVlGAMgASgBUgV2YWx1ZSpwCghTb3VyY2VJZBILCgdVTktOT1dOEAASCwoHQU5EUk9JRBABEgcKA0lPUxACEgsKA1dFQhADGgIIARINCglHT19TRVJWRVIQBRIPCgtOT0RFX1NFUlZFUhAGEg4KCkpBVkFTQ1JJUFQQByIECAQQBCpWCgVBcGlJZBIPCgtVTktOT1dOX0FQSRAAEhIKDkdFVF9FVkFMVUFUSU9OEAESEwoPR0VUX0VWQUxVQVRJT05TEAISEwoPUkVHSVNURVJfRVZFTlRTEANCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50L2NsaWVudGIGcHJvdG8zCrUECiRwcm90by9ldmVudGNvdW50ZXIvbWF1X3N1bW1hcnkucHJvdG8SFmJ1Y2tldGVlci5ldmVudGNvdW50ZXIaHnByb3RvL2V2ZW50L2NsaWVudC9ldmVudC5wcm90byKUAwoKTUFVU3VtbWFyeRIcCgl5ZWFybW9udGgYASABKAlSCXllYXJtb250aBIlCg5lbnZpcm9ubWVudF9pZBgCIAEoCVINZW52aXJvbm1lbnRJZBI9Cglzb3VyY2VfaWQYAyABKA4yIC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlNvdXJjZUlkUghzb3VyY2VJZBIdCgp1c2VyX2NvdW50GAQgASgDUgl1c2VyQ291bnQSIwoNcmVxdWVzdF9jb3VudBgFIAEoA1IMcmVxdWVzdENvdW50EikKEGV2YWx1YXRpb25fY291bnQYBiABKANSD2V2YWx1YXRpb25Db3VudBIdCgpnb2FsX2NvdW50GAcgASgDUglnb2FsQ291bnQSFQoGaXNfYWxsGAggASgIUgVpc0FsbBIfCgtpc19maW5pc2hlZBgJIAEoCFIKaXNGaW5pc2hlZBIdCgpjcmVhdGVkX2F0GAogASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgLIAEoA1IJdXBkYXRlZEF0QjZaNGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9ldmVudGNvdW50ZXJiBnByb3RvMwqGBAoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvEg9nb29nbGUucHJvdG9idWYiIwoLRG91YmxlVmFsdWUSFAoFdmFsdWUYASABKAFSBXZhbHVlIiIKCkZsb2F0VmFsdWUSFAoFdmFsdWUYASABKAJSBXZhbHVlIiIKCkludDY0VmFsdWUSFAoFdmFsdWUYASABKANSBXZhbHVlIiMKC1VJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgEUgV2YWx1ZSIiCgpJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgFUgV2YWx1ZSIjCgtVSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoDVIFdmFsdWUiIQoJQm9vbFZhbHVlEhQKBXZhbHVlGAEgASgIUgV2YWx1ZSIjCgtTdHJpbmdWYWx1ZRIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUiIgoKQnl0ZXNWYWx1ZRIUCgV2YWx1ZRgBIAEoDFIFdmFsdWVCgwEKE2NvbS5nb29nbGUucHJvdG9idWZCDVdyYXBwZXJzUHJvdG9QAVoxZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vd3JhcHBlcnNwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCqEkCiBwcm90by9ldmVudGNvdW50ZXIvc2VydmljZS5wcm90bxIWYnVja2V0ZWVyLmV2ZW50Y291bnRlchoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGipwcm90by9ldmVudGNvdW50ZXIvZXhwZXJpbWVudF9yZXN1bHQucHJvdG8aI3Byb3RvL2V2ZW50Y291bnRlci90aW1lc2VyaWVzLnByb3RvGihwcm90by9ldmVudGNvdW50ZXIvdmFyaWF0aW9uX2NvdW50LnByb3RvIvkBCiNHZXRFeHBlcmltZW50RXZhbHVhdGlvbkNvdW50UmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEhkKCHN0YXJ0X2F0GAIgASgDUgdzdGFydEF0EhUKBmVuZF9hdBgDIAEoA1IFZW5kQXQSHQoKZmVhdHVyZV9pZBgEIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgFIAEoBVIOZmVhdHVyZVZlcnNpb24SIwoNdmFyaWF0aW9uX2lkcxgGIAMoCVIMdmFyaWF0aW9uSWRzIsEBCiRHZXRFeHBlcmltZW50RXZhbHVhdGlvbkNvdW50UmVzcG9uc2USHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgCIAEoBVIOZmVhdHVyZVZlcnNpb24SUQoQdmFyaWF0aW9uX2NvdW50cxgDIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSD3ZhcmlhdGlvbkNvdW50cyLEAgojR2V0RXZhbHVhdGlvblRpbWVzZXJpZXNDb3VudFJlcXVlc3QSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAEgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSZAoKdGltZV9yYW5nZRgDIAEoDjJFLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0RXZhbHVhdGlvblRpbWVzZXJpZXNDb3VudFJlcXVlc3QuVGltZVJhbmdlUgl0aW1lUmFuZ2UiYwoJVGltZVJhbmdlEgsKB1VOS05PV04QABIVChFUV0VOVFlfRk9VUl9IT1VSUxABEg4KClNFVkVOX0RBWVMQAhIRCg1GT1VSVEVFTl9EQVlTEAMSDwoLVEhJUlRZX0RBWVMQBCLEAQokR2V0RXZhbHVhdGlvblRpbWVzZXJpZXNDb3VudFJlc3BvbnNlEkwKC3VzZXJfY291bnRzGAEgAygLMisuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25UaW1lc2VyaWVzUgp1c2VyQ291bnRzEk4KDGV2ZW50X2NvdW50cxgCIAMoCzIrLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uVGltZXNlcmllc1ILZXZlbnRDb3VudHMidgoaR2V0RXhwZXJpbWVudFJlc3VsdFJlcXVlc3QSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAEgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRIjCg1leHBlcmltZW50X2lkGAIgASgJUgxleHBlcmltZW50SWQidAobR2V0RXhwZXJpbWVudFJlc3VsdFJlc3BvbnNlElUKEWV4cGVyaW1lbnRfcmVzdWx0GAEgASgLMiguYnVja2V0ZWVyLmV2ZW50Y291bnRlci5FeHBlcmltZW50UmVzdWx0UhBleHBlcmltZW50UmVzdWx0IrgBChxMaXN0RXhwZXJpbWVudFJlc3VsdHNSZXF1ZXN0Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBJECg9mZWF0dXJlX3ZlcnNpb24YAiABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIOZmVhdHVyZVZlcnNpb24SMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAMgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZSLjAQodTGlzdEV4cGVyaW1lbnRSZXN1bHRzUmVzcG9uc2USXAoHcmVzdWx0cxgBIAMoCzJCLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuTGlzdEV4cGVyaW1lbnRSZXN1bHRzUmVzcG9uc2UuUmVzdWx0c0VudHJ5UgdyZXN1bHRzGmQKDFJlc3VsdHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRI+CgV2YWx1ZRgCIAEoCzIoLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuRXhwZXJpbWVudFJlc3VsdFIFdmFsdWU6AjgBIowCCh1HZXRFeHBlcmltZW50R29hbENvdW50UmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEhkKCHN0YXJ0X2F0GAIgASgDUgdzdGFydEF0EhUKBmVuZF9hdBgDIAEoA1IFZW5kQXQSFwoHZ29hbF9pZBgEIAEoCVIGZ29hbElkEh0KCmZlYXR1cmVfaWQYBSABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YBiABKAVSDmZlYXR1cmVWZXJzaW9uEiMKDXZhcmlhdGlvbl9pZHMYByADKAlSDHZhcmlhdGlvbklkcyKMAQoeR2V0RXhwZXJpbWVudEdvYWxDb3VudFJlc3BvbnNlEhcKB2dvYWxfaWQYASABKAlSBmdvYWxJZBJRChB2YXJpYXRpb25fY291bnRzGAIgAygLMiYuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25Db3VudFIPdmFyaWF0aW9uQ291bnRzIv8BCiBHZXRPcHNFdmFsdWF0aW9uVXNlckNvdW50UmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEh4KC29wc19ydWxlX2lkGAIgASgJUglvcHNSdWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBIdCgpmZWF0dXJlX2lkGAQgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAUgASgFUg5mZWF0dXJlVmVyc2lvbhIhCgx2YXJpYXRpb25faWQYBiABKAlSC3ZhcmlhdGlvbklkInYKIUdldE9wc0V2YWx1YXRpb25Vc2VyQ291bnRSZXNwb25zZRIeCgtvcHNfcnVsZV9pZBgBIAEoCVIJb3BzUnVsZUlkEhsKCWNsYXVzZV9pZBgCIAEoCVIIY2xhdXNlSWQSFAoFY291bnQYAyABKANSBWNvdW50IvkBChpHZXRPcHNHb2FsVXNlckNvdW50UmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEh4KC29wc19ydWxlX2lkGAIgASgJUglvcHNSdWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBIdCgpmZWF0dXJlX2lkGAQgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAUgASgFUg5mZWF0dXJlVmVyc2lvbhIhCgx2YXJpYXRpb25faWQYBiABKAlSC3ZhcmlhdGlvbklkInAKG0dldE9wc0dvYWxVc2VyQ291bnRSZXNwb25zZRIeCgtvcHNfcnVsZV9pZBgBIAEoCVIJb3BzUnVsZUlkEhsKCWNsYXVzZV9pZBgCIAEoCVIIY2xhdXNlSWQSFAoFY291bnQYAyABKANSBWNvdW50ImgKEkdldE1BVUNvdW50UmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEh0KCnllYXJfbW9udGgYAiABKAlSCXllYXJNb250aCJVChNHZXRNQVVDb3VudFJlc3BvbnNlEh8KC2V2ZW50X2NvdW50GAEgASgDUgpldmVudENvdW50Eh0KCnVzZXJfY291bnQYAiABKANSCXVzZXJDb3VudCJbChlTdW1tYXJpemVNQVVDb3VudHNSZXF1ZXN0Eh0KCnllYXJfbW9udGgYASABKAlSCXllYXJNb250aBIfCgtpc19maW5pc2hlZBgCIAEoCFIKaXNGaW5pc2hlZCIcChpTdW1tYXJpemVNQVVDb3VudHNSZXNwb25zZTLqCQoTRXZlbnRDb3VudGVyU2VydmljZRKbAQocR2V0RXhwZXJpbWVudEV2YWx1YXRpb25Db3VudBI7LmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0RXhwZXJpbWVudEV2YWx1YXRpb25Db3VudFJlcXVlc3QaPC5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdldEV4cGVyaW1lbnRFdmFsdWF0aW9uQ291bnRSZXNwb25zZSIAEpsBChxHZXRFdmFsdWF0aW9uVGltZXNlcmllc0NvdW50EjsuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5HZXRFdmFsdWF0aW9uVGltZXNlcmllc0NvdW50UmVxdWVzdBo8LmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0RXZhbHVhdGlvblRpbWVzZXJpZXNDb3VudFJlc3BvbnNlIgASgAEKE0dldEV4cGVyaW1lbnRSZXN1bHQSMi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdldEV4cGVyaW1lbnRSZXN1bHRSZXF1ZXN0GjMuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5HZXRFeHBlcmltZW50UmVzdWx0UmVzcG9uc2UiABKGAQoVTGlzdEV4cGVyaW1lbnRSZXN1bHRzEjQuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5MaXN0RXhwZXJpbWVudFJlc3VsdHNSZXF1ZXN0GjUuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5MaXN0RXhwZXJpbWVudFJlc3VsdHNSZXNwb25zZSIAEokBChZHZXRFeHBlcmltZW50R29hbENvdW50EjUuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5HZXRFeHBlcmltZW50R29hbENvdW50UmVxdWVzdBo2LmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0RXhwZXJpbWVudEdvYWxDb3VudFJlc3BvbnNlIgASaAoLR2V0TUFVQ291bnQSKi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdldE1BVUNvdW50UmVxdWVzdBorLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0TUFVQ291bnRSZXNwb25zZSIAEn0KElN1bW1hcml6ZU1BVUNvdW50cxIxLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuU3VtbWFyaXplTUFVQ291bnRzUmVxdWVzdBoyLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuU3VtbWFyaXplTUFVQ291bnRzUmVzcG9uc2UiABKSAQoZR2V0T3BzRXZhbHVhdGlvblVzZXJDb3VudBI4LmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0T3BzRXZhbHVhdGlvblVzZXJDb3VudFJlcXVlc3QaOS5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdldE9wc0V2YWx1YXRpb25Vc2VyQ291bnRSZXNwb25zZSIAEoABChNHZXRPcHNHb2FsVXNlckNvdW50EjIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5HZXRPcHNHb2FsVXNlckNvdW50UmVxdWVzdBozLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0T3BzR29hbFVzZXJDb3VudFJlc3BvbnNlIgBCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50Y291bnRlcmIGcHJvdG8z autoopsDescriptor: CuQBChlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiNgoDQW55EhkKCHR5cGVfdXJsGAEgASgJUgd0eXBlVXJsEhQKBXZhbHVlGAIgASgMUgV2YWx1ZUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQghBbnlQcm90b1ABWixnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9hbnlwYqICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCqUJChpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iRgoGQ2xhdXNlEg4KAmlkGAEgASgJUgJpZBIsCgZjbGF1c2UYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgZjbGF1c2UinwIKEk9wc0V2ZW50UmF0ZUNsYXVzZRIhCgx2YXJpYXRpb25faWQYAiABKAlSC3ZhcmlhdGlvbklkEhcKB2dvYWxfaWQYAyABKAlSBmdvYWxJZBIbCgltaW5fY291bnQYBCABKANSCG1pbkNvdW50EikKEHRocmVhZHNob2xkX3JhdGUYBSABKAFSD3RocmVhZHNob2xkUmF0ZRJKCghvcGVyYXRvchgGIAEoDjIuLmJ1Y2tldGVlci5hdXRvb3BzLk9wc0V2ZW50UmF0ZUNsYXVzZS5PcGVyYXRvclIIb3BlcmF0b3IiMwoIT3BlcmF0b3ISFAoQR1JFQVRFUl9PUl9FUVVBTBAAEhEKDUxFU1NfT1JfRVFVQUwQAUoECAEQAiIkCg5EYXRldGltZUNsYXVzZRISCgR0aW1lGAEgASgDUgR0aW1lIpcBChpQcm9ncmVzc2l2ZVJvbGxvdXRTY2hlZHVsZRIfCgtzY2hlZHVsZV9pZBgBIAEoCVIKc2NoZWR1bGVJZBIdCgpleGVjdXRlX2F0GAIgASgDUglleGVjdXRlQXQSFgoGd2VpZ2h0GAMgASgFUgZ3ZWlnaHQSIQoMdHJpZ2dlcmVkX2F0GAQgASgDUgt0cmlnZ2VyZWRBdCKYAQomUHJvZ3Jlc3NpdmVSb2xsb3V0TWFudWFsU2NoZWR1bGVDbGF1c2USSwoJc2NoZWR1bGVzGAEgAygLMi0uYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0U2NoZWR1bGVSCXNjaGVkdWxlcxIhCgx2YXJpYXRpb25faWQYAiABKAlSC3ZhcmlhdGlvbklkItgCCihQcm9ncmVzc2l2ZVJvbGxvdXRUZW1wbGF0ZVNjaGVkdWxlQ2xhdXNlEksKCXNjaGVkdWxlcxgBIAMoCzItLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlUglzY2hlZHVsZXMSYAoIaW50ZXJ2YWwYAiABKA4yRC5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRUZW1wbGF0ZVNjaGVkdWxlQ2xhdXNlLkludGVydmFsUghpbnRlcnZhbBIeCgppbmNyZW1lbnRzGAMgASgDUgppbmNyZW1lbnRzEiEKDHZhcmlhdGlvbl9pZBgEIAEoCVILdmFyaWF0aW9uSWQiOgoISW50ZXJ2YWwSCwoHVU5LTk9XThAAEgoKBkhPVVJMWRABEgkKBURBSUxZEAISCgoGV0VFS0xZEANCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1dG9vcHNiBnByb3RvMwq9BAohcHJvdG8vYXV0b29wcy9hdXRvX29wc19ydWxlLnByb3RvEhFidWNrZXRlZXIuYXV0b29wcxoacHJvdG8vYXV0b29wcy9jbGF1c2UucHJvdG8iowIKC0F1dG9PcHNSdWxlEg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSNQoIb3BzX3R5cGUYAyABKA4yGi5idWNrZXRlZXIuYXV0b29wcy5PcHNUeXBlUgdvcHNUeXBlEjMKB2NsYXVzZXMYBCADKAsyGS5idWNrZXRlZXIuYXV0b29wcy5DbGF1c2VSB2NsYXVzZXMSIQoMdHJpZ2dlcmVkX2F0GAYgASgDUgt0cmlnZ2VyZWRBdBIdCgpjcmVhdGVkX2F0GAcgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgIIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYCSABKAhSB2RlbGV0ZWQiVAoMQXV0b09wc1J1bGVzEkQKDmF1dG9fb3BzX3J1bGVzGAEgAygLMh4uYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1J1bGVSDGF1dG9PcHNSdWxlcyoyCgdPcHNUeXBlEhIKDkVOQUJMRV9GRUFUVVJFEAASEwoPRElTQUJMRV9GRUFUVVJFEAFCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1dG9vcHNiBnByb3RvMwr3BQoncHJvdG8vYXV0b29wcy9wcm9ncmVzc2l2ZV9yb2xsb3V0LnByb3RvEhFidWNrZXRlZXIuYXV0b29wcxoZZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90byLiBAoSUHJvZ3Jlc3NpdmVSb2xsb3V0Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSLAoGY2xhdXNlGAMgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIGY2xhdXNlEkQKBnN0YXR1cxgEIAEoDjIsLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5TdGF0dXNSBnN0YXR1cxIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgGIAEoA1IJdXBkYXRlZEF0Ej4KBHR5cGUYByABKA4yKi5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuVHlwZVIEdHlwZRJOCgpzdG9wcGVkX2J5GAggASgOMi8uYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlN0b3BwZWRCeVIJc3RvcHBlZEJ5Eh0KCnN0b3BwZWRfYXQYCSABKANSCXN0b3BwZWRBdCIyCgRUeXBlEhMKD01BTlVBTF9TQ0hFRFVMRRAAEhUKEVRFTVBMQVRFX1NDSEVEVUxFEAEiPQoGU3RhdHVzEgsKB1dBSVRJTkcQABILCgdSVU5OSU5HEAESDAoIRklOSVNIRUQQAhILCgdTVE9QUEVEEAMiSQoJU3RvcHBlZEJ5EgsKB1VOS05PV04QABIICgRVU0VSEAESEAoMT1BTX1NDSEVEVUxFEAISEwoPT1BTX0tJTExfU1dJVENIEANCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1dG9vcHNiBnByb3RvMwqBEQobcHJvdG8vYXV0b29wcy9jb21tYW5kLnByb3RvEhFidWNrZXRlZXIuYXV0b29wcxohcHJvdG8vYXV0b29wcy9hdXRvX29wc19ydWxlLnByb3RvGhpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90bxoncHJvdG8vYXV0b29wcy9wcm9ncmVzc2l2ZV9yb2xsb3V0LnByb3RvIpoCChhDcmVhdGVBdXRvT3BzUnVsZUNvbW1hbmQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEjUKCG9wc190eXBlGAIgASgOMhouYnVja2V0ZWVyLmF1dG9vcHMuT3BzVHlwZVIHb3BzVHlwZRJaChZvcHNfZXZlbnRfcmF0ZV9jbGF1c2VzGAMgAygLMiUuYnVja2V0ZWVyLmF1dG9vcHMuT3BzRXZlbnRSYXRlQ2xhdXNlUhNvcHNFdmVudFJhdGVDbGF1c2VzEkwKEGRhdGV0aW1lX2NsYXVzZXMYBCADKAsyIS5idWNrZXRlZXIuYXV0b29wcy5EYXRldGltZUNsYXVzZVIPZGF0ZXRpbWVDbGF1c2VzIlgKH0NoYW5nZUF1dG9PcHNSdWxlT3BzVHlwZUNvbW1hbmQSNQoIb3BzX3R5cGUYASABKA4yGi5idWNrZXRlZXIuYXV0b29wcy5PcHNUeXBlUgdvcHNUeXBlIhoKGERlbGV0ZUF1dG9PcHNSdWxlQ29tbWFuZCIlCiNDaGFuZ2VBdXRvT3BzUnVsZVRyaWdnZXJlZEF0Q29tbWFuZCJ4ChxBZGRPcHNFdmVudFJhdGVDbGF1c2VDb21tYW5kElgKFW9wc19ldmVudF9yYXRlX2NsYXVzZRgBIAEoCzIlLmJ1Y2tldGVlci5hdXRvb3BzLk9wc0V2ZW50UmF0ZUNsYXVzZVISb3BzRXZlbnRSYXRlQ2xhdXNlIosBCh9DaGFuZ2VPcHNFdmVudFJhdGVDbGF1c2VDb21tYW5kEg4KAmlkGAEgASgJUgJpZBJYChVvcHNfZXZlbnRfcmF0ZV9jbGF1c2UYAiABKAsyJS5idWNrZXRlZXIuYXV0b29wcy5PcHNFdmVudFJhdGVDbGF1c2VSEm9wc0V2ZW50UmF0ZUNsYXVzZSIlChNEZWxldGVDbGF1c2VDb21tYW5kEg4KAmlkGAEgASgJUgJpZCJmChhBZGREYXRldGltZUNsYXVzZUNvbW1hbmQSSgoPZGF0ZXRpbWVfY2xhdXNlGAEgASgLMiEuYnVja2V0ZWVyLmF1dG9vcHMuRGF0ZXRpbWVDbGF1c2VSDmRhdGV0aW1lQ2xhdXNlInkKG0NoYW5nZURhdGV0aW1lQ2xhdXNlQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQSSgoPZGF0ZXRpbWVfY2xhdXNlGAIgASgLMiEuYnVja2V0ZWVyLmF1dG9vcHMuRGF0ZXRpbWVDbGF1c2VSDmRhdGV0aW1lQ2xhdXNlIuADCh9DcmVhdGVQcm9ncmVzc2l2ZVJvbGxvdXRDb21tYW5kEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBKaAQoqcHJvZ3Jlc3NpdmVfcm9sbG91dF9tYW51YWxfc2NoZWR1bGVfY2xhdXNlGAIgASgLMjkuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0TWFudWFsU2NoZWR1bGVDbGF1c2VIAFImcHJvZ3Jlc3NpdmVSb2xsb3V0TWFudWFsU2NoZWR1bGVDbGF1c2WIAQESoAEKLHByb2dyZXNzaXZlX3JvbGxvdXRfdGVtcGxhdGVfc2NoZWR1bGVfY2xhdXNlGAMgASgLMjsuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZUgBUihwcm9ncmVzc2l2ZVJvbGxvdXRUZW1wbGF0ZVNjaGVkdWxlQ2xhdXNliAEBQi0KK19wcm9ncmVzc2l2ZV9yb2xsb3V0X21hbnVhbF9zY2hlZHVsZV9jbGF1c2VCLwotX3Byb2dyZXNzaXZlX3JvbGxvdXRfdGVtcGxhdGVfc2NoZWR1bGVfY2xhdXNlIm8KHVN0b3BQcm9ncmVzc2l2ZVJvbGxvdXRDb21tYW5kEk4KCnN0b3BwZWRfYnkYASABKA4yLy5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuU3RvcHBlZEJ5UglzdG9wcGVkQnkiIQofRGVsZXRlUHJvZ3Jlc3NpdmVSb2xsb3V0Q29tbWFuZCKFAQowQWRkUHJvZ3Jlc3NpdmVSb2xsb3V0TWFudWFsU2NoZWR1bGVDbGF1c2VDb21tYW5kElEKBmNsYXVzZRgBIAEoCzI5LmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dE1hbnVhbFNjaGVkdWxlQ2xhdXNlUgZjbGF1c2UiiQEKMkFkZFByb2dyZXNzaXZlUm9sbG91dFRlbXBsYXRlU2NoZWR1bGVDbGF1c2VDb21tYW5kElMKBmNsYXVzZRgBIAEoCzI7LmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dFRlbXBsYXRlU2NoZWR1bGVDbGF1c2VSBmNsYXVzZSJVCjJDaGFuZ2VQcm9ncmVzc2l2ZVJvbGxvdXRTY2hlZHVsZVRyaWdnZXJlZEF0Q29tbWFuZBIfCgtzY2hlZHVsZV9pZBgBIAEoCVIKc2NoZWR1bGVJZEIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXV0b29wc2IGcHJvdG8zCuECCh1wcm90by9hdXRvb3BzL29wc19jb3VudC5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMi8QEKCE9wc0NvdW50Eg4KAmlkGAEgASgJUgJpZBInChBhdXRvX29wc19ydWxlX2lkGAIgASgJUg1hdXRvT3BzUnVsZUlkEhsKCWNsYXVzZV9pZBgDIAEoCVIIY2xhdXNlSWQSHQoKdXBkYXRlZF9hdBgEIAEoA1IJdXBkYXRlZEF0EiYKD29wc19ldmVudF9jb3VudBgFIAEoA1INb3BzRXZlbnRDb3VudBIpChBldmFsdWF0aW9uX2NvdW50GAYgASgDUg9ldmFsdWF0aW9uQ291bnQSHQoKZmVhdHVyZV9pZBgHIAEoCVIJZmVhdHVyZUlkQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRvb3BzYgZwcm90bzMK8y8KG3Byb3RvL2F1dG9vcHMvc2VydmljZS5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMaIXByb3RvL2F1dG9vcHMvYXV0b19vcHNfcnVsZS5wcm90bxobcHJvdG8vYXV0b29wcy9jb21tYW5kLnByb3RvGh1wcm90by9hdXRvb3BzL29wc19jb3VudC5wcm90bxoncHJvdG8vYXV0b29wcy9wcm9ncmVzc2l2ZV9yb2xsb3V0LnByb3RvIlwKFUdldEF1dG9PcHNSdWxlUmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEg4KAmlkGAIgASgJUgJpZCJcChZHZXRBdXRvT3BzUnVsZVJlc3BvbnNlEkIKDWF1dG9fb3BzX3J1bGUYASABKAsyHi5idWNrZXRlZXIuYXV0b29wcy5BdXRvT3BzUnVsZVILYXV0b09wc1J1bGUilgEKGENyZWF0ZUF1dG9PcHNSdWxlUmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEkUKB2NvbW1hbmQYAiABKAsyKy5idWNrZXRlZXIuYXV0b29wcy5DcmVhdGVBdXRvT3BzUnVsZUNvbW1hbmRSB2NvbW1hbmQiGwoZQ3JlYXRlQXV0b09wc1J1bGVSZXNwb25zZSKkAQoXTGlzdEF1dG9PcHNSdWxlc1JlcXVlc3QSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAEgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRIbCglwYWdlX3NpemUYAiABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgDIAEoCVIGY3Vyc29yEh8KC2ZlYXR1cmVfaWRzGAQgAygJUgpmZWF0dXJlSWRzIngKGExpc3RBdXRvT3BzUnVsZXNSZXNwb25zZRJECg5hdXRvX29wc19ydWxlcxgBIAMoCzIeLmJ1Y2tldGVlci5hdXRvb3BzLkF1dG9PcHNSdWxlUgxhdXRvT3BzUnVsZXMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3IipgEKGERlbGV0ZUF1dG9PcHNSdWxlUmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEg4KAmlkGAIgASgJUgJpZBJFCgdjb21tYW5kGAMgASgLMisuYnVja2V0ZWVyLmF1dG9vcHMuRGVsZXRlQXV0b09wc1J1bGVDb21tYW5kUgdjb21tYW5kIhsKGURlbGV0ZUF1dG9PcHNSdWxlUmVzcG9uc2UiqQYKGFVwZGF0ZUF1dG9PcHNSdWxlUmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEg4KAmlkGAIgASgJUgJpZBKCAQolY2hhbmdlX2F1dG9fb3BzX3J1bGVfb3BzX3R5cGVfY29tbWFuZBgDIAEoCzIyLmJ1Y2tldGVlci5hdXRvb3BzLkNoYW5nZUF1dG9PcHNSdWxlT3BzVHlwZUNvbW1hbmRSH2NoYW5nZUF1dG9PcHNSdWxlT3BzVHlwZUNvbW1hbmQSegoiYWRkX29wc19ldmVudF9yYXRlX2NsYXVzZV9jb21tYW5kcxgEIAMoCzIvLmJ1Y2tldGVlci5hdXRvb3BzLkFkZE9wc0V2ZW50UmF0ZUNsYXVzZUNvbW1hbmRSHWFkZE9wc0V2ZW50UmF0ZUNsYXVzZUNvbW1hbmRzEoMBCiVjaGFuZ2Vfb3BzX2V2ZW50X3JhdGVfY2xhdXNlX2NvbW1hbmRzGAUgAygLMjIuYnVja2V0ZWVyLmF1dG9vcHMuQ2hhbmdlT3BzRXZlbnRSYXRlQ2xhdXNlQ29tbWFuZFIgY2hhbmdlT3BzRXZlbnRSYXRlQ2xhdXNlQ29tbWFuZHMSXAoWZGVsZXRlX2NsYXVzZV9jb21tYW5kcxgGIAMoCzImLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZUNsYXVzZUNvbW1hbmRSFGRlbGV0ZUNsYXVzZUNvbW1hbmRzEmwKHGFkZF9kYXRldGltZV9jbGF1c2VfY29tbWFuZHMYByADKAsyKy5idWNrZXRlZXIuYXV0b29wcy5BZGREYXRldGltZUNsYXVzZUNvbW1hbmRSGWFkZERhdGV0aW1lQ2xhdXNlQ29tbWFuZHMSdQofY2hhbmdlX2RhdGV0aW1lX2NsYXVzZV9jb21tYW5kcxgIIAMoCzIuLmJ1Y2tldGVlci5hdXRvb3BzLkNoYW5nZURhdGV0aW1lQ2xhdXNlQ29tbWFuZFIcY2hhbmdlRGF0ZXRpbWVDbGF1c2VDb21tYW5kcyIbChlVcGRhdGVBdXRvT3BzUnVsZVJlc3BvbnNlIu0BChVFeGVjdXRlQXV0b09wc1JlcXVlc3QSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAEgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRIOCgJpZBgCIAEoCVICaWQSjgEKKWNoYW5nZV9hdXRvX29wc19ydWxlX3RyaWdnZXJlZF9hdF9jb21tYW5kGAMgASgLMjYuYnVja2V0ZWVyLmF1dG9vcHMuQ2hhbmdlQXV0b09wc1J1bGVUcmlnZ2VyZWRBdENvbW1hbmRSI2NoYW5nZUF1dG9PcHNSdWxlVHJpZ2dlcmVkQXRDb21tYW5kIkUKFkV4ZWN1dGVBdXRvT3BzUmVzcG9uc2USKwoRYWxyZWFkeV90cmlnZ2VyZWQYASABKAhSEGFscmVhZHlUcmlnZ2VyZWQizAEKFExpc3RPcHNDb3VudHNSZXF1ZXN0EjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgBIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USGwoJcGFnZV9zaXplGAIgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchIpChFhdXRvX29wc19ydWxlX2lkcxgEIAMoCVIOYXV0b09wc1J1bGVJZHMSHwoLZmVhdHVyZV9pZHMYBSADKAlSCmZlYXR1cmVJZHMiawoVTGlzdE9wc0NvdW50c1Jlc3BvbnNlEhYKBmN1cnNvchgBIAEoCVIGY3Vyc29yEjoKCm9wc19jb3VudHMYAiADKAsyGy5idWNrZXRlZXIuYXV0b29wcy5PcHNDb3VudFIJb3BzQ291bnRzIqQBCh9DcmVhdGVQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0EjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgBIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USTAoHY29tbWFuZBgCIAEoCzIyLmJ1Y2tldGVlci5hdXRvb3BzLkNyZWF0ZVByb2dyZXNzaXZlUm9sbG91dENvbW1hbmRSB2NvbW1hbmQiIgogQ3JlYXRlUHJvZ3Jlc3NpdmVSb2xsb3V0UmVzcG9uc2UiYwocR2V0UHJvZ3Jlc3NpdmVSb2xsb3V0UmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEg4KAmlkGAIgASgJUgJpZCJ3Ch1HZXRQcm9ncmVzc2l2ZVJvbGxvdXRSZXNwb25zZRJWChNwcm9ncmVzc2l2ZV9yb2xsb3V0GAEgASgLMiUuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0UhJwcm9ncmVzc2l2ZVJvbGxvdXQisAEKHVN0b3BQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0EjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgBIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USDgoCaWQYAiABKAlSAmlkEkoKB2NvbW1hbmQYAyABKAsyMC5idWNrZXRlZXIuYXV0b29wcy5TdG9wUHJvZ3Jlc3NpdmVSb2xsb3V0Q29tbWFuZFIHY29tbWFuZCIgCh5TdG9wUHJvZ3Jlc3NpdmVSb2xsb3V0UmVzcG9uc2UitAEKH0RlbGV0ZVByb2dyZXNzaXZlUm9sbG91dFJlcXVlc3QSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAEgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRIOCgJpZBgCIAEoCVICaWQSTAoHY29tbWFuZBgDIAEoCzIyLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZVByb2dyZXNzaXZlUm9sbG91dENvbW1hbmRSB2NvbW1hbmQiIgogRGVsZXRlUHJvZ3Jlc3NpdmVSb2xsb3V0UmVzcG9uc2Ui7QQKHkxpc3RQcm9ncmVzc2l2ZVJvbGxvdXRzUmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEhsKCXBhZ2Vfc2l6ZRgCIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAMgASgJUgZjdXJzb3ISHwoLZmVhdHVyZV9pZHMYBCADKAlSCmZlYXR1cmVJZHMSVAoIb3JkZXJfYnkYBSABKA4yOS5idWNrZXRlZXIuYXV0b29wcy5MaXN0UHJvZ3Jlc3NpdmVSb2xsb3V0c1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJpCg9vcmRlcl9kaXJlY3Rpb24YBiABKA4yQC5idWNrZXRlZXIuYXV0b29wcy5MaXN0UHJvZ3Jlc3NpdmVSb2xsb3V0c1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEkkKBnN0YXR1cxgHIAEoDjIsLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5TdGF0dXNIAFIGc3RhdHVziAEBEkMKBHR5cGUYCCABKA4yKi5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuVHlwZUgBUgR0eXBliAEBIjYKB09yZGVyQnkSCwoHREVGQVVMVBAAEg4KCkNSRUFURURfQVQQARIOCgpVUERBVEVEX0FUEAIiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABQgkKB19zdGF0dXNCBwoFX3R5cGUitAEKH0xpc3RQcm9ncmVzc2l2ZVJvbGxvdXRzUmVzcG9uc2USWAoUcHJvZ3Jlc3NpdmVfcm9sbG91dHMYASADKAsyJS5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRSE3Byb2dyZXNzaXZlUm9sbG91dHMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQilAIKIEV4ZWN1dGVQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0EjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgBIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USDgoCaWQYAiABKAlSAmlkEqoBCi9jaGFuZ2VfcHJvZ3Jlc3NpdmVfcm9sbG91dF90cmlnZ2VyZWRfYXRfY29tbWFuZBgDIAEoCzJFLmJ1Y2tldGVlci5hdXRvb3BzLkNoYW5nZVByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlVHJpZ2dlcmVkQXRDb21tYW5kUipjaGFuZ2VQcm9ncmVzc2l2ZVJvbGxvdXRUcmlnZ2VyZWRBdENvbW1hbmQiIwohRXhlY3V0ZVByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlMqwMCg5BdXRvT3BzU2VydmljZRJnCg5HZXRBdXRvT3BzUnVsZRIoLmJ1Y2tldGVlci5hdXRvb3BzLkdldEF1dG9PcHNSdWxlUmVxdWVzdBopLmJ1Y2tldGVlci5hdXRvb3BzLkdldEF1dG9PcHNSdWxlUmVzcG9uc2UiABJtChBMaXN0QXV0b09wc1J1bGVzEiouYnVja2V0ZWVyLmF1dG9vcHMuTGlzdEF1dG9PcHNSdWxlc1JlcXVlc3QaKy5idWNrZXRlZXIuYXV0b29wcy5MaXN0QXV0b09wc1J1bGVzUmVzcG9uc2UiABJwChFDcmVhdGVBdXRvT3BzUnVsZRIrLmJ1Y2tldGVlci5hdXRvb3BzLkNyZWF0ZUF1dG9PcHNSdWxlUmVxdWVzdBosLmJ1Y2tldGVlci5hdXRvb3BzLkNyZWF0ZUF1dG9PcHNSdWxlUmVzcG9uc2UiABJwChFEZWxldGVBdXRvT3BzUnVsZRIrLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZUF1dG9PcHNSdWxlUmVxdWVzdBosLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZUF1dG9PcHNSdWxlUmVzcG9uc2UiABJwChFVcGRhdGVBdXRvT3BzUnVsZRIrLmJ1Y2tldGVlci5hdXRvb3BzLlVwZGF0ZUF1dG9PcHNSdWxlUmVxdWVzdBosLmJ1Y2tldGVlci5hdXRvb3BzLlVwZGF0ZUF1dG9PcHNSdWxlUmVzcG9uc2UiABJnCg5FeGVjdXRlQXV0b09wcxIoLmJ1Y2tldGVlci5hdXRvb3BzLkV4ZWN1dGVBdXRvT3BzUmVxdWVzdBopLmJ1Y2tldGVlci5hdXRvb3BzLkV4ZWN1dGVBdXRvT3BzUmVzcG9uc2UiABJkCg1MaXN0T3BzQ291bnRzEicuYnVja2V0ZWVyLmF1dG9vcHMuTGlzdE9wc0NvdW50c1JlcXVlc3QaKC5idWNrZXRlZXIuYXV0b29wcy5MaXN0T3BzQ291bnRzUmVzcG9uc2UiABKFAQoYQ3JlYXRlUHJvZ3Jlc3NpdmVSb2xsb3V0EjIuYnVja2V0ZWVyLmF1dG9vcHMuQ3JlYXRlUHJvZ3Jlc3NpdmVSb2xsb3V0UmVxdWVzdBozLmJ1Y2tldGVlci5hdXRvb3BzLkNyZWF0ZVByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIgASfAoVR2V0UHJvZ3Jlc3NpdmVSb2xsb3V0Ei8uYnVja2V0ZWVyLmF1dG9vcHMuR2V0UHJvZ3Jlc3NpdmVSb2xsb3V0UmVxdWVzdBowLmJ1Y2tldGVlci5hdXRvb3BzLkdldFByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIgASfwoWU3RvcFByb2dyZXNzaXZlUm9sbG91dBIwLmJ1Y2tldGVlci5hdXRvb3BzLlN0b3BQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0GjEuYnVja2V0ZWVyLmF1dG9vcHMuU3RvcFByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIgAShQEKGERlbGV0ZVByb2dyZXNzaXZlUm9sbG91dBIyLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZVByb2dyZXNzaXZlUm9sbG91dFJlcXVlc3QaMy5idWNrZXRlZXIuYXV0b29wcy5EZWxldGVQcm9ncmVzc2l2ZVJvbGxvdXRSZXNwb25zZSIAEoIBChdMaXN0UHJvZ3Jlc3NpdmVSb2xsb3V0cxIxLmJ1Y2tldGVlci5hdXRvb3BzLkxpc3RQcm9ncmVzc2l2ZVJvbGxvdXRzUmVxdWVzdBoyLmJ1Y2tldGVlci5hdXRvb3BzLkxpc3RQcm9ncmVzc2l2ZVJvbGxvdXRzUmVzcG9uc2UiABKIAQoZRXhlY3V0ZVByb2dyZXNzaXZlUm9sbG91dBIzLmJ1Y2tldGVlci5hdXRvb3BzLkV4ZWN1dGVQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0GjQuYnVja2V0ZWVyLmF1dG9vcHMuRXhlY3V0ZVByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIgBCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1dG9vcHNiBnByb3RvMw== authDescriptor: CsgCChZwcm90by9hdXRoL3Rva2VuLnByb3RvEg5idWNrZXRlZXIuYXV0aCKhAQoFVG9rZW4SIQoMYWNjZXNzX3Rva2VuGAEgASgJUgthY2Nlc3NUb2tlbhIdCgp0b2tlbl90eXBlGAIgASgJUgl0b2tlblR5cGUSIwoNcmVmcmVzaF90b2tlbhgDIAEoCVIMcmVmcmVzaFRva2VuEhYKBmV4cGlyeRgEIAEoA1IGZXhwaXJ5EhkKCGlkX3Rva2VuGAUgASgJUgdpZFRva2VuIkIKDklEVG9rZW5TdWJqZWN0EhcKB3VzZXJfaWQYASABKAlSBnVzZXJJZBIXCgdjb25uX2lkGAIgASgJUgZjb25uSWRCLlosZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1dGhiBnByb3RvMwrbBgoYcHJvdG8vYXV0aC9zZXJ2aWNlLnByb3RvEg5idWNrZXRlZXIuYXV0aBoWcHJvdG8vYXV0aC90b2tlbi5wcm90byJQChVHZXRBdXRoQ29kZVVSTFJlcXVlc3QSFAoFc3RhdGUYASABKAlSBXN0YXRlEiEKDHJlZGlyZWN0X3VybBgCIAEoCVILcmVkaXJlY3RVcmwiKgoWR2V0QXV0aENvZGVVUkxSZXNwb25zZRIQCgN1cmwYASABKAlSA3VybCJNChRFeGNoYW5nZVRva2VuUmVxdWVzdBISCgRjb2RlGAEgASgJUgRjb2RlEiEKDHJlZGlyZWN0X3VybBgCIAEoCVILcmVkaXJlY3RVcmwiRAoVRXhjaGFuZ2VUb2tlblJlc3BvbnNlEisKBXRva2VuGAEgASgLMhUuYnVja2V0ZWVyLmF1dGguVG9rZW5SBXRva2VuIl0KE1JlZnJlc2hUb2tlblJlcXVlc3QSIwoNcmVmcmVzaF90b2tlbhgBIAEoCVIMcmVmcmVzaFRva2VuEiEKDHJlZGlyZWN0X3VybBgCIAEoCVILcmVkaXJlY3RVcmwiQwoUUmVmcmVzaFRva2VuUmVzcG9uc2USKwoFdG9rZW4YASABKAsyFS5idWNrZXRlZXIuYXV0aC5Ub2tlblIFdG9rZW4ypwIKC0F1dGhTZXJ2aWNlEl8KDkdldEF1dGhDb2RlVVJMEiUuYnVja2V0ZWVyLmF1dGguR2V0QXV0aENvZGVVUkxSZXF1ZXN0GiYuYnVja2V0ZWVyLmF1dGguR2V0QXV0aENvZGVVUkxSZXNwb25zZRJcCg1FeGNoYW5nZVRva2VuEiQuYnVja2V0ZWVyLmF1dGguRXhjaGFuZ2VUb2tlblJlcXVlc3QaJS5idWNrZXRlZXIuYXV0aC5FeGNoYW5nZVRva2VuUmVzcG9uc2USWQoMUmVmcmVzaFRva2VuEiMuYnVja2V0ZWVyLmF1dGguUmVmcmVzaFRva2VuUmVxdWVzdBokLmJ1Y2tldGVlci5hdXRoLlJlZnJlc2hUb2tlblJlc3BvbnNlQi5aLGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRoYgZwcm90bzM= @@ -29,33 +12,3 @@ envoy: migrationDescriptor: CqwECiNwcm90by9taWdyYXRpb24vbXlzcWxfc2VydmljZS5wcm90bxITYnVja2V0ZWVyLm1pZ3JhdGlvbiIfCh1NaWdyYXRlQWxsTWFzdGVyU2NoZW1hUmVxdWVzdCIgCh5NaWdyYXRlQWxsTWFzdGVyU2NoZW1hUmVzcG9uc2UiMQobUm9sbGJhY2tNYXN0ZXJTY2hlbWFSZXF1ZXN0EhIKBHN0ZXAYASABKANSBHN0ZXAiHgocUm9sbGJhY2tNYXN0ZXJTY2hlbWFSZXNwb25zZTKcAgoVTWlncmF0aW9uTXlTUUxTZXJ2aWNlEoMBChZNaWdyYXRlQWxsTWFzdGVyU2NoZW1hEjIuYnVja2V0ZWVyLm1pZ3JhdGlvbi5NaWdyYXRlQWxsTWFzdGVyU2NoZW1hUmVxdWVzdBozLmJ1Y2tldGVlci5taWdyYXRpb24uTWlncmF0ZUFsbE1hc3RlclNjaGVtYVJlc3BvbnNlIgASfQoUUm9sbGJhY2tNYXN0ZXJTY2hlbWESMC5idWNrZXRlZXIubWlncmF0aW9uLlJvbGxiYWNrTWFzdGVyU2NoZW1hUmVxdWVzdBoxLmJ1Y2tldGVlci5taWdyYXRpb24uUm9sbGJhY2tNYXN0ZXJTY2hlbWFSZXNwb25zZSIAQjNaMWdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9taWdyYXRpb25iBnByb3RvMw== experimentcalculatorDescriptor: CtYBCh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiZwoJVmFyaWF0aW9uEg4KAmlkGAEgASgJUgJpZBIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUSEgoEbmFtZRgDIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb25CMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwq8BwohcHJvdG8vZXhwZXJpbWVudC9leHBlcmltZW50LnByb3RvEhRidWNrZXRlZXIuZXhwZXJpbWVudBodcHJvdG8vZmVhdHVyZS92YXJpYXRpb24ucHJvdG8i0AUKCkV4cGVyaW1lbnQSDgoCaWQYASABKAlSAmlkEhsKB2dvYWxfaWQYAiABKAlCAhgBUgZnb2FsSWQSHQoKZmVhdHVyZV9pZBgDIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgEIAEoBVIOZmVhdHVyZVZlcnNpb24SPAoKdmFyaWF0aW9ucxgFIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxIZCghzdGFydF9hdBgGIAEoA1IHc3RhcnRBdBIXCgdzdG9wX2F0GAcgASgDUgZzdG9wQXQSHAoHc3RvcHBlZBgIIAEoCEICGAFSB3N0b3BwZWQSIQoKc3RvcHBlZF9hdBgJIAEoA0ICMAFSCXN0b3BwZWRBdBIdCgpjcmVhdGVkX2F0GAogASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgLIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYDCABKAhSB2RlbGV0ZWQSGQoIZ29hbF9pZHMYDSADKAlSB2dvYWxJZHMSEgoEbmFtZRgOIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgPIAEoCVILZGVzY3JpcHRpb24SKgoRYmFzZV92YXJpYXRpb25faWQYECABKAlSD2Jhc2VWYXJpYXRpb25JZBI/CgZzdGF0dXMYEiABKA4yJy5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50LlN0YXR1c1IGc3RhdHVzEh4KCm1haW50YWluZXIYEyABKAlSCm1haW50YWluZXISGgoIYXJjaGl2ZWQYFCABKAhSCGFyY2hpdmVkIkIKBlN0YXR1cxILCgdXQUlUSU5HEAASCwoHUlVOTklORxABEgsKB1NUT1BQRUQQAhIRCg1GT1JDRV9TVE9QUEVEEANKBAgREBIiUQoLRXhwZXJpbWVudHMSQgoLZXhwZXJpbWVudHMYASADKAsyIC5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50UgtleHBlcmltZW50c0I0WjJnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXhwZXJpbWVudGIGcHJvdG8zCuADCihwcm90by9leHBlcmltZW50Y2FsY3VsYXRvci9zZXJ2aWNlLnByb3RvEh5idWNrZXRlZXIuZXhwZXJpbWVudGNhbGN1bGF0b3IaIXByb3RvL2V4cGVyaW1lbnQvZXhwZXJpbWVudC5wcm90byJ7ChBCYXRjaENhbGNSZXF1ZXN0EiUKDmVudmlyb25tZW50X2lkGAEgASgJUg1lbnZpcm9ubWVudElkEkAKCmV4cGVyaW1lbnQYAiABKAsyIC5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50UgpleHBlcmltZW50IhMKEUJhdGNoQ2FsY1Jlc3BvbnNlMpYBChtFeHBlcmltZW50Q2FsY3VsYXRvclNlcnZpY2USdwoOQ2FsY0V4cGVyaW1lbnQSMC5idWNrZXRlZXIuZXhwZXJpbWVudGNhbGN1bGF0b3IuQmF0Y2hDYWxjUmVxdWVzdBoxLmJ1Y2tldGVlci5leHBlcmltZW50Y2FsY3VsYXRvci5CYXRjaENhbGNSZXNwb25zZSIAQj5aPGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9leHBlcmltZW50Y2FsY3VsYXRvcmIGcHJvdG8z auditlogDescriptor: CuQBChlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiNgoDQW55EhkKCHR5cGVfdXJsGAEgASgJUgd0eXBlVXJsEhQKBXZhbHVlGAIgASgMUgV2YWx1ZUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQghBbnlQcm90b1ABWixnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9hbnlwYqICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCoYECh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIjCgtEb3VibGVWYWx1ZRIUCgV2YWx1ZRgBIAEoAVIFdmFsdWUiIgoKRmxvYXRWYWx1ZRIUCgV2YWx1ZRgBIAEoAlIFdmFsdWUiIgoKSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoA1IFdmFsdWUiIwoLVUludDY0VmFsdWUSFAoFdmFsdWUYASABKARSBXZhbHVlIiIKCkludDMyVmFsdWUSFAoFdmFsdWUYASABKAVSBXZhbHVlIiMKC1VJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgNUgV2YWx1ZSIhCglCb29sVmFsdWUSFAoFdmFsdWUYASABKAhSBXZhbHVlIiMKC1N0cmluZ1ZhbHVlEhQKBXZhbHVlGAEgASgJUgV2YWx1ZSIiCgpCeXRlc1ZhbHVlEhQKBXZhbHVlGAEgASgMUgV2YWx1ZUKDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINV3JhcHBlcnNQcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi93cmFwcGVyc3Bi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKoAMKGnByb3RvL2ZlYXR1cmUvY2xhdXNlLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSKzAgoGQ2xhdXNlEg4KAmlkGAEgASgJUgJpZBIcCglhdHRyaWJ1dGUYAiABKAlSCWF0dHJpYnV0ZRI+CghvcGVyYXRvchgDIAEoDjIiLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZS5PcGVyYXRvclIIb3BlcmF0b3ISFgoGdmFsdWVzGAQgAygJUgZ2YWx1ZXMiogEKCE9wZXJhdG9yEgoKBkVRVUFMUxAAEgYKAklOEAESDQoJRU5EU19XSVRIEAISDwoLU1RBUlRTX1dJVEgQAxILCgdTRUdNRU5UEAQSCwoHR1JFQVRFUhAFEhQKEEdSRUFURVJfT1JfRVFVQUwQBhIICgRMRVNTEAcSEQoNTEVTU19PUl9FUVVBTBAIEgoKBkJFRk9SRRAJEgkKBUFGVEVSEApCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwq7BAoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiLQoNRml4ZWRTdHJhdGVneRIcCgl2YXJpYXRpb24YASABKAlSCXZhcmlhdGlvbiKiAQoPUm9sbG91dFN0cmF0ZWd5EkwKCnZhcmlhdGlvbnMYASADKAsyLC5idWNrZXRlZXIuZmVhdHVyZS5Sb2xsb3V0U3RyYXRlZ3kuVmFyaWF0aW9uUgp2YXJpYXRpb25zGkEKCVZhcmlhdGlvbhIcCgl2YXJpYXRpb24YASABKAlSCXZhcmlhdGlvbhIWCgZ3ZWlnaHQYAiABKAVSBndlaWdodCL4AQoIU3RyYXRlZ3kSNAoEdHlwZRgBIAEoDjIgLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5LlR5cGVSBHR5cGUSRwoOZml4ZWRfc3RyYXRlZ3kYAiABKAsyIC5idWNrZXRlZXIuZmVhdHVyZS5GaXhlZFN0cmF0ZWd5Ug1maXhlZFN0cmF0ZWd5Ek0KEHJvbGxvdXRfc3RyYXRlZ3kYAyABKAsyIi5idWNrZXRlZXIuZmVhdHVyZS5Sb2xsb3V0U3RyYXRlZ3lSD3JvbGxvdXRTdHJhdGVneSIeCgRUeXBlEgkKBUZJWEVEEAASCwoHUk9MTE9VVBABQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKqQIKGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGnByb3RvL2ZlYXR1cmUvY2xhdXNlLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvIoQBCgRSdWxlEg4KAmlkGAEgASgJUgJpZBI3CghzdHJhdGVneRgCIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5UghzdHJhdGVneRIzCgdjbGF1c2VzGAMgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlUgdjbGF1c2VzQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKqAEKGnByb3RvL2ZlYXR1cmUvdGFyZ2V0LnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSI8CgZUYXJnZXQSHAoJdmFyaWF0aW9uGAEgASgJUgl2YXJpYXRpb24SFAoFdXNlcnMYAiADKAlSBXVzZXJzQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMK1gEKHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSJnCglWYXJpYXRpb24SDgoCaWQYASABKAlSAmlkEhQKBXZhbHVlGAIgASgJUgV2YWx1ZRISCgRuYW1lGAMgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCvQCCipwcm90by9mZWF0dXJlL2ZlYXR1cmVfbGFzdF91c2VkX2luZm8ucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlIvcBChNGZWF0dXJlTGFzdFVzZWRJbmZvEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIYCgd2ZXJzaW9uGAIgASgFUgd2ZXJzaW9uEiAKDGxhc3RfdXNlZF9hdBgDIAEoA1IKbGFzdFVzZWRBdBIdCgpjcmVhdGVkX2F0GAQgASgDUgljcmVhdGVkQXQSMgoVY2xpZW50X29sZGVzdF92ZXJzaW9uGAUgASgJUhNjbGllbnRPbGRlc3RWZXJzaW9uEjIKFWNsaWVudF9sYXRlc3RfdmVyc2lvbhgGIAEoCVITY2xpZW50TGF0ZXN0VmVyc2lvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCsIBCiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiUAoMUHJlcmVxdWlzaXRlEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIhCgx2YXJpYXRpb25faWQYAiABKAlSC3ZhcmlhdGlvbklkQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKmgsKG3Byb3RvL2ZlYXR1cmUvZmVhdHVyZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxoacHJvdG8vZmVhdHVyZS90YXJnZXQucHJvdG8aHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvGipwcm90by9mZWF0dXJlL2ZlYXR1cmVfbGFzdF91c2VkX2luZm8ucHJvdG8aIHByb3RvL2ZlYXR1cmUvcHJlcmVxdWlzaXRlLnByb3RvItIHCgdGZWF0dXJlEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhIYCgdlbmFibGVkGAQgASgIUgdlbmFibGVkEhgKB2RlbGV0ZWQYBSABKAhSB2RlbGV0ZWQSOQoWZXZhbHVhdGlvbl91bmRlbGF5YWJsZRgGIAEoCEICGAFSFWV2YWx1YXRpb25VbmRlbGF5YWJsZRIQCgN0dGwYByABKAVSA3R0bBIYCgd2ZXJzaW9uGAggASgFUgd2ZXJzaW9uEh0KCmNyZWF0ZWRfYXQYCSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAogASgDUgl1cGRhdGVkQXQSPAoKdmFyaWF0aW9ucxgLIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxIzCgd0YXJnZXRzGAwgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuVGFyZ2V0Ugd0YXJnZXRzEi0KBXJ1bGVzGA0gAygLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIFcnVsZXMSRgoQZGVmYXVsdF9zdHJhdGVneRgOIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5Ug9kZWZhdWx0U3RyYXRlZ3kSIwoNb2ZmX3ZhcmlhdGlvbhgPIAEoCVIMb2ZmVmFyaWF0aW9uEhIKBHRhZ3MYECADKAlSBHRhZ3MSTAoObGFzdF91c2VkX2luZm8YESABKAsyJi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlTGFzdFVzZWRJbmZvUgxsYXN0VXNlZEluZm8SHgoKbWFpbnRhaW5lchgSIAEoCVIKbWFpbnRhaW5lchJPCg52YXJpYXRpb25fdHlwZRgTIAEoDjIoLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmUuVmFyaWF0aW9uVHlwZVINdmFyaWF0aW9uVHlwZRIaCghhcmNoaXZlZBgUIAEoCFIIYXJjaGl2ZWQSRQoNcHJlcmVxdWlzaXRlcxgVIAMoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVINcHJlcmVxdWlzaXRlcxIjCg1zYW1wbGluZ19zZWVkGBYgASgJUgxzYW1wbGluZ1NlZWQiPgoNVmFyaWF0aW9uVHlwZRIKCgZTVFJJTkcQABILCgdCT09MRUFOEAESCgoGTlVNQkVSEAISCAoESlNPThADIkIKCEZlYXR1cmVzEjYKCGZlYXR1cmVzGAEgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIIZmVhdHVyZXMiUwoDVGFnEg4KAmlkGAEgASgJUgJpZBIdCgpjcmVhdGVkX2F0GAIgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgDIAEoA1IJdXBkYXRlZEF0QjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKlQgKG3Byb3RvL2ZlYXR1cmUvc2VnbWVudC5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxobcHJvdG8vZmVhdHVyZS9mZWF0dXJlLnByb3RvIrQECgdTZWdtZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhItCgVydWxlcxgEIAMoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBXJ1bGVzEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQSHAoHdmVyc2lvbhgHIAEoA0ICGAFSB3ZlcnNpb24SGAoHZGVsZXRlZBgIIAEoCFIHZGVsZXRlZBIuChNpbmNsdWRlZF91c2VyX2NvdW50GAkgASgDUhFpbmNsdWRlZFVzZXJDb3VudBIyChNleGNsdWRlZF91c2VyX2NvdW50GAogASgDQgIYAVIRZXhjbHVkZWRVc2VyQ291bnQSOQoGc3RhdHVzGAsgASgOMiEuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudC5TdGF0dXNSBnN0YXR1cxInChBpc19pbl91c2Vfc3RhdHVzGAwgASgIUg1pc0luVXNlU3RhdHVzEjYKCGZlYXR1cmVzGA0gAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIIZmVhdHVyZXMiPgoGU3RhdHVzEgsKB0lOSVRJQUwQABINCglVUExPQURJTkcQARIMCghTVUNFRURFRBACEgoKBkZBSUxFRBADItQBCgtTZWdtZW50VXNlchIOCgJpZBgBIAEoCVICaWQSHQoKc2VnbWVudF9pZBgCIAEoCVIJc2VnbWVudElkEhcKB3VzZXJfaWQYAyABKAlSBnVzZXJJZBI6CgVzdGF0ZRgEIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZRIYCgdkZWxldGVkGAUgASgIUgdkZWxldGVkIicKBVN0YXRlEgwKCElOQ0xVREVEEAASEAoIRVhDTFVERUQQARoCCAEiYwoMU2VnbWVudFVzZXJzEh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBI0CgV1c2VycxgCIAMoCzIeLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyUgV1c2Vyc0IxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCpADCiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90bxIVYnVja2V0ZWVyLmVudmlyb25tZW50IpICCg1FbnZpcm9ubWVudFYyEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEhkKCHVybF9jb2RlGAMgASgJUgd1cmxDb2RlEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbhIdCgpwcm9qZWN0X2lkGAUgASgJUglwcm9qZWN0SWQSGgoIYXJjaGl2ZWQYBiABKAhSCGFyY2hpdmVkEh0KCmNyZWF0ZWRfYXQYByABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAggASgDUgl1cGRhdGVkQXQSJwoPb3JnYW5pemF0aW9uX2lkGAkgASgJUg5vcmdhbml6YXRpb25JZEI1WjNnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZW52aXJvbm1lbnRiBnByb3RvMwqiAwofcHJvdG8vZW52aXJvbm1lbnQvcHJvamVjdC5wcm90bxIVYnVja2V0ZWVyLmVudmlyb25tZW50IqgCCgdQcm9qZWN0Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SGgoIZGlzYWJsZWQYAyABKAhSCGRpc2FibGVkEhQKBXRyaWFsGAQgASgIUgV0cmlhbBIjCg1jcmVhdG9yX2VtYWlsGAUgASgJUgxjcmVhdG9yRW1haWwSHQoKY3JlYXRlZF9hdBgGIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYByABKANSCXVwZGF0ZWRBdBISCgRuYW1lGAggASgJUgRuYW1lEhkKCHVybF9jb2RlGAkgASgJUgd1cmxDb2RlEicKD29yZ2FuaXphdGlvbl9pZBgKIAEoCVIOb3JnYW5pemF0aW9uSWRCNVozZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2Vudmlyb25tZW50YgZwcm90bzMKnQMKJHByb3RvL2Vudmlyb25tZW50L29yZ2FuaXphdGlvbi5wcm90bxIVYnVja2V0ZWVyLmVudmlyb25tZW50Ip4CCgxPcmdhbml6YXRpb24SDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSGQoIdXJsX2NvZGUYAyABKAlSB3VybENvZGUSIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uEhoKCGRpc2FibGVkGAUgASgIUghkaXNhYmxlZBIaCghhcmNoaXZlZBgGIAEoCFIIYXJjaGl2ZWQSFAoFdHJpYWwYByABKAhSBXRyaWFsEh0KCmNyZWF0ZWRfYXQYCCABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAkgASgDUgl1cGRhdGVkQXQSIQoMc3lzdGVtX2FkbWluGAogASgIUgtzeXN0ZW1BZG1pbkI1WjNnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZW52aXJvbm1lbnRiBnByb3RvMwrcDgobcHJvdG8vYWNjb3VudC9hY2NvdW50LnByb3RvEhFidWNrZXRlZXIuYWNjb3VudBojcHJvdG8vZW52aXJvbm1lbnQvZW52aXJvbm1lbnQucHJvdG8aH3Byb3RvL2Vudmlyb25tZW50L3Byb2plY3QucHJvdG8aJHByb3RvL2Vudmlyb25tZW50L29yZ2FuaXphdGlvbi5wcm90byKrAgoHQWNjb3VudBIOCgJpZBgBIAEoCVICaWQSFAoFZW1haWwYAiABKAlSBWVtYWlsEhIKBG5hbWUYAyABKAlSBG5hbWUSMwoEcm9sZRgEIAEoDjIfLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnQuUm9sZVIEcm9sZRIaCghkaXNhYmxlZBgFIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgGIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYByABKANSCXVwZGF0ZWRBdBIYCgdkZWxldGVkGAggASgIUgdkZWxldGVkIjkKBFJvbGUSCgoGVklFV0VSEAASCgoGRURJVE9SEAESCQoFT1dORVIQAhIOCgpVTkFTU0lHTkVEEGM6AhgBIvEFCglBY2NvdW50VjISFAoFZW1haWwYASABKAlSBWVtYWlsEhIKBG5hbWUYAiABKAlSBG5hbWUSKAoQYXZhdGFyX2ltYWdlX3VybBgDIAEoCVIOYXZhdGFySW1hZ2VVcmwSJwoPb3JnYW5pemF0aW9uX2lkGAQgASgJUg5vcmdhbml6YXRpb25JZBJbChFvcmdhbml6YXRpb25fcm9sZRgFIAEoDjIuLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLk9yZ2FuaXphdGlvblIQb3JnYW5pemF0aW9uUm9sZRJZChFlbnZpcm9ubWVudF9yb2xlcxgGIAMoCzIsLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5FbnZpcm9ubWVudFJvbGVSEGVudmlyb25tZW50Um9sZXMSGgoIZGlzYWJsZWQYByABKAhSCGRpc2FibGVkEh0KCmNyZWF0ZWRfYXQYCCABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAkgASgDUgl1cGRhdGVkQXQa1wEKBFJvbGUiWQoLRW52aXJvbm1lbnQSGgoWRW52aXJvbm1lbnRfVU5BU1NJR05FRBAAEhYKEkVudmlyb25tZW50X1ZJRVdFUhABEhYKEkVudmlyb25tZW50X0VESVRPUhACInQKDE9yZ2FuaXphdGlvbhIbChdPcmdhbml6YXRpb25fVU5BU1NJR05FRBAAEhcKE09yZ2FuaXphdGlvbl9NRU1CRVIQARIWChJPcmdhbml6YXRpb25fQURNSU4QAhIWChJPcmdhbml6YXRpb25fT1dORVIQAxp7Cg9FbnZpcm9ubWVudFJvbGUSJQoOZW52aXJvbm1lbnRfaWQYASABKAlSDWVudmlyb25tZW50SWQSQQoEcm9sZRgCIAEoDjItLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLkVudmlyb25tZW50UgRyb2xlIuAECg5Db25zb2xlQWNjb3VudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSEgoEbmFtZRgCIAEoCVIEbmFtZRIdCgphdmF0YXJfdXJsGAMgASgJUglhdmF0YXJVcmwSJgoPaXNfc3lzdGVtX2FkbWluGAQgASgIUg1pc1N5c3RlbUFkbWluEkcKDG9yZ2FuaXphdGlvbhgFIAEoCzIjLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Pcmdhbml6YXRpb25SDG9yZ2FuaXphdGlvbhJbChFvcmdhbml6YXRpb25fcm9sZRgGIAEoDjIuLmJ1Y2tldGVlci5hY2NvdW50LkFjY291bnRWMi5Sb2xlLk9yZ2FuaXphdGlvblIQb3JnYW5pemF0aW9uUm9sZRJeChFlbnZpcm9ubWVudF9yb2xlcxgHIAMoCzIxLmJ1Y2tldGVlci5hY2NvdW50LkNvbnNvbGVBY2NvdW50LkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcxrWAQoPRW52aXJvbm1lbnRSb2xlEkYKC2Vudmlyb25tZW50GAEgASgLMiQuYnVja2V0ZWVyLmVudmlyb25tZW50LkVudmlyb25tZW50VjJSC2Vudmlyb25tZW50EjgKB3Byb2plY3QYAiABKAsyHi5idWNrZXRlZXIuZW52aXJvbm1lbnQuUHJvamVjdFIHcHJvamVjdBJBCgRyb2xlGAMgASgOMi0uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuRW52aXJvbm1lbnRSBHJvbGVCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMwqIBQobcHJvdG8vYWNjb3VudC9hcGlfa2V5LnByb3RvEhFidWNrZXRlZXIuYWNjb3VudBojcHJvdG8vZW52aXJvbm1lbnQvZW52aXJvbm1lbnQucHJvdG8i2AEKBkFQSUtleRIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIyCgRyb2xlGAMgASgOMh4uYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5LlJvbGVSBHJvbGUSGgoIZGlzYWJsZWQYBCABKAhSCGRpc2FibGVkEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQiHAoEUm9sZRIHCgNTREsQABILCgdTRVJWSUNFEAEimgIKEUVudmlyb25tZW50QVBJS2V5EjcKFWVudmlyb25tZW50X25hbWVzcGFjZRgBIAEoCUICGAFSFGVudmlyb25tZW50TmFtZXNwYWNlEjIKB2FwaV9rZXkYAiABKAsyGS5idWNrZXRlZXIuYWNjb3VudC5BUElLZXlSBmFwaUtleRIxChRlbnZpcm9ubWVudF9kaXNhYmxlZBgDIAEoCFITZW52aXJvbm1lbnREaXNhYmxlZBIdCgpwcm9qZWN0X2lkGAQgASgJUglwcm9qZWN0SWQSRgoLZW52aXJvbm1lbnQYBSABKAsyJC5idWNrZXRlZXIuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRWMlILZW52aXJvbm1lbnRCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMwqlCQoacHJvdG8vYXV0b29wcy9jbGF1c2UucHJvdG8SEWJ1Y2tldGVlci5hdXRvb3BzGhlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIkYKBkNsYXVzZRIOCgJpZBgBIAEoCVICaWQSLAoGY2xhdXNlGAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIGY2xhdXNlIp8CChJPcHNFdmVudFJhdGVDbGF1c2USIQoMdmFyaWF0aW9uX2lkGAIgASgJUgt2YXJpYXRpb25JZBIXCgdnb2FsX2lkGAMgASgJUgZnb2FsSWQSGwoJbWluX2NvdW50GAQgASgDUghtaW5Db3VudBIpChB0aHJlYWRzaG9sZF9yYXRlGAUgASgBUg90aHJlYWRzaG9sZFJhdGUSSgoIb3BlcmF0b3IYBiABKA4yLi5idWNrZXRlZXIuYXV0b29wcy5PcHNFdmVudFJhdGVDbGF1c2UuT3BlcmF0b3JSCG9wZXJhdG9yIjMKCE9wZXJhdG9yEhQKEEdSRUFURVJfT1JfRVFVQUwQABIRCg1MRVNTX09SX0VRVUFMEAFKBAgBEAIiJAoORGF0ZXRpbWVDbGF1c2USEgoEdGltZRgBIAEoA1IEdGltZSKXAQoaUHJvZ3Jlc3NpdmVSb2xsb3V0U2NoZWR1bGUSHwoLc2NoZWR1bGVfaWQYASABKAlSCnNjaGVkdWxlSWQSHQoKZXhlY3V0ZV9hdBgCIAEoA1IJZXhlY3V0ZUF0EhYKBndlaWdodBgDIAEoBVIGd2VpZ2h0EiEKDHRyaWdnZXJlZF9hdBgEIAEoA1ILdHJpZ2dlcmVkQXQimAEKJlByb2dyZXNzaXZlUm9sbG91dE1hbnVhbFNjaGVkdWxlQ2xhdXNlEksKCXNjaGVkdWxlcxgBIAMoCzItLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlUglzY2hlZHVsZXMSIQoMdmFyaWF0aW9uX2lkGAIgASgJUgt2YXJpYXRpb25JZCLYAgooUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZRJLCglzY2hlZHVsZXMYASADKAsyLS5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRTY2hlZHVsZVIJc2NoZWR1bGVzEmAKCGludGVydmFsGAIgASgOMkQuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZS5JbnRlcnZhbFIIaW50ZXJ2YWwSHgoKaW5jcmVtZW50cxgDIAEoA1IKaW5jcmVtZW50cxIhCgx2YXJpYXRpb25faWQYBCABKAlSC3ZhcmlhdGlvbklkIjoKCEludGVydmFsEgsKB1VOS05PV04QABIKCgZIT1VSTFkQARIJCgVEQUlMWRACEgoKBldFRUtMWRADQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRvb3BzYgZwcm90bzMKvQQKIXByb3RvL2F1dG9vcHMvYXV0b19vcHNfcnVsZS5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMaGnByb3RvL2F1dG9vcHMvY2xhdXNlLnByb3RvIqMCCgtBdXRvT3BzUnVsZRIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEjUKCG9wc190eXBlGAMgASgOMhouYnVja2V0ZWVyLmF1dG9vcHMuT3BzVHlwZVIHb3BzVHlwZRIzCgdjbGF1c2VzGAQgAygLMhkuYnVja2V0ZWVyLmF1dG9vcHMuQ2xhdXNlUgdjbGF1c2VzEiEKDHRyaWdnZXJlZF9hdBgGIAEoA1ILdHJpZ2dlcmVkQXQSHQoKY3JlYXRlZF9hdBgHIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCCABKANSCXVwZGF0ZWRBdBIYCgdkZWxldGVkGAkgASgIUgdkZWxldGVkIlQKDEF1dG9PcHNSdWxlcxJECg5hdXRvX29wc19ydWxlcxgBIAMoCzIeLmJ1Y2tldGVlci5hdXRvb3BzLkF1dG9PcHNSdWxlUgxhdXRvT3BzUnVsZXMqMgoHT3BzVHlwZRISCg5FTkFCTEVfRkVBVFVSRRAAEhMKD0RJU0FCTEVfRkVBVFVSRRABQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRvb3BzYgZwcm90bzMK8AMKInByb3RvL25vdGlmaWNhdGlvbi9yZWNpcGllbnQucHJvdG8SFmJ1Y2tldGVlci5ub3RpZmljYXRpb24itwIKCVJlY2lwaWVudBI6CgR0eXBlGAEgASgOMiYuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZWNpcGllbnQuVHlwZVIEdHlwZRJlChdzbGFja19jaGFubmVsX3JlY2lwaWVudBgCIAEoCzItLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU2xhY2tDaGFubmVsUmVjaXBpZW50UhVzbGFja0NoYW5uZWxSZWNpcGllbnQSRgoIbGFuZ3VhZ2UYAyABKA4yKi5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlY2lwaWVudC5MYW5ndWFnZVIIbGFuZ3VhZ2UiGAoEVHlwZRIQCgxTbGFja0NoYW5uZWwQACIlCghMYW5ndWFnZRILCgdFTkdMSVNIEAASDAoISkFQQU5FU0UQASI4ChVTbGFja0NoYW5uZWxSZWNpcGllbnQSHwoLd2ViaG9va191cmwYASABKAlSCndlYmhvb2tVcmxCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL25vdGlmaWNhdGlvbmIGcHJvdG8zCv0HCiVwcm90by9ub3RpZmljYXRpb24vc3Vic2NyaXB0aW9uLnByb3RvEhZidWNrZXRlZXIubm90aWZpY2F0aW9uGiJwcm90by9ub3RpZmljYXRpb24vcmVjaXBpZW50LnByb3RvItcGCgxTdWJzY3JpcHRpb24SDgoCaWQYASABKAlSAmlkEh0KCmNyZWF0ZWRfYXQYAiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAMgASgDUgl1cGRhdGVkQXQSGgoIZGlzYWJsZWQYBCABKAhSCGRpc2FibGVkElIKDHNvdXJjZV90eXBlcxgFIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzEj8KCXJlY2lwaWVudBgGIAEoCzIhLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uUmVjaXBpZW50UglyZWNpcGllbnQSEgoEbmFtZRgHIAEoCVIEbmFtZSKzBAoKU291cmNlVHlwZRIYChRET01BSU5fRVZFTlRfRkVBVFVSRRAAEhUKEURPTUFJTl9FVkVOVF9HT0FMEAESGwoXRE9NQUlOX0VWRU5UX0VYUEVSSU1FTlQQAhIYChRET01BSU5fRVZFTlRfQUNDT1VOVBADEhcKE0RPTUFJTl9FVkVOVF9BUElLRVkQBBIYChRET01BSU5fRVZFTlRfU0VHTUVOVBAFEhwKGERPTUFJTl9FVkVOVF9FTlZJUk9OTUVOVBAGEh4KGkRPTUFJTl9FVkVOVF9BRE1JTl9BQ0NPVU5UEAcSHQoZRE9NQUlOX0VWRU5UX0FVVE9PUFNfUlVMRRAIEhUKEURPTUFJTl9FVkVOVF9QVVNIEAkSHQoZRE9NQUlOX0VWRU5UX1NVQlNDUklQVElPThAKEiMKH0RPTUFJTl9FVkVOVF9BRE1JTl9TVUJTQ1JJUFRJT04QCxIYChRET01BSU5fRVZFTlRfUFJPSkVDVBAMEhgKFERPTUFJTl9FVkVOVF9XRUJIT09LEA0SJAogRE9NQUlOX0VWRU5UX1BST0dSRVNTSVZFX1JPTExPVVQQDhIdChlET01BSU5fRVZFTlRfT1JHQU5JWkFUSU9OEA8SHQoZRE9NQUlOX0VWRU5UX0ZMQUdfVFJJR0dFUhAQEhEKDUZFQVRVUkVfU1RBTEUQZBIXChJFWFBFUklNRU5UX1JVTk5JTkcQyAESDgoJTUFVX0NPVU5UEKwCQjZaNGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9ub3RpZmljYXRpb25iBnByb3RvMwr3BQoncHJvdG8vYXV0b29wcy9wcm9ncmVzc2l2ZV9yb2xsb3V0LnByb3RvEhFidWNrZXRlZXIuYXV0b29wcxoZZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90byLiBAoSUHJvZ3Jlc3NpdmVSb2xsb3V0Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSLAoGY2xhdXNlGAMgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIGY2xhdXNlEkQKBnN0YXR1cxgEIAEoDjIsLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5TdGF0dXNSBnN0YXR1cxIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgGIAEoA1IJdXBkYXRlZEF0Ej4KBHR5cGUYByABKA4yKi5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuVHlwZVIEdHlwZRJOCgpzdG9wcGVkX2J5GAggASgOMi8uYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlN0b3BwZWRCeVIJc3RvcHBlZEJ5Eh0KCnN0b3BwZWRfYXQYCSABKANSCXN0b3BwZWRBdCIyCgRUeXBlEhMKD01BTlVBTF9TQ0hFRFVMRRAAEhUKEVRFTVBMQVRFX1NDSEVEVUxFEAEiPQoGU3RhdHVzEgsKB1dBSVRJTkcQABILCgdSVU5OSU5HEAESDAoIRklOSVNIRUQQAhILCgdTVE9QUEVEEAMiSQoJU3RvcHBlZEJ5EgsKB1VOS05PV04QABIICgRVU0VSEAESEAoMT1BTX1NDSEVEVUxFEAISEwoPT1BTX0tJTExfU1dJVENIEANCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1dG9vcHNiBnByb3RvMwqoBQogcHJvdG8vZmVhdHVyZS9mbGFnX3RyaWdnZXIucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlIrUECgtGbGFnVHJpZ2dlchIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgDIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USNwoEdHlwZRgEIAEoDjIjLmJ1Y2tldGVlci5mZWF0dXJlLkZsYWdUcmlnZ2VyLlR5cGVSBHR5cGUSPQoGYWN0aW9uGAUgASgOMiUuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuQWN0aW9uUgZhY3Rpb24SIAoLZGVzY3JpcHRpb24YBiABKAlSC2Rlc2NyaXB0aW9uEiMKDXRyaWdnZXJfY291bnQYByABKAVSDHRyaWdnZXJDb3VudBIqChFsYXN0X3RyaWdnZXJlZF9hdBgIIAEoA1IPbGFzdFRyaWdnZXJlZEF0EhQKBXRva2VuGAkgASgJUgV0b2tlbhIaCghkaXNhYmxlZBgKIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgLIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYDCABKANSCXVwZGF0ZWRBdCIqCgRUeXBlEhAKDFR5cGVfVU5LTk9XThAAEhAKDFR5cGVfV0VCSE9PSxABIjsKBkFjdGlvbhISCg5BY3Rpb25fVU5LTk9XThAAEg0KCUFjdGlvbl9PThABEg4KCkFjdGlvbl9PRkYQAkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCvmwAQoecHJvdG8vZXZlbnQvZG9tYWluL2V2ZW50LnByb3RvEhZidWNrZXRlZXIuZXZlbnQuZG9tYWluGhlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvGh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8aGnByb3RvL2ZlYXR1cmUvY2xhdXNlLnByb3RvGhtwcm90by9mZWF0dXJlL2ZlYXR1cmUucHJvdG8aGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxodcHJvdG8vZmVhdHVyZS92YXJpYXRpb24ucHJvdG8aHHByb3RvL2ZlYXR1cmUvc3RyYXRlZ3kucHJvdG8aG3Byb3RvL2ZlYXR1cmUvc2VnbWVudC5wcm90bxoacHJvdG8vZmVhdHVyZS90YXJnZXQucHJvdG8aG3Byb3RvL2FjY291bnQvYWNjb3VudC5wcm90bxobcHJvdG8vYWNjb3VudC9hcGlfa2V5LnByb3RvGiFwcm90by9hdXRvb3BzL2F1dG9fb3BzX3J1bGUucHJvdG8aGnByb3RvL2F1dG9vcHMvY2xhdXNlLnByb3RvGiVwcm90by9ub3RpZmljYXRpb24vc3Vic2NyaXB0aW9uLnByb3RvGiJwcm90by9ub3RpZmljYXRpb24vcmVjaXBpZW50LnByb3RvGiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90bxoncHJvdG8vYXV0b29wcy9wcm9ncmVzc2l2ZV9yb2xsb3V0LnByb3RvGiBwcm90by9mZWF0dXJlL2ZsYWdfdHJpZ2dlci5wcm90byKLKQoFRXZlbnQSDgoCaWQYASABKAlSAmlkEhwKCXRpbWVzdGFtcBgCIAEoA1IJdGltZXN0YW1wEkkKC2VudGl0eV90eXBlGAMgASgOMiguYnVja2V0ZWVyLmV2ZW50LmRvbWFpbi5FdmVudC5FbnRpdHlUeXBlUgplbnRpdHlUeXBlEhsKCWVudGl0eV9pZBgEIAEoCVIIZW50aXR5SWQSNgoEdHlwZRgFIAEoDjIiLmJ1Y2tldGVlci5ldmVudC5kb21haW4uRXZlbnQuVHlwZVIEdHlwZRI2CgZlZGl0b3IYBiABKAsyHi5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkVkaXRvclIGZWRpdG9yEigKBGRhdGEYByABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgRkYXRhEjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgIIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USJAoOaXNfYWRtaW5fZXZlbnQYCSABKAhSDGlzQWRtaW5FdmVudBI5CgdvcHRpb25zGAogASgLMh8uYnVja2V0ZWVyLmV2ZW50LmRvbWFpbi5PcHRpb25zUgdvcHRpb25zIpMCCgpFbnRpdHlUeXBlEgsKB0ZFQVRVUkUQABIICgRHT0FMEAESDgoKRVhQRVJJTUVOVBACEgsKB0FDQ09VTlQQAxIKCgZBUElLRVkQBBILCgdTRUdNRU5UEAUSDwoLRU5WSVJPTk1FTlQQBhIRCg1BRE1JTl9BQ0NPVU5UEAcSEAoMQVVUT09QU19SVUxFEAgSCAoEUFVTSBAJEhAKDFNVQlNDUklQVElPThAKEhYKEkFETUlOX1NVQlNDUklQVElPThALEgsKB1BST0pFQ1QQDBIXChNQUk9HUkVTU0lWRV9ST0xMT1VUEA4SEAoMT1JHQU5JWkFUSU9OEA8SEAoMRkxBR19UUklHR0VSEBAiBAgNEA0ipSMKBFR5cGUSCwoHVU5LTk9XThAAEhMKD0ZFQVRVUkVfQ1JFQVRFRBABEhMKD0ZFQVRVUkVfUkVOQU1FRBACEhMKD0ZFQVRVUkVfRU5BQkxFRBADEhQKEEZFQVRVUkVfRElTQUJMRUQQBBITCg9GRUFUVVJFX0RFTEVURUQQBRIfChtGRUFUVVJFX0RFU0NSSVBUSU9OX0NIQU5HRUQQCBIbChdGRUFUVVJFX1ZBUklBVElPTl9BRERFRBAJEh0KGUZFQVRVUkVfVkFSSUFUSU9OX1JFTU9WRUQQChIhCh1GRUFUVVJFX09GRl9WQVJJQVRJT05fQ0hBTkdFRBALEhsKF1ZBUklBVElPTl9WQUxVRV9DSEFOR0VEEAwSGgoWVkFSSUFUSU9OX05BTUVfQ0hBTkdFRBANEiEKHVZBUklBVElPTl9ERVNDUklQVElPTl9DSEFOR0VEEA4SGAoUVkFSSUFUSU9OX1VTRVJfQURERUQQDxIaChZWQVJJQVRJT05fVVNFUl9SRU1PVkVEEBASFgoSRkVBVFVSRV9SVUxFX0FEREVEEBESIQodRkVBVFVSRV9SVUxFX1NUUkFURUdZX0NIQU5HRUQQEhIYChRGRUFUVVJFX1JVTEVfREVMRVRFRBATEhUKEVJVTEVfQ0xBVVNFX0FEREVEEBQSFwoTUlVMRV9DTEFVU0VfREVMRVRFRBAVEh8KG1JVTEVfRklYRURfU1RSQVRFR1lfQ0hBTkdFRBAWEiEKHVJVTEVfUk9MTE9VVF9TVFJBVEVHWV9DSEFOR0VEEBcSHAoYQ0xBVVNFX0FUVFJJQlVURV9DSEFOR0VEEBgSGwoXQ0xBVVNFX09QRVJBVE9SX0NIQU5HRUQQGRIWChJDTEFVU0VfVkFMVUVfQURERUQQGhIYChRDTEFVU0VfVkFMVUVfUkVNT1ZFRBAbEiQKIEZFQVRVUkVfREVGQVVMVF9TVFJBVEVHWV9DSEFOR0VEEBwSFQoRRkVBVFVSRV9UQUdfQURERUQQHRIXChNGRUFUVVJFX1RBR19SRU1PVkVEEB4SHwobRkVBVFVSRV9WRVJTSU9OX0lOQ1JFTUVOVEVEEB8SFAoQRkVBVFVSRV9BUkNISVZFRBAgEhIKDkZFQVRVUkVfQ0xPTkVEECESFgoSRkVBVFVSRV9VTkFSQ0hJVkVEECMSFwoTU0FNUExJTkdfU0VFRF9SRVNFVBAiEhYKElBSRVJFUVVJU0lURV9BRERFRBAkEhgKFFBSRVJFUVVJU0lURV9SRU1PVkVEECUSIgoeUFJFUkVRVUlTSVRFX1ZBUklBVElPTl9DSEFOR0VEECYSHwobRkVBVFVSRV9SVUxFU19PUkRFUl9DSEFOR0VEECcSEAoMR09BTF9DUkVBVEVEEGQSEAoMR09BTF9SRU5BTUVEEGUSHAoYR09BTF9ERVNDUklQVElPTl9DSEFOR0VEEGYSEAoMR09BTF9ERUxFVEVEEGcSEQoNR09BTF9BUkNISVZFRBBoEhcKEkVYUEVSSU1FTlRfQ1JFQVRFRBDIARIXChJFWFBFUklNRU5UX1NUT1BQRUQQyQESIAobRVhQRVJJTUVOVF9TVEFSVF9BVF9DSEFOR0VEEMoBEh8KGkVYUEVSSU1FTlRfU1RPUF9BVF9DSEFOR0VEEMsBEhcKEkVYUEVSSU1FTlRfREVMRVRFRBDMARIeChlFWFBFUklNRU5UX1BFUklPRF9DSEFOR0VEEM0BEhwKF0VYUEVSSU1FTlRfTkFNRV9DSEFOR0VEEM4BEiMKHkVYUEVSSU1FTlRfREVTQ1JJUFRJT05fQ0hBTkdFRBDPARIXChJFWFBFUklNRU5UX1NUQVJURUQQ0AESGAoTRVhQRVJJTUVOVF9GSU5JU0hFRBDRARIYChNFWFBFUklNRU5UX0FSQ0hJVkVEENIBEhgKD0FDQ09VTlRfQ1JFQVRFRBCsAhoCCAESHQoUQUNDT1VOVF9ST0xFX0NIQU5HRUQQrQIaAggBEhgKD0FDQ09VTlRfRU5BQkxFRBCuAhoCCAESGQoQQUNDT1VOVF9ESVNBQkxFRBCvAhoCCAESGAoPQUNDT1VOVF9ERUxFVEVEELACGgIIARIXChJBQ0NPVU5UX1YyX0NSRUFURUQQsQISHAoXQUNDT1VOVF9WMl9OQU1FX0NIQU5HRUQQsgISKAojQUNDT1VOVF9WMl9BVkFUQVJfSU1BR0VfVVJMX0NIQU5HRUQQswISKQokQUNDT1VOVF9WMl9PUkdBTklaQVRJT05fUk9MRV9DSEFOR0VEELQCEikKJEFDQ09VTlRfVjJfRU5WSVJPTk1FTlRfUk9MRVNfQ0hBTkdFRBC1AhIXChJBQ0NPVU5UX1YyX0VOQUJMRUQQtgISGAoTQUNDT1VOVF9WMl9ESVNBQkxFRBC3AhIXChJBQ0NPVU5UX1YyX0RFTEVURUQQuAISEwoOQVBJS0VZX0NSRUFURUQQkAMSGAoTQVBJS0VZX05BTUVfQ0hBTkdFRBCRAxITCg5BUElLRVlfRU5BQkxFRBCSAxIUCg9BUElLRVlfRElTQUJMRUQQkwMSFAoPU0VHTUVOVF9DUkVBVEVEEPQDEhQKD1NFR01FTlRfREVMRVRFRBD1AxIZChRTRUdNRU5UX05BTUVfQ0hBTkdFRBD2AxIgChtTRUdNRU5UX0RFU0NSSVBUSU9OX0NIQU5HRUQQ9wMSFwoSU0VHTUVOVF9SVUxFX0FEREVEEPgDEhkKFFNFR01FTlRfUlVMRV9ERUxFVEVEEPkDEh4KGVNFR01FTlRfUlVMRV9DTEFVU0VfQURERUQQ+gMSIAobU0VHTUVOVF9SVUxFX0NMQVVTRV9ERUxFVEVEEPsDEiUKIFNFR01FTlRfQ0xBVVNFX0FUVFJJQlVURV9DSEFOR0VEEPwDEiQKH1NFR01FTlRfQ0xBVVNFX09QRVJBVE9SX0NIQU5HRUQQ/QMSHwoaU0VHTUVOVF9DTEFVU0VfVkFMVUVfQURERUQQ/gMSIQocU0VHTUVOVF9DTEFVU0VfVkFMVUVfUkVNT1ZFRBD/AxIXChJTRUdNRU5UX1VTRVJfQURERUQQgAQSGQoUU0VHTUVOVF9VU0VSX0RFTEVURUQQgQQSHgoZU0VHTUVOVF9CVUxLX1VQTE9BRF9VU0VSUxCCBBItCihTRUdNRU5UX0JVTEtfVVBMT0FEX1VTRVJTX1NUQVRVU19DSEFOR0VEEIMEEhgKE0VOVklST05NRU5UX0NSRUFURUQQ2AQSGAoTRU5WSVJPTk1FTlRfUkVOQU1FRBDZBBIkCh9FTlZJUk9OTUVOVF9ERVNDUklQVElPTl9DSEFOR0VEENoEEhgKE0VOVklST05NRU5UX0RFTEVURUQQ2wQSGwoWRU5WSVJPTk1FTlRfVjJfQ1JFQVRFRBDcBBIbChZFTlZJUk9OTUVOVF9WMl9SRU5BTUVEEN0EEicKIkVOVklST05NRU5UX1YyX0RFU0NSSVBUSU9OX0NIQU5HRUQQ3gQSHAoXRU5WSVJPTk1FTlRfVjJfQVJDSElWRUQQ3wQSHgoZRU5WSVJPTk1FTlRfVjJfVU5BUkNISVZFRBDgBBIeChVBRE1JTl9BQ0NPVU5UX0NSRUFURUQQvAUaAggBEh4KFUFETUlOX0FDQ09VTlRfRU5BQkxFRBC+BRoCCAESHwoWQURNSU5fQUNDT1VOVF9ESVNBQkxFRBC/BRoCCAESGQoUQVVUT09QU19SVUxFX0NSRUFURUQQoAYSGQoUQVVUT09QU19SVUxFX0RFTEVURUQQoQYSIgodQVVUT09QU19SVUxFX09QU19UWVBFX0NIQU5HRUQQogYSIAobQVVUT09QU19SVUxFX0NMQVVTRV9ERUxFVEVEEKMGEiYKIUFVVE9PUFNfUlVMRV9UUklHR0VSRURfQVRfQ0hBTkdFRBCkBhIgChtPUFNfRVZFTlRfUkFURV9DTEFVU0VfQURERUQQpQYSIgodT1BTX0VWRU5UX1JBVEVfQ0xBVVNFX0NIQU5HRUQQpgYSGgoVREFURVRJTUVfQ0xBVVNFX0FEREVEEKcGEhwKF0RBVEVUSU1FX0NMQVVTRV9DSEFOR0VEEKgGEhEKDFBVU0hfQ1JFQVRFRBCEBxIRCgxQVVNIX0RFTEVURUQQhQcSFAoPUFVTSF9UQUdTX0FEREVEEIYHEhYKEVBVU0hfVEFHU19ERUxFVEVEEIcHEhEKDFBVU0hfUkVOQU1FRBCIBxIZChRTVUJTQ1JJUFRJT05fQ1JFQVRFRBDoBxIZChRTVUJTQ1JJUFRJT05fREVMRVRFRBDpBxIZChRTVUJTQ1JJUFRJT05fRU5BQkxFRBDqBxIaChVTVUJTQ1JJUFRJT05fRElTQUJMRUQQ6wcSIwoeU1VCU0NSSVBUSU9OX1NPVVJDRV9UWVBFX0FEREVEEOwHEiUKIFNVQlNDUklQVElPTl9TT1VSQ0VfVFlQRV9ERUxFVEVEEO0HEhkKFFNVQlNDUklQVElPTl9SRU5BTUVEEO4HEh8KGkFETUlOX1NVQlNDUklQVElPTl9DUkVBVEVEEMwIEh8KGkFETUlOX1NVQlNDUklQVElPTl9ERUxFVEVEEM0IEh8KGkFETUlOX1NVQlNDUklQVElPTl9FTkFCTEVEEM4IEiAKG0FETUlOX1NVQlNDUklQVElPTl9ESVNBQkxFRBDPCBIpCiRBRE1JTl9TVUJTQ1JJUFRJT05fU09VUkNFX1RZUEVfQURERUQQ0AgSKwomQURNSU5fU1VCU0NSSVBUSU9OX1NPVVJDRV9UWVBFX0RFTEVURUQQ0QgSHwoaQURNSU5fU1VCU0NSSVBUSU9OX1JFTkFNRUQQ0ggSFAoPUFJPSkVDVF9DUkVBVEVEELAJEiAKG1BST0pFQ1RfREVTQ1JJUFRJT05fQ0hBTkdFRBCxCRIUCg9QUk9KRUNUX0VOQUJMRUQQsgkSFQoQUFJPSkVDVF9ESVNBQkxFRBCzCRIaChVQUk9KRUNUX1RSSUFMX0NSRUFURUQQtAkSHAoXUFJPSkVDVF9UUklBTF9DT05WRVJURUQQtQkSFAoPUFJPSkVDVF9SRU5BTUVEELYJEiAKG1BST0dSRVNTSVZFX1JPTExPVVRfQ1JFQVRFRBD4ChIgChtQUk9HUkVTU0lWRV9ST0xMT1VUX0RFTEVURUQQ+QoSNgoxUFJPR1JFU1NJVkVfUk9MTE9VVF9TQ0hFRFVMRV9UUklHR0VSRURfQVRfQ0hBTkdFRBD6ChIgChtQUk9HUkVTU0lWRV9ST0xMT1VUX1NUT1BQRUQQ+woSGQoUT1JHQU5JWkFUSU9OX0NSRUFURUQQ3AsSHgoZT1JHQU5JWkFUSU9OX05BTUVfQ0hBTkdFRBDdCxIlCiBPUkdBTklaQVRJT05fREVTQ1JJUFRJT05fQ0hBTkdFRBDeCxIZChRPUkdBTklaQVRJT05fRU5BQkxFRBDfCxIaChVPUkdBTklaQVRJT05fRElTQUJMRUQQ4AsSGgoVT1JHQU5JWkFUSU9OX0FSQ0hJVkVEEOELEhwKF09SR0FOSVpBVElPTl9VTkFSQ0hJVkVEEOILEiEKHE9SR0FOSVpBVElPTl9UUklBTF9DT05WRVJURUQQ4wsSGQoURkxBR19UUklHR0VSX0NSRUFURUQQwQwSFwoSRkxBR19UUklHR0VSX1JFU0VUEMIMEiUKIEZMQUdfVFJJR0dFUl9ERVNDUklQVElPTl9DSEFOR0VEEMMMEhoKFUZMQUdfVFJJR0dFUl9ESVNBQkxFRBDEDBIZChRGTEFHX1RSSUdHRVJfRU5BQkxFRBDFDBIZChRGTEFHX1RSSUdHRVJfREVMRVRFRBDGDBIfChpGTEFHX1RSSUdHRVJfVVNBR0VfVVBEQVRFRBDHDCIGCJQKEJQKIgYIlQoQlQoiBgiWChCWCiIGCJcKEJcKIgYImAoQmAoiBgiZChCZCiJyCgZFZGl0b3ISFAoFZW1haWwYASABKAlSBWVtYWlsEjcKBHJvbGUYAiABKA4yHy5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50LlJvbGVCAhgBUgRyb2xlEhkKCGlzX2FkbWluGAMgASgIUgdpc0FkbWluIkQKB09wdGlvbnMSGAoHY29tbWVudBgBIAEoCVIHY29tbWVudBIfCgtuZXdfdmVyc2lvbhgCIAEoBVIKbmV3VmVyc2lvbiLzBAoTRmVhdHVyZUNyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SEgoEdXNlchgEIAEoCVIEdXNlchI8Cgp2YXJpYXRpb25zGAUgAygLMhwuYnVja2V0ZWVyLmZlYXR1cmUuVmFyaWF0aW9uUgp2YXJpYXRpb25zElgKGmRlZmF1bHRfb25fdmFyaWF0aW9uX2luZGV4GAYgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSF2RlZmF1bHRPblZhcmlhdGlvbkluZGV4EloKG2RlZmF1bHRfb2ZmX3ZhcmlhdGlvbl9pbmRleBgHIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUhhkZWZhdWx0T2ZmVmFyaWF0aW9uSW5kZXgSTwoOdmFyaWF0aW9uX3R5cGUYCCABKA4yKC5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlLlZhcmlhdGlvblR5cGVSDXZhcmlhdGlvblR5cGUSEgoEdGFncxgJIAMoCVIEdGFncxJFCg1wcmVyZXF1aXNpdGVzGAogAygLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUg1wcmVyZXF1aXNpdGVzEi0KBXJ1bGVzGAsgAygLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIFcnVsZXMSMwoHdGFyZ2V0cxgMIAMoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLlRhcmdldFIHdGFyZ2V0cyIlChNGZWF0dXJlRW5hYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCImChRGZWF0dXJlRGlzYWJsZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiJgoURmVhdHVyZUFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkIigKFkZlYXR1cmVVbmFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkIiUKE0ZlYXR1cmVEZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIi0KG0V2YWx1YXRpb25EZWxheWFibGVTZXRFdmVudBIOCgJpZBgBIAEoCVICaWQiLwodRXZhbHVhdGlvblVuZGVsYXlhYmxlU2V0RXZlbnQSDgoCaWQYASABKAlSAmlkIjkKE0ZlYXR1cmVSZW5hbWVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiUgoeRmVhdHVyZURlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iVgofRmVhdHVyZU9mZlZhcmlhdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIwoNb2ZmX3ZhcmlhdGlvbhgCIAEoCVIMb2ZmVmFyaWF0aW9uImgKGkZlYXR1cmVWYXJpYXRpb25BZGRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBI6Cgl2YXJpYXRpb24YAiABKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCXZhcmlhdGlvbiJRChxGZWF0dXJlVmFyaWF0aW9uUmVtb3ZlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIhCgx2YXJpYXRpb25faWQYAiABKAlSC3ZhcmlhdGlvbklkImEKGlZhcmlhdGlvblZhbHVlQ2hhbmdlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIOCgJpZBgCIAEoCVICaWQSFAoFdmFsdWUYAyABKAlSBXZhbHVlIl4KGVZhcmlhdGlvbk5hbWVDaGFuZ2VkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEg4KAmlkGAIgASgJUgJpZBISCgRuYW1lGAMgASgJUgRuYW1lInMKIFZhcmlhdGlvbkRlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIOCgJpZBgCIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uIlwKF1ZhcmlhdGlvblVzZXJBZGRlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIOCgJpZBgCIAEoCVICaWQSEgoEdXNlchgDIAEoCVIEdXNlciJeChlWYXJpYXRpb25Vc2VyUmVtb3ZlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIOCgJpZBgCIAEoCVICaWQSEgoEdXNlchgDIAEoCVIEdXNlciJUChVGZWF0dXJlUnVsZUFkZGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEisKBHJ1bGUYAiABKAsyFy5idWNrZXRlZXIuZmVhdHVyZS5SdWxlUgRydWxlIpEBCh5GZWF0dXJlQ2hhbmdlUnVsZVN0cmF0ZWd5RXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBI3CghzdHJhdGVneRgDIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5UghzdHJhdGVneSJZCh1GZWF0dXJlUnVsZXNPcmRlckNoYW5nZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSGQoIcnVsZV9pZHMYAiADKAlSB3J1bGVJZHMiQgoXRmVhdHVyZVJ1bGVEZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZCKYAQogRmVhdHVyZUZpeGVkU3RyYXRlZ3lDaGFuZ2VkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBI8CghzdHJhdGVneRgDIAEoCzIgLmJ1Y2tldGVlci5mZWF0dXJlLkZpeGVkU3RyYXRlZ3lSCHN0cmF0ZWd5IpwBCiJGZWF0dXJlUm9sbG91dFN0cmF0ZWd5Q2hhbmdlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSPgoIc3RyYXRlZ3kYAyABKAsyIi5idWNrZXRlZXIuZmVhdHVyZS5Sb2xsb3V0U3RyYXRlZ3lSCHN0cmF0ZWd5IoEBChRSdWxlQ2xhdXNlQWRkZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEjEKBmNsYXVzZRgDIAEoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZVIGY2xhdXNlImAKFlJ1bGVDbGF1c2VEZWxldGVkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIOCgJpZBgDIAEoCVICaWQigwEKG0NsYXVzZUF0dHJpYnV0ZUNoYW5nZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEg4KAmlkGAMgASgJUgJpZBIcCglhdHRyaWJ1dGUYBCABKAlSCWF0dHJpYnV0ZSKkAQoaQ2xhdXNlT3BlcmF0b3JDaGFuZ2VkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIOCgJpZBgDIAEoCVICaWQSPgoIb3BlcmF0b3IYBCABKA4yIi5idWNrZXRlZXIuZmVhdHVyZS5DbGF1c2UuT3BlcmF0b3JSCG9wZXJhdG9yInUKFUNsYXVzZVZhbHVlQWRkZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEg4KAmlkGAMgASgJUgJpZBIUCgV2YWx1ZRgEIAEoCVIFdmFsdWUidwoXQ2xhdXNlVmFsdWVSZW1vdmVkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIOCgJpZBgDIAEoCVICaWQSFAoFdmFsdWUYBCABKAlSBXZhbHVlIm0KIkZlYXR1cmVEZWZhdWx0U3RyYXRlZ3lDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEjcKCHN0cmF0ZWd5GAIgASgLMhsuYnVja2V0ZWVyLmZlYXR1cmUuU3RyYXRlZ3lSCHN0cmF0ZWd5IjgKFEZlYXR1cmVUYWdBZGRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIQCgN0YWcYAiABKAlSA3RhZyI6ChZGZWF0dXJlVGFnUmVtb3ZlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIQCgN0YWcYAiABKAlSA3RhZyJKCh5GZWF0dXJlVmVyc2lvbkluY3JlbWVudGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhgKB3ZlcnNpb24YAiABKAVSB3ZlcnNpb24itQQKEkZlYXR1cmVDbG9uZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SPAoKdmFyaWF0aW9ucxgEIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxIzCgd0YXJnZXRzGAUgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuVGFyZ2V0Ugd0YXJnZXRzEi0KBXJ1bGVzGAYgAygLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIFcnVsZXMSRgoQZGVmYXVsdF9zdHJhdGVneRgHIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5Ug9kZWZhdWx0U3RyYXRlZ3kSIwoNb2ZmX3ZhcmlhdGlvbhgIIAEoCVIMb2ZmVmFyaWF0aW9uEhIKBHRhZ3MYCSADKAlSBHRhZ3MSHgoKbWFpbnRhaW5lchgKIAEoCVIKbWFpbnRhaW5lchJPCg52YXJpYXRpb25fdHlwZRgLIAEoDjIoLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmUuVmFyaWF0aW9uVHlwZVINdmFyaWF0aW9uVHlwZRJFCg1wcmVyZXF1aXNpdGVzGAwgAygLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUg1wcmVyZXF1aXNpdGVzIkQKHUZlYXR1cmVTYW1wbGluZ1NlZWRSZXNldEV2ZW50EiMKDXNhbXBsaW5nX3NlZWQYASABKAlSDHNhbXBsaW5nU2VlZCKwAQoQR29hbENyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SGAoHZGVsZXRlZBgEIAEoCFIHZGVsZXRlZBIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgGIAEoA1IJdXBkYXRlZEF0IjYKEEdvYWxSZW5hbWVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiTwobR29hbERlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iIwoRR29hbEFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkIiIKEEdvYWxEZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIvMDChZFeHBlcmltZW50Q3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAMgASgFUg5mZWF0dXJlVmVyc2lvbhI8Cgp2YXJpYXRpb25zGAQgAygLMhwuYnVja2V0ZWVyLmZlYXR1cmUuVmFyaWF0aW9uUgp2YXJpYXRpb25zEhsKB2dvYWxfaWQYBSABKAlCAhgBUgZnb2FsSWQSGQoIc3RhcnRfYXQYBiABKANSB3N0YXJ0QXQSFwoHc3RvcF9hdBgHIAEoA1IGc3RvcEF0EhgKB3N0b3BwZWQYCCABKAhSB3N0b3BwZWQSHQoKc3RvcHBlZF9hdBgJIAEoA1IJc3RvcHBlZEF0Eh0KCmNyZWF0ZWRfYXQYCiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAsgASgDUgl1cGRhdGVkQXQSGQoIZ29hbF9pZHMYDCADKAlSB2dvYWxJZHMSEgoEbmFtZRgNIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgOIAEoCVILZGVzY3JpcHRpb24SKgoRYmFzZV92YXJpYXRpb25faWQYDyABKAlSD2Jhc2VWYXJpYXRpb25JZCJHChZFeHBlcmltZW50U3RvcHBlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpzdG9wcGVkX2F0GAIgASgDUglzdG9wcGVkQXQiKQoXRXhwZXJpbWVudEFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkIigKFkV4cGVyaW1lbnREZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIkoKHUV4cGVyaW1lbnRTdGFydEF0Q2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIZCghzdGFydF9hdBgCIAEoA1IHc3RhcnRBdCJHChxFeHBlcmltZW50U3RvcEF0Q2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIXCgdzdG9wX2F0GAIgASgDUgZzdG9wQXQiYgocRXhwZXJpbWVudFBlcmlvZENoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSGQoIc3RhcnRfYXQYAiABKANSB3N0YXJ0QXQSFwoHc3RvcF9hdBgDIAEoA1IGc3RvcEF0IkAKGkV4cGVyaW1lbnROYW1lQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lIlUKIUV4cGVyaW1lbnREZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uIhgKFkV4cGVyaW1lbnRTdGFydGVkRXZlbnQiGQoXRXhwZXJpbWVudEZpbmlzaGVkRXZlbnQipgMKFUFjY291bnRWMkNyZWF0ZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSEgoEbmFtZRgCIAEoCVIEbmFtZRIoChBhdmF0YXJfaW1hZ2VfdXJsGAMgASgJUg5hdmF0YXJJbWFnZVVybBInCg9vcmdhbml6YXRpb25faWQYBCABKAlSDm9yZ2FuaXphdGlvbklkElsKEW9yZ2FuaXphdGlvbl9yb2xlGAUgASgOMi4uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuT3JnYW5pemF0aW9uUhBvcmdhbml6YXRpb25Sb2xlElkKEWVudmlyb25tZW50X3JvbGVzGAYgAygLMiwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcxIaCghkaXNhYmxlZBgHIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgIIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCSABKANSCXVwZGF0ZWRBdCJFChlBY2NvdW50VjJOYW1lQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgRuYW1lGAIgASgJUgRuYW1lImUKI0FjY291bnRWMkF2YXRhckltYWdlVVJMQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBIoChBhdmF0YXJfaW1hZ2VfdXJsGAIgASgJUg5hdmF0YXJJbWFnZVVybCKaAQolQWNjb3VudFYyT3JnYW5pemF0aW9uUm9sZUNoYW5nZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSWwoRb3JnYW5pemF0aW9uX3JvbGUYAiABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUimAEKJUFjY291bnRWMkVudmlyb25tZW50Um9sZXNDaGFuZ2VkRXZlbnQSFAoFZW1haWwYASABKAlSBWVtYWlsElkKEWVudmlyb25tZW50X3JvbGVzGAIgAygLMiwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcyItChVBY2NvdW50VjJFbmFibGVkRXZlbnQSFAoFZW1haWwYASABKAlSBWVtYWlsIi4KFkFjY291bnRWMkRpc2FibGVkRXZlbnQSFAoFZW1haWwYASABKAlSBWVtYWlsIi0KFUFjY291bnRWMkRlbGV0ZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwixgEKEkFQSUtleUNyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIyCgRyb2xlGAMgASgOMh4uYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5LlJvbGVSBHJvbGUSGgoIZGlzYWJsZWQYBCABKAhSCGRpc2FibGVkEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQiPAoWQVBJS2V5TmFtZUNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSIkChJBUElLZXlFbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIiUKE0FQSUtleURpc2FibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIlsKE1NlZ21lbnRDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uIiUKE1NlZ21lbnREZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIj0KF1NlZ21lbnROYW1lQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lIlIKHlNlZ21lbnREZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uIlQKFVNlZ21lbnRSdWxlQWRkZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSKwoEcnVsZRgCIAEoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBHJ1bGUiQgoXU2VnbWVudFJ1bGVEZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZCKIAQobU2VnbWVudFJ1bGVDbGF1c2VBZGRlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSMQoGY2xhdXNlGAMgASgLMhkuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlUgZjbGF1c2UidAodU2VnbWVudFJ1bGVDbGF1c2VEZWxldGVkRXZlbnQSHQoKc2VnbWVudF9pZBgBIAEoCVIJc2VnbWVudElkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIbCgljbGF1c2VfaWQYAyABKAlSCGNsYXVzZUlkIpcBCiJTZWdtZW50Q2xhdXNlQXR0cmlidXRlQ2hhbmdlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBIcCglhdHRyaWJ1dGUYBCABKAlSCWF0dHJpYnV0ZSK4AQohU2VnbWVudENsYXVzZU9wZXJhdG9yQ2hhbmdlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBI+CghvcGVyYXRvchgEIAEoDjIiLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZS5PcGVyYXRvclIIb3BlcmF0b3IiiQEKHFNlZ21lbnRDbGF1c2VWYWx1ZUFkZGVkRXZlbnQSHQoKc2VnbWVudF9pZBgBIAEoCVIJc2VnbWVudElkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIbCgljbGF1c2VfaWQYAyABKAlSCGNsYXVzZUlkEhQKBXZhbHVlGAQgASgJUgV2YWx1ZSKLAQoeU2VnbWVudENsYXVzZVZhbHVlUmVtb3ZlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBIUCgV2YWx1ZRgEIAEoCVIFdmFsdWUijQEKFVNlZ21lbnRVc2VyQWRkZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSGQoIdXNlcl9pZHMYAiADKAlSB3VzZXJJZHMSOgoFc3RhdGUYAyABKA4yJC5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlci5TdGF0ZVIFc3RhdGUijwEKF1NlZ21lbnRVc2VyRGVsZXRlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIZCgh1c2VyX2lkcxgCIAMoCVIHdXNlcklkcxI6CgVzdGF0ZRgDIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZSKzAQobU2VnbWVudEJ1bGtVcGxvYWRVc2Vyc0V2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBI5CgZzdGF0dXMYAiABKA4yIS5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50LlN0YXR1c1IGc3RhdHVzEjoKBXN0YXRlGAMgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlItYBCihTZWdtZW50QnVsa1VwbG9hZFVzZXJzU3RhdHVzQ2hhbmdlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBI5CgZzdGF0dXMYAiABKA4yIS5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50LlN0YXR1c1IGc3RhdHVzEjoKBXN0YXRlGAMgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlEhQKBWNvdW50GAQgASgDUgVjb3VudCL0AQoXRW52aXJvbm1lbnRDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhwKCW5hbWVzcGFjZRgCIAEoCVIJbmFtZXNwYWNlEhIKBG5hbWUYAyABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uEhgKB2RlbGV0ZWQYBSABKAhSB2RlbGV0ZWQSHQoKY3JlYXRlZF9hdBgGIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYByABKANSCXVwZGF0ZWRBdBIdCgpwcm9qZWN0X2lkGAggASgJUglwcm9qZWN0SWQiPQoXRW52aXJvbm1lbnRSZW5hbWVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiVgoiRW52aXJvbm1lbnREZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uIkcKF0Vudmlyb25tZW50RGVsZXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIcCgluYW1lc3BhY2UYAiABKAlSCW5hbWVzcGFjZSL1AQoZRW52aXJvbm1lbnRWMkNyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgDIAEoCVIHdXJsQ29kZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SHQoKcHJvamVjdF9pZBgFIAEoCVIJcHJvamVjdElkEhoKCGFyY2hpdmVkGAYgASgIUghhcmNoaXZlZBIdCgpjcmVhdGVkX2F0GAcgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgIIAEoA1IJdXBkYXRlZEF0IoABChlFbnZpcm9ubWVudFYyUmVuYW1lZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpwcm9qZWN0X2lkGAIgASgJUglwcm9qZWN0SWQSGQoIb2xkX25hbWUYAyABKAlSB29sZE5hbWUSGQoIbmV3X25hbWUYBCABKAlSB25ld05hbWUiuwEKJEVudmlyb25tZW50VjJEZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIdCgpwcm9qZWN0X2lkGAMgASgJUglwcm9qZWN0SWQSJwoPb2xkX2Rlc2NyaXB0aW9uGAQgASgJUg5vbGREZXNjcmlwdGlvbhInCg9uZXdfZGVzY3JpcHRpb24YBSABKAlSDm5ld0Rlc2NyaXB0aW9uIl8KGkVudmlyb25tZW50VjJBcmNoaXZlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEh0KCnByb2plY3RfaWQYAyABKAlSCXByb2plY3RJZCJhChxFbnZpcm9ubWVudFYyVW5hcmNoaXZlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEh0KCnByb2plY3RfaWQYAyABKAlSCXByb2plY3RJZCKFAgoXQXV0b09wc1J1bGVDcmVhdGVkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEjUKCG9wc190eXBlGAIgASgOMhouYnVja2V0ZWVyLmF1dG9vcHMuT3BzVHlwZVIHb3BzVHlwZRIzCgdjbGF1c2VzGAMgAygLMhkuYnVja2V0ZWVyLmF1dG9vcHMuQ2xhdXNlUgdjbGF1c2VzEiEKDHRyaWdnZXJlZF9hdBgEIAEoA1ILdHJpZ2dlcmVkQXQSHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdCIZChdBdXRvT3BzUnVsZURlbGV0ZWRFdmVudCJXCh5BdXRvT3BzUnVsZU9wc1R5cGVDaGFuZ2VkRXZlbnQSNQoIb3BzX3R5cGUYASABKA4yGi5idWNrZXRlZXIuYXV0b29wcy5PcHNUeXBlUgdvcHNUeXBlIiQKIkF1dG9PcHNSdWxlVHJpZ2dlcmVkQXRDaGFuZ2VkRXZlbnQilQEKHE9wc0V2ZW50UmF0ZUNsYXVzZUFkZGVkRXZlbnQSGwoJY2xhdXNlX2lkGAEgASgJUghjbGF1c2VJZBJYChVvcHNfZXZlbnRfcmF0ZV9jbGF1c2UYAiABKAsyJS5idWNrZXRlZXIuYXV0b29wcy5PcHNFdmVudFJhdGVDbGF1c2VSEm9wc0V2ZW50UmF0ZUNsYXVzZSKXAQoeT3BzRXZlbnRSYXRlQ2xhdXNlQ2hhbmdlZEV2ZW50EhsKCWNsYXVzZV9pZBgBIAEoCVIIY2xhdXNlSWQSWAoVb3BzX2V2ZW50X3JhdGVfY2xhdXNlGAIgASgLMiUuYnVja2V0ZWVyLmF1dG9vcHMuT3BzRXZlbnRSYXRlQ2xhdXNlUhJvcHNFdmVudFJhdGVDbGF1c2UiPAodQXV0b09wc1J1bGVDbGF1c2VEZWxldGVkRXZlbnQSGwoJY2xhdXNlX2lkGAEgASgJUghjbGF1c2VJZCKDAQoYRGF0ZXRpbWVDbGF1c2VBZGRlZEV2ZW50EhsKCWNsYXVzZV9pZBgBIAEoCVIIY2xhdXNlSWQSSgoPZGF0ZXRpbWVfY2xhdXNlGAIgASgLMiEuYnVja2V0ZWVyLmF1dG9vcHMuRGF0ZXRpbWVDbGF1c2VSDmRhdGV0aW1lQ2xhdXNlIoUBChpEYXRldGltZUNsYXVzZUNoYW5nZWRFdmVudBIbCgljbGF1c2VfaWQYASABKAlSCGNsYXVzZUlkEkoKD2RhdGV0aW1lX2NsYXVzZRgCIAEoCzIhLmJ1Y2tldGVlci5hdXRvb3BzLkRhdGV0aW1lQ2xhdXNlUg5kYXRldGltZUNsYXVzZSJaChBQdXNoQ3JlYXRlZEV2ZW50Eh4KC2ZjbV9hcGlfa2V5GAIgASgJUglmY21BcGlLZXkSEgoEdGFncxgDIAMoCVIEdGFncxISCgRuYW1lGAQgASgJUgRuYW1lIhIKEFB1c2hEZWxldGVkRXZlbnQiKAoSUHVzaFRhZ3NBZGRlZEV2ZW50EhIKBHRhZ3MYAiADKAlSBHRhZ3MiKgoUUHVzaFRhZ3NEZWxldGVkRXZlbnQSEgoEdGFncxgCIAMoCVIEdGFncyImChBQdXNoUmVuYW1lZEV2ZW50EhIKBG5hbWUYAiABKAlSBG5hbWUiwwEKGFN1YnNjcmlwdGlvbkNyZWF0ZWRFdmVudBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcxI/CglyZWNpcGllbnQYAiABKAsyIS5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlY2lwaWVudFIJcmVjaXBpZW50EhIKBG5hbWUYAyABKAlSBG5hbWUiGgoYU3Vic2NyaXB0aW9uRGVsZXRlZEV2ZW50IhoKGFN1YnNjcmlwdGlvbkVuYWJsZWRFdmVudCIbChlTdWJzY3JpcHRpb25EaXNhYmxlZEV2ZW50IncKIVN1YnNjcmlwdGlvblNvdXJjZVR5cGVzQWRkZWRFdmVudBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcyJ5CiNTdWJzY3JpcHRpb25Tb3VyY2VUeXBlc0RlbGV0ZWRFdmVudBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcyIuChhTdWJzY3JpcHRpb25SZW5hbWVkRXZlbnQSEgoEbmFtZRgBIAEoCVIEbmFtZSLIAQodQWRtaW5TdWJzY3JpcHRpb25DcmVhdGVkRXZlbnQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMSPwoJcmVjaXBpZW50GAIgASgLMiEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZWNpcGllbnRSCXJlY2lwaWVudBISCgRuYW1lGAMgASgJUgRuYW1lIh8KHUFkbWluU3Vic2NyaXB0aW9uRGVsZXRlZEV2ZW50Ih8KHUFkbWluU3Vic2NyaXB0aW9uRW5hYmxlZEV2ZW50IiAKHkFkbWluU3Vic2NyaXB0aW9uRGlzYWJsZWRFdmVudCJ8CiZBZG1pblN1YnNjcmlwdGlvblNvdXJjZVR5cGVzQWRkZWRFdmVudBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcyJ+CihBZG1pblN1YnNjcmlwdGlvblNvdXJjZVR5cGVzRGVsZXRlZEV2ZW50ElIKDHNvdXJjZV90eXBlcxgBIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzIjMKHUFkbWluU3Vic2NyaXB0aW9uUmVuYW1lZEV2ZW50EhIKBG5hbWUYASABKAlSBG5hbWUiiwIKE1Byb2plY3RDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhIaCghkaXNhYmxlZBgDIAEoCFIIZGlzYWJsZWQSFAoFdHJpYWwYBCABKAhSBXRyaWFsEiMKDWNyZWF0b3JfZW1haWwYBSABKAlSDGNyZWF0b3JFbWFpbBIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0EhIKBG5hbWUYCCABKAlSBG5hbWUSGQoIdXJsX2NvZGUYCSABKAlSB3VybENvZGUiUgoeUHJvamVjdERlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iOQoTUHJvamVjdFJlbmFtZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSIlChNQcm9qZWN0RW5hYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCImChRQcm9qZWN0RGlzYWJsZWRFdmVudBIOCgJpZBgBIAEoCVICaWQikAIKGFByb2plY3RUcmlhbENyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEhoKCGRpc2FibGVkGAMgASgIUghkaXNhYmxlZBIUCgV0cmlhbBgEIAEoCFIFdHJpYWwSIwoNY3JlYXRvcl9lbWFpbBgFIAEoCVIMY3JlYXRvckVtYWlsEh0KCmNyZWF0ZWRfYXQYBiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSEgoEbmFtZRgIIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgJIAEoCVIHdXJsQ29kZSIsChpQcm9qZWN0VHJpYWxDb252ZXJ0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiXQoWUHJlcmVxdWlzaXRlQWRkZWRFdmVudBJDCgxwcmVyZXF1aXNpdGUYASABKAsyHy5idWNrZXRlZXIuZmVhdHVyZS5QcmVyZXF1aXNpdGVSDHByZXJlcXVpc2l0ZSJoCiFQcmVyZXF1aXNpdGVWYXJpYXRpb25DaGFuZ2VkRXZlbnQSQwoMcHJlcmVxdWlzaXRlGAEgASgLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUgxwcmVyZXF1aXNpdGUiOQoYUHJlcmVxdWlzaXRlUmVtb3ZlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZCL7AQoeUHJvZ3Jlc3NpdmVSb2xsb3V0Q3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSLAoGY2xhdXNlGAMgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIGY2xhdXNlEh0KCmNyZWF0ZWRfYXQYBCABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAUgASgDUgl1cGRhdGVkQXQSPgoEdHlwZRgGIAEoDjIqLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5UeXBlUgR0eXBlIuUBCh5Qcm9ncmVzc2l2ZVJvbGxvdXRTdG9wcGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEkQKBnN0YXR1cxgCIAEoDjIsLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5TdGF0dXNSBnN0YXR1cxJOCgpzdG9wcGVkX2J5GAMgASgOMi8uYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlN0b3BwZWRCeVIJc3RvcHBlZEJ5Eh0KCnN0b3BwZWRfYXQYBCABKANSCXN0b3BwZWRBdCIwCh5Qcm9ncmVzc2l2ZVJvbGxvdXREZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIlQKMVByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlVHJpZ2dlcmVkQXRDaGFuZ2VkRXZlbnQSHwoLc2NoZWR1bGVfaWQYASABKAlSCnNjaGVkdWxlSWQihwIKGE9yZ2FuaXphdGlvbkNyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgDIAEoCVIHdXJsQ29kZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SGgoIZGlzYWJsZWQYBSABKAhSCGRpc2FibGVkEhoKCGFyY2hpdmVkGAYgASgIUghhcmNoaXZlZBIUCgV0cmlhbBgHIAEoCFIFdHJpYWwSHQoKY3JlYXRlZF9hdBgIIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCSABKANSCXVwZGF0ZWRBdCJXCiNPcmdhbml6YXRpb25EZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uIkIKHE9yZ2FuaXphdGlvbk5hbWVDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiKgoYT3JnYW5pemF0aW9uRW5hYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCIrChlPcmdhbml6YXRpb25EaXNhYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCIrChlPcmdhbml6YXRpb25BcmNoaXZlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCItChtPcmdhbml6YXRpb25VbmFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkIjEKH09yZ2FuaXphdGlvblRyaWFsQ29udmVydGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIusCChdGbGFnVHJpZ2dlckNyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgDIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USNwoEdHlwZRgEIAEoDjIjLmJ1Y2tldGVlci5mZWF0dXJlLkZsYWdUcmlnZ2VyLlR5cGVSBHR5cGUSPQoGYWN0aW9uGAUgASgOMiUuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuQWN0aW9uUgZhY3Rpb24SIAoLZGVzY3JpcHRpb24YBiABKAlSC2Rlc2NyaXB0aW9uEhQKBXRva2VuGAcgASgJUgV0b2tlbhIdCgpjcmVhdGVkX2F0GAggASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgJIAEoA1IJdXBkYXRlZEF0IpEBChVGbGFnVHJpZ2dlclJlc2V0RXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYAyABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEhQKBXRva2VuGAQgASgJUgV0b2tlbiKqAQoiRmxhZ1RyaWdnZXJEZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgDIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uIn4KGEZsYWdUcmlnZ2VyRGlzYWJsZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgDIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2UifQoXRmxhZ1RyaWdnZXJFbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYAyABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlIn0KF0ZsYWdUcmlnZ2VyRGVsZXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAMgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZSLTAQocRmxhZ1RyaWdnZXJVc2FnZVVwZGF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgDIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USKgoRbGFzdF90cmlnZ2VyZWRfYXQYBCABKANSD2xhc3RUcmlnZ2VyZWRBdBIjCg10cmlnZ2VyX3RpbWVzGAUgASgFUgx0cmlnZ2VyVGltZXNCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50L2RvbWFpbmIGcHJvdG8zCsoBCipwcm90by9ldmVudC9kb21haW4vbG9jYWxpemVkX21lc3NhZ2UucHJvdG8SFmJ1Y2tldGVlci5ldmVudC5kb21haW4iRAoQTG9jYWxpemVkTWVzc2FnZRIWCgZsb2NhbGUYASABKAlSBmxvY2FsZRIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlQjZaNGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9ldmVudC9kb21haW5iBnByb3RvMwqnBQodcHJvdG8vYXVkaXRsb2cvYXVkaXRsb2cucHJvdG8SEmJ1Y2tldGVlci5hdWRpdGxvZxoZZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90bxoecHJvdG8vZXZlbnQvZG9tYWluL2V2ZW50LnByb3RvGipwcm90by9ldmVudC9kb21haW4vbG9jYWxpemVkX21lc3NhZ2UucHJvdG8izgMKCEF1ZGl0TG9nEg4KAmlkGAEgASgJUgJpZBIcCgl0aW1lc3RhbXAYAiABKANSCXRpbWVzdGFtcBJJCgtlbnRpdHlfdHlwZRgDIAEoDjIoLmJ1Y2tldGVlci5ldmVudC5kb21haW4uRXZlbnQuRW50aXR5VHlwZVIKZW50aXR5VHlwZRIbCgllbnRpdHlfaWQYBCABKAlSCGVudGl0eUlkEjYKBHR5cGUYBSABKA4yIi5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkV2ZW50LlR5cGVSBHR5cGUSKgoFZXZlbnQYBiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgVldmVudBI2CgZlZGl0b3IYByABKAsyHi5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkVkaXRvclIGZWRpdG9yEjkKB29wdGlvbnMYCCABKAsyHy5idWNrZXRlZXIuZXZlbnQuZG9tYWluLk9wdGlvbnNSB29wdGlvbnMSVQoRbG9jYWxpemVkX21lc3NhZ2UYCSABKAsyKC5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkxvY2FsaXplZE1lc3NhZ2VSEGxvY2FsaXplZE1lc3NhZ2VCMlowZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1ZGl0bG9nYgZwcm90bzMKsBMKHHByb3RvL2F1ZGl0bG9nL3NlcnZpY2UucHJvdG8SEmJ1Y2tldGVlci5hdWRpdGxvZxoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGh1wcm90by9hdWRpdGxvZy9hdWRpdGxvZy5wcm90byKEBAoUTGlzdEF1ZGl0TG9nc1JlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYAyABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEksKCG9yZGVyX2J5GAQgASgOMjAuYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RBdWRpdExvZ3NSZXF1ZXN0Lk9yZGVyQnlSB29yZGVyQnkSYAoPb3JkZXJfZGlyZWN0aW9uGAUgASgOMjcuYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RBdWRpdExvZ3NSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5zZWFyY2hfa2V5d29yZBgGIAEoCVINc2VhcmNoS2V5d29yZBISCgRmcm9tGAcgASgDUgRmcm9tEg4KAnRvGAggASgDUgJ0bxI8CgtlbnRpdHlfdHlwZRgJIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUgplbnRpdHlUeXBlIiUKB09yZGVyQnkSCwoHREVGQVVMVBAAEg0KCVRJTUVTVEFNUBABIiMKDk9yZGVyRGlyZWN0aW9uEggKBERFU0MQABIHCgNBU0MQASKNAQoVTGlzdEF1ZGl0TG9nc1Jlc3BvbnNlEjsKCmF1ZGl0X2xvZ3MYASADKAsyHC5idWNrZXRlZXIuYXVkaXRsb2cuQXVkaXRMb2dSCWF1ZGl0TG9ncxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCLeAwoZTGlzdEFkbWluQXVkaXRMb2dzUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yElAKCG9yZGVyX2J5GAMgASgOMjUuYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RBZG1pbkF1ZGl0TG9nc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJlCg9vcmRlcl9kaXJlY3Rpb24YBCABKA4yPC5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEFkbWluQXVkaXRMb2dzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBSABKAlSDXNlYXJjaEtleXdvcmQSEgoEZnJvbRgGIAEoA1IEZnJvbRIOCgJ0bxgHIAEoA1ICdG8SPAoLZW50aXR5X3R5cGUYCCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIKZW50aXR5VHlwZSIlCgdPcmRlckJ5EgsKB0RFRkFVTFQQABINCglUSU1FU1RBTVAQASIjCg5PcmRlckRpcmVjdGlvbhIICgRERVNDEAASBwoDQVNDEAEikgEKGkxpc3RBZG1pbkF1ZGl0TG9nc1Jlc3BvbnNlEjsKCmF1ZGl0X2xvZ3MYASADKAsyHC5idWNrZXRlZXIuYXVkaXRsb2cuQXVkaXRMb2dSCWF1ZGl0TG9ncxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCL0AwoZTGlzdEZlYXR1cmVIaXN0b3J5UmVxdWVzdBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSGwoJcGFnZV9zaXplGAIgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYBCABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlElAKCG9yZGVyX2J5GAUgASgOMjUuYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RGZWF0dXJlSGlzdG9yeVJlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJlCg9vcmRlcl9kaXJlY3Rpb24YBiABKA4yPC5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEZlYXR1cmVIaXN0b3J5UmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYByABKAlSDXNlYXJjaEtleXdvcmQSEgoEZnJvbRgIIAEoA1IEZnJvbRIOCgJ0bxgJIAEoA1ICdG8iJQoHT3JkZXJCeRILCgdERUZBVUxUEAASDQoJVElNRVNUQU1QEAEiIwoOT3JkZXJEaXJlY3Rpb24SCAoEREVTQxAAEgcKA0FTQxABIpIBChpMaXN0RmVhdHVyZUhpc3RvcnlSZXNwb25zZRI7CgphdWRpdF9sb2dzGAEgAygLMhwuYnVja2V0ZWVyLmF1ZGl0bG9nLkF1ZGl0TG9nUglhdWRpdExvZ3MSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQy5wIKD0F1ZGl0TG9nU2VydmljZRJmCg1MaXN0QXVkaXRMb2dzEiguYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RBdWRpdExvZ3NSZXF1ZXN0GikuYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RBdWRpdExvZ3NSZXNwb25zZSIAEnUKEkxpc3RBZG1pbkF1ZGl0TG9ncxItLmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0QWRtaW5BdWRpdExvZ3NSZXF1ZXN0Gi4uYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RBZG1pbkF1ZGl0TG9nc1Jlc3BvbnNlIgASdQoSTGlzdEZlYXR1cmVIaXN0b3J5Ei0uYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RGZWF0dXJlSGlzdG9yeVJlcXVlc3QaLi5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEZlYXR1cmVIaXN0b3J5UmVzcG9uc2UiAEIyWjBnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXVkaXRsb2diBnByb3RvMw== -service: - externalPort: 9000 -ingress: - host: - staticIPName: -health: - livenessProbe: - initialDelaySeconds: 10 - periodSeconds: 3 - failureThreshold: 5 - readinessProbe: - initialDelaySeconds: 10 - periodSeconds: 3 - failureThreshold: 2 -resources: {} -affinity: {} -nodeSelector: {} -pdb: - enabled: - maxUnavailable: 50% -hpa: - enabled: - minReplicas: - maxReplicas: - metrics: - cpu: - targetAverageUtilization: -tolerations: [] -serviceAccount: - annotations: {} From 42c5ccac2bfd1bc2ebc2fd9f6b74934d4a2e17ae Mon Sep 17 00:00:00 2001 From: Alessandro Yuichi Okimoto Date: Fri, 2 Feb 2024 14:41:16 +0900 Subject: [PATCH 2/3] chore: change execute progressive rollout condition Signed-off-by: Alessandro Yuichi Okimoto --- pkg/autoops/api/error.go | 4 + pkg/autoops/api/progressive_rollout.go | 59 ++++++- .../api/progressive_rollout_operation.go | 148 +++++------------- .../api/progressive_rollout_operation_test.go | 66 +------- pkg/autoops/domain/progressive_rollout.go | 4 + test/e2e/autoops/auto_ops_test.go | 12 ++ test/e2e/autoops/progressive_rollout_test.go | 18 ++- 7 files changed, 131 insertions(+), 180 deletions(-) diff --git a/pkg/autoops/api/error.go b/pkg/autoops/api/error.go index dc9e4e00f5..0b830710aa 100644 --- a/pkg/autoops/api/error.go +++ b/pkg/autoops/api/error.go @@ -92,6 +92,10 @@ var ( codes.Internal, "autoops: internal error occurs for a progressive rollout", ) + statusProgressiveRolloutAlreadyStopped = gstatus.New( + codes.Internal, + "autoops: progressive rollout is already stopped", + ) statusProgressiveRolloutClauseVariationIDRequired = gstatus.New( codes.InvalidArgument, "autoops: clause variation id must be specified for a progressive rollout", diff --git a/pkg/autoops/api/progressive_rollout.go b/pkg/autoops/api/progressive_rollout.go index 9a84f51b2c..8f3266eeb6 100644 --- a/pkg/autoops/api/progressive_rollout.go +++ b/pkg/autoops/api/progressive_rollout.go @@ -28,6 +28,7 @@ import ( "github.com/bucketeer-io/bucketeer/pkg/autoops/command" "github.com/bucketeer-io/bucketeer/pkg/autoops/domain" v2as "github.com/bucketeer-io/bucketeer/pkg/autoops/storage/v2" + ftstorage "github.com/bucketeer-io/bucketeer/pkg/feature/storage/v2" "github.com/bucketeer-io/bucketeer/pkg/locale" "github.com/bucketeer-io/bucketeer/pkg/log" "github.com/bucketeer-io/bucketeer/pkg/storage/v2/mysql" @@ -435,6 +436,23 @@ func (s *AutoOpsService) ExecuteProgressiveRollout( if err != nil { return err } + ftStorage := ftstorage.NewFeatureStorage(tx) + feature, err := ftStorage.GetFeature(ctx, progressiveRollout.FeatureId, req.EnvironmentNamespace) + if err != nil { + return err + } + if err := s.checkStopStatus(progressiveRollout, localizer); err != nil { + s.logger.Error( + "Failed to execute progressive rollout", + log.FieldsFromImcomingContext(ctx).AddFields( + zap.Error(err), + zap.String("environmentNamespace", req.EnvironmentNamespace), + zap.String("id", progressiveRollout.Id), + zap.String("featureId", progressiveRollout.FeatureId), + )..., + ) + return err + } triggered, err := s.checkAlreadyTriggered( req.ChangeProgressiveRolloutTriggeredAtCommand, progressiveRollout, @@ -453,6 +471,12 @@ func (s *AutoOpsService) ExecuteProgressiveRollout( ) return nil } + // Enable the flag if it is disabled and it is the first rollout execution + if !feature.Enabled && progressiveRollout.Status == autoopsproto.ProgressiveRollout_WAITING { + if err := feature.Enable(); err != nil { + return err + } + } handler := command.NewProgressiveRolloutCommandHandler( editor, progressiveRollout, @@ -465,13 +489,28 @@ func (s *AutoOpsService) ExecuteProgressiveRollout( if err := storage.UpdateProgressiveRollout(ctx, progressiveRollout, req.EnvironmentNamespace); err != nil { return err } - return ExecuteProgressiveRolloutOperation( + if err := ExecuteProgressiveRolloutOperation( ctx, progressiveRollout, - s.featureClient, + feature, req.ChangeProgressiveRolloutTriggeredAtCommand.ScheduleId, req.EnvironmentNamespace, - ) + ); err != nil { + return err + } + if err := ftStorage.UpdateFeature(ctx, feature, req.EnvironmentNamespace); err != nil { + s.logger.Error( + "Failed to update feature flag", + log.FieldsFromImcomingContext(ctx).AddFields( + zap.Error(err), + zap.String("environmentNamespace", req.EnvironmentNamespace), + zap.String("id", progressiveRollout.Id), + zap.String("featureId", progressiveRollout.FeatureId), + )..., + ) + return err + } + return nil }) if err != nil { s.logger.Error( @@ -503,6 +542,20 @@ func (s *AutoOpsService) ExecuteProgressiveRollout( return &autoopsproto.ExecuteProgressiveRolloutResponse{}, nil } +func (s *AutoOpsService) checkStopStatus(p *domain.ProgressiveRollout, localizer locale.Localizer) error { + if p.IsStopped() { + dt, err := statusProgressiveRolloutAlreadyStopped.WithDetails(&errdetails.LocalizedMessage{ + Locale: localizer.GetLocale(), + Message: localizer.MustLocalize(locale.InternalServerError), + }) + if err != nil { + return statusProgressiveRolloutInternal.Err() + } + return dt.Err() + } + return nil +} + func (s *AutoOpsService) checkAlreadyTriggered( cmd *autoopsproto.ChangeProgressiveRolloutScheduleTriggeredAtCommand, p *domain.ProgressiveRollout, diff --git a/pkg/autoops/api/progressive_rollout_operation.go b/pkg/autoops/api/progressive_rollout_operation.go index adf9e09675..46fefabb76 100644 --- a/pkg/autoops/api/progressive_rollout_operation.go +++ b/pkg/autoops/api/progressive_rollout_operation.go @@ -21,7 +21,7 @@ import ( "github.com/golang/protobuf/ptypes" "github.com/bucketeer-io/bucketeer/pkg/autoops/domain" - featureclient "github.com/bucketeer-io/bucketeer/pkg/feature/client" + ftdomain "github.com/bucketeer-io/bucketeer/pkg/feature/domain" autoopsproto "github.com/bucketeer-io/bucketeer/proto/autoops" featureproto "github.com/bucketeer-io/bucketeer/proto/feature" ) @@ -33,159 +33,87 @@ const totalVariationWeight = int32(100000) func ExecuteProgressiveRolloutOperation( ctx context.Context, progressiveRollout *domain.ProgressiveRollout, - featureClient featureclient.Client, + feature *ftdomain.Feature, scheduleID, environmentNamespace string, ) error { + var variationID string + var weight int32 switch progressiveRollout.Type { case autoopsproto.ProgressiveRollout_MANUAL_SCHEDULE: c := &autoopsproto.ProgressiveRolloutManualScheduleClause{} if err := ptypes.UnmarshalAny(progressiveRollout.Clause, c); err != nil { return err } - s, err := getTargetSchedule(c.Schedules, scheduleID) + variationID = c.VariationId + var err error + weight, err = getTargetWeight(c.Schedules, scheduleID) if err != nil { return err } - if err := updateRolloutStrategy( - ctx, - s, - featureClient, - c.VariationId, - progressiveRollout.FeatureId, - environmentNamespace, - ); err != nil { - return err - } case autoopsproto.ProgressiveRollout_TEMPLATE_SCHEDULE: c := &autoopsproto.ProgressiveRolloutTemplateScheduleClause{} if err := ptypes.UnmarshalAny(progressiveRollout.Clause, c); err != nil { return err } - s, err := getTargetSchedule(c.Schedules, scheduleID) + variationID = c.VariationId + var err error + weight, err = getTargetWeight(c.Schedules, scheduleID) if err != nil { return err } - if err := updateRolloutStrategy( - ctx, - s, - featureClient, - c.VariationId, - progressiveRollout.FeatureId, - environmentNamespace, - ); err != nil { - return err - } default: return domain.ErrProgressiveRolloutInvalidType } + if err := updateRolloutStrategy( + ctx, + weight, + feature, + variationID, + progressiveRollout.FeatureId, + environmentNamespace, + ); err != nil { + return err + } return nil } -func getTargetSchedule( +func getTargetWeight( schedules []*autoopsproto.ProgressiveRolloutSchedule, scheduleID string, -) (*autoopsproto.ProgressiveRolloutSchedule, error) { +) (int32, error) { for _, s := range schedules { if s.ScheduleId == scheduleID { - return s, nil + return s.Weight, nil } } - return nil, domain.ErrProgressiveRolloutScheduleNotFound + return 0, domain.ErrProgressiveRolloutScheduleNotFound } func updateRolloutStrategy( ctx context.Context, - schedule *autoopsproto.ProgressiveRolloutSchedule, - featureClient featureclient.Client, + weight int32, + feature *ftdomain.Feature, targetVariationID, featureID, environmentNamespace string, ) error { - f, err := fetchFeature(ctx, featureClient, featureID, environmentNamespace) + variations, err := getRolloutStrategyVariations(feature, weight, targetVariationID) if err != nil { return err } - if err := updateFeatureTargeting( - ctx, - schedule, - featureClient, - f, - targetVariationID, - environmentNamespace, - ); err != nil { - return err - } - return nil -} - -func fetchFeature( - ctx context.Context, - featureClient featureclient.Client, - featureID, environmentNamespace string, -) (*featureproto.Feature, error) { - resp, err := featureClient.GetFeature(ctx, &featureproto.GetFeatureRequest{ - EnvironmentNamespace: environmentNamespace, - Id: featureID, - }) - if err != nil { - return nil, err - } - return resp.Feature, nil -} - -func updateFeatureTargeting( - ctx context.Context, - schedule *autoopsproto.ProgressiveRolloutSchedule, - featureClient featureclient.Client, - feature *featureproto.Feature, - targetVariationID, environmentNamespace string, -) error { - c, err := getChangeDefaultStrategyCmd(feature, schedule, targetVariationID) - if err != nil { - return err - } - _, err = featureClient.UpdateFeatureTargeting( - ctx, - &featureproto.UpdateFeatureTargetingRequest{ - EnvironmentNamespace: environmentNamespace, - Id: feature.Id, - Commands: []*featureproto.Command{c}, - From: featureproto.UpdateFeatureTargetingRequest_OPS, + strategy := &featureproto.Strategy{ + Type: featureproto.Strategy_ROLLOUT, + RolloutStrategy: &featureproto.RolloutStrategy{ + Variations: variations, }, - ) - if err != nil { + } + if err := feature.ChangeDefaultStrategy(strategy); err != nil { return err } return nil } -func getChangeDefaultStrategyCmd( - feature *featureproto.Feature, - schedule *autoopsproto.ProgressiveRolloutSchedule, - targetVariationID string, -) (*featureproto.Command, error) { - variations, err := getRolloutStrategyVariations(feature, schedule, targetVariationID) - if err != nil { - return nil, err - } - c := &featureproto.ChangeDefaultStrategyCommand{ - Strategy: &featureproto.Strategy{ - Type: featureproto.Strategy_ROLLOUT, - RolloutStrategy: &featureproto.RolloutStrategy{ - Variations: variations, - }, - }, - } - ac, err := ptypes.MarshalAny(c) - if err != nil { - return nil, err - } - return &featureproto.Command{ - Command: ac, - }, nil -} - func getRolloutStrategyVariations( - feature *featureproto.Feature, - schedule *autoopsproto.ProgressiveRolloutSchedule, + feature *ftdomain.Feature, + weight int32, targetVariationID string, ) ([]*featureproto.RolloutStrategy_Variation, error) { nonTargetVariationID, err := findNonTargetVariationID(feature, targetVariationID) @@ -195,17 +123,17 @@ func getRolloutStrategyVariations( return []*featureproto.RolloutStrategy_Variation{ { Variation: targetVariationID, - Weight: schedule.Weight, + Weight: weight, }, { Variation: nonTargetVariationID, - Weight: totalVariationWeight - schedule.Weight, + Weight: totalVariationWeight - weight, }, }, nil } func findNonTargetVariationID( - feature *featureproto.Feature, + feature *ftdomain.Feature, variationID string, ) (string, error) { for _, v := range feature.Variations { diff --git a/pkg/autoops/api/progressive_rollout_operation_test.go b/pkg/autoops/api/progressive_rollout_operation_test.go index 82b28b8336..463915622c 100644 --- a/pkg/autoops/api/progressive_rollout_operation_test.go +++ b/pkg/autoops/api/progressive_rollout_operation_test.go @@ -15,14 +15,11 @@ package api import ( - "context" "testing" "github.com/stretchr/testify/assert" - "go.uber.org/mock/gomock" - featureclientmock "github.com/bucketeer-io/bucketeer/pkg/feature/client/mock" - "github.com/bucketeer-io/bucketeer/proto/autoops" + ftdomain "github.com/bucketeer-io/bucketeer/pkg/feature/domain" featureproto "github.com/bucketeer-io/bucketeer/proto/feature" ) @@ -89,66 +86,13 @@ func TestGetRolloutStrategyVariations(t *testing.T) { } for _, p := range patterns { t.Run(p.desc, func(t *testing.T) { - actual, err := getRolloutStrategyVariations(p.feature, &autoops.ProgressiveRolloutSchedule{ - Weight: p.targetWeight, - }, p.targetVariationID) - assert.Equal(t, p.expectedErr, err) - assert.Equal(t, p.expected, actual) - }) - } -} - -func TestUpdateFeatureTargeting(t *testing.T) { - t.Parallel() - ctx := context.TODO() - mockController := gomock.NewController(t) - environmentNamespace := "en" - fID := "fid-1" - patterns := []struct { - desc string - setup func(*featureclientmock.MockClient) - feature *featureproto.Feature - targetVariationID string - targetWeight int32 - expectedErr error - }{ - { - desc: "success: weight is max", - setup: func(mock *featureclientmock.MockClient) { - mock.EXPECT().UpdateFeatureTargeting(gomock.Any(), gomock.Any()).Return(nil, nil) - }, - feature: &featureproto.Feature{ - Id: fID, - Variations: []*featureproto.Variation{ - { - Id: "vid-1", - }, - { - Id: "vid-2", - }, - }, - }, - targetVariationID: "vid-1", - targetWeight: totalVariationWeight, - }, - } - for _, p := range patterns { - t.Run(p.desc, func(t *testing.T) { - featureClientMock := featureclientmock.NewMockClient(mockController) - if p.setup != nil { - p.setup(featureClientMock) - } - err := updateFeatureTargeting( - ctx, - &autoops.ProgressiveRolloutSchedule{ - Weight: p.targetWeight, - }, - featureClientMock, - p.feature, + actual, err := getRolloutStrategyVariations( + &ftdomain.Feature{Feature: p.feature}, + p.targetWeight, p.targetVariationID, - environmentNamespace, ) assert.Equal(t, p.expectedErr, err) + assert.Equal(t, p.expected, actual) }) } } diff --git a/pkg/autoops/domain/progressive_rollout.go b/pkg/autoops/domain/progressive_rollout.go index 80d753b465..0bbb5aa297 100644 --- a/pkg/autoops/domain/progressive_rollout.go +++ b/pkg/autoops/domain/progressive_rollout.go @@ -106,6 +106,10 @@ func (p *ProgressiveRollout) setClause(c protoiface.MessageV1) error { return nil } +func (p *ProgressiveRollout) IsStopped() bool { + return p.Status == autoopsproto.ProgressiveRollout_STOPPED +} + func (p *ProgressiveRollout) IsFinished() bool { return p.Status == autoopsproto.ProgressiveRollout_FINISHED } diff --git a/test/e2e/autoops/auto_ops_test.go b/test/e2e/autoops/auto_ops_test.go index d070224479..af1a3753fa 100644 --- a/test/e2e/autoops/auto_ops_test.go +++ b/test/e2e/autoops/auto_ops_test.go @@ -526,6 +526,18 @@ func createFeature(ctx context.Context, t *testing.T, client featureclient.Clien enableFeature(t, featureID, client) } +func createDisabledFeature(ctx context.Context, t *testing.T, client featureclient.Client, featureID string) { + t.Helper() + cmd := newCreateFeatureCommand(featureID) + createReq := &featureproto.CreateFeatureRequest{ + Command: cmd, + EnvironmentNamespace: *environmentNamespace, + } + if _, err := client.CreateFeature(ctx, createReq); err != nil { + t.Fatal(err) + } +} + func getFeature(t *testing.T, client featureclient.Client, featureID string) *featureproto.Feature { t.Helper() getReq := &featureproto.GetFeatureRequest{ diff --git a/test/e2e/autoops/progressive_rollout_test.go b/test/e2e/autoops/progressive_rollout_test.go index 883caaab10..6f937518fe 100644 --- a/test/e2e/autoops/progressive_rollout_test.go +++ b/test/e2e/autoops/progressive_rollout_test.go @@ -43,7 +43,7 @@ func TestCreateAndListProgressiveRollout(t *testing.T) { defer featureClient.Close() featureID := createFeatureID(t) - createFeature(ctx, t, featureClient, featureID) + createDisabledFeature(ctx, t, featureClient, featureID) feature := getFeature(t, featureClient, featureID) schedules := createProgressiveRolloutSchedule() createProgressiveRollout( @@ -90,7 +90,7 @@ func TestGetProgressiveRollout(t *testing.T) { defer featureClient.Close() featureID := createFeatureID(t) - createFeature(ctx, t, featureClient, featureID) + createDisabledFeature(ctx, t, featureClient, featureID) feature := getFeature(t, featureClient, featureID) schedules := createProgressiveRolloutSchedule() createProgressiveRollout( @@ -137,7 +137,7 @@ func TestStopProgressiveRollout(t *testing.T) { defer featureClient.Close() featureID := createFeatureID(t) - createFeature(ctx, t, featureClient, featureID) + createDisabledFeature(ctx, t, featureClient, featureID) feature := getFeature(t, featureClient, featureID) schedules := createProgressiveRolloutSchedule() createProgressiveRollout( @@ -176,7 +176,7 @@ func TestDeleteProgressiveRollout(t *testing.T) { defer featureClient.Close() featureID := createFeatureID(t) - createFeature(ctx, t, featureClient, featureID) + createDisabledFeature(ctx, t, featureClient, featureID) feature := getFeature(t, featureClient, featureID) schedules := createProgressiveRolloutSchedule() createProgressiveRollout( @@ -220,7 +220,7 @@ func TestExecuteProgressiveRollout(t *testing.T) { defer featureClient.Close() featureID := createFeatureID(t) - createFeature(ctx, t, featureClient, featureID) + createDisabledFeature(ctx, t, featureClient, featureID) feature := getFeature(t, featureClient, featureID) schedules := createProgressiveRolloutSchedule() createProgressiveRollout( @@ -262,6 +262,9 @@ func TestExecuteProgressiveRollout(t *testing.T) { }, }, } + if !feature.Enabled { + t.Fatalf("Flag shouldn't be disabled at this point") + } if !proto.Equal(feature.DefaultStrategy.RolloutStrategy, expectedStrategy) { t.Fatalf("Strategy is not equal. Expected: %s actual: %s", expectedStrategy, feature.Rules[0].Strategy.RolloutStrategy) } @@ -291,7 +294,7 @@ func TestProgressiveRolloutBatch(t *testing.T) { defer featureClient.Close() featureID := createFeatureID(t) - createFeature(ctx, t, featureClient, featureID) + createDisabledFeature(ctx, t, featureClient, featureID) feature := getFeature(t, featureClient, featureID) now := time.Now() schedules := []*autoopsproto.ProgressiveRolloutSchedule{ @@ -338,6 +341,9 @@ func TestProgressiveRolloutBatch(t *testing.T) { if !proto.Equal(feature.DefaultStrategy.RolloutStrategy, expectedStrategy) { continue } + if !feature.Enabled { + t.Fatalf("Flag shouldn't be disabled at this point") + } actual := listProgressiveRollouts(t, autoOpsClient, featureID) if actual[0].Status != autoopsproto.ProgressiveRollout_FINISHED { t.Fatalf("different status, expected: %v, actual: %v", actual[0].Status, autoopsproto.ProgressiveRollout_FINISHED) From 48b4caf5187117123dbee8faa0e60084845e4646 Mon Sep 17 00:00:00 2001 From: Alessandro Yuichi Okimoto Date: Fri, 2 Feb 2024 16:34:14 +0900 Subject: [PATCH 3/3] refactor: is waiting Signed-off-by: Alessandro Yuichi Okimoto --- pkg/autoops/api/progressive_rollout.go | 2 +- pkg/autoops/domain/progressive_rollout.go | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/autoops/api/progressive_rollout.go b/pkg/autoops/api/progressive_rollout.go index 8f3266eeb6..286b739928 100644 --- a/pkg/autoops/api/progressive_rollout.go +++ b/pkg/autoops/api/progressive_rollout.go @@ -472,7 +472,7 @@ func (s *AutoOpsService) ExecuteProgressiveRollout( return nil } // Enable the flag if it is disabled and it is the first rollout execution - if !feature.Enabled && progressiveRollout.Status == autoopsproto.ProgressiveRollout_WAITING { + if !feature.Enabled && progressiveRollout.IsWaiting() { if err := feature.Enable(); err != nil { return err } diff --git a/pkg/autoops/domain/progressive_rollout.go b/pkg/autoops/domain/progressive_rollout.go index 0bbb5aa297..d94022eb2a 100644 --- a/pkg/autoops/domain/progressive_rollout.go +++ b/pkg/autoops/domain/progressive_rollout.go @@ -106,6 +106,10 @@ func (p *ProgressiveRollout) setClause(c protoiface.MessageV1) error { return nil } +func (p *ProgressiveRollout) IsWaiting() bool { + return p.Status == autoopsproto.ProgressiveRollout_WAITING +} + func (p *ProgressiveRollout) IsStopped() bool { return p.Status == autoopsproto.ProgressiveRollout_STOPPED }